Windows x64中断门提权 R3调用R0函数

这篇具有很好参考价值的文章主要介绍了Windows x64中断门提权 R3调用R0函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

声明:
(1)本篇文章实验针对 未开启内核隔离(KPTI) 的Window10系统
(2)本次实验的实现 并不代表R3调用R0可以完全只由Ring3完成


win10并不使用调用门、陷阱门、任务门,  一律只用中断门,本次实验采用中断门提权实现R3调用R0函数。
没开启KPTI, Cr3始终为内核Cr3。

环境工具

(1) 调式工具:Windbg
(2) 虚拟机:windows10 19044.2846
(3) IDE: VS2019


一、原理分析

1.IDT表、中断描述符

中断:只使用一张IDT表,内核可以根据栈上的CS判断先前模式。

IDT表地址位于KPCR偏移0x38处

nt!_KPCR
+0x038 IdtBase : Ptr64 _KIDTENTRY64

64位中断门描述符:
Windows x64中断门提权 R3调用R0函数

图来自Intel 第3卷 Figure 6-7. 64-Bit IDT Gate Descriptors
参照此图方便后续构造中断门


2.Fs、Gs寄存器

X86:0环时FS指向KPCR,3环时FS指向TEB
X64:0环时GS指向KPCR,3环时GS指向TEB
FSGS的基址在3个MSR寄存器中:
-
IA32_FS_BASE (下标0xC0000100)
IA32_GS_BASE (下标0xC0000101)
IA32_KERNEL_GS_BASE (下标0xC0000102)


3.简单分析3环进0环过程

(1) 分析int 3中断

windbg输入指令: !idt

Windows x64中断门提权 R3调用R0函数
可看到3号中断函数KiBreakpointTrap,这是因为笔者的测试机是未开启KPTI的.
而在开启KPTI时:3号中断函数调用的是KiBreakpointTrapShadow

用IDA对内核文件ntoskrnl.exe的KiBreakpointTrapShadow分析

Windows x64中断门提权 R3调用R0函数
由IDA分析可知,KiBreakpointTrapShadow 只是做了一些调用0环函数前的准备行为,如切换内核Cr3,切换内核rsp,切换内核gs等, 最后跳到了KiBreakpointTrap真正执行中断函数。

而未开启KPTI时,中断函数并不是KiBreakpointTrapShadow而是KiBreakpointTrap,而KiBreakpointTrap中并没有这些进内核的准备行为,笔者猜测进KiBreakpointTrap前肯定还执行过类似的代码, 目前还未查到

后面本人通过构建中断门进行测试发现,进去中断函数时rsp已经切换为0环的rsp, _KTrap_Frame的那5个寄存器也在栈中, cr3本身就是内核cr3 ,不需要改, 但是gs还没修改, 所以我们的构建中断门函数代码里边只用修改gs就可以调用内核函数了


二、代码实现

1.配置项目

1.创建vs空项目, 笔者项目名为IntGate
2.创建main.cpp文件和x64asm.asm文件(asm文件随便创建一个文件后, 将后缀为.asm就行)

3.右键项目->生成依赖性->生成自定义, 第四个打上勾

Windows x64中断门提权 R3调用R0函数
Windows x64中断门提权 R3调用R0函数

4.右键x64asm.asm,按如下图选择

Windows x64中断门提权 R3调用R0函数

5、打开项目属性设置固定基址, 并关闭增量链接

Windows x64中断门提权 R3调用R0函数
Windows x64中断门提权 R3调用R0函数

2.代码实现

代码如下(部分硬编码的地方需要更改):

main.cpp

#include <Windows.h>
#include <stdio.h>

extern "C" void InterruptEntry();
extern "C" void CaseInterrupt();



int main()
{
	printf("InterruptEntry Addr:%p\n", (ULONG64)InterruptEntry);
	// 笔者InterruptEntry为0x0000000140001200
	if ((ULONG64)InterruptEntry != 0x0000000140001200)
	{
		printf("InterruptEntry地址与中断门构建的地址不一样\n");
		system("pause");
		return 0;
	}
	system("pause");

	CaseInterrupt();

	system("pause");
	return 0;
}

x64asm.asm

option casemap:none

.data
pStr db 'I am the DbgPrint func', 0DH, 0AH

.code

InterruptEntry proc
	;切换gs
	swapgs

	;调用DbgPrint函数. 为方便直接用windbg查了之后将函数地址写成硬编码了
	mov rax,0fffff8047e7647b0h
	sub rsp,20h
	lea rcx,[pStr]
	call rax
	add rsp,20h

	; 恢复gs
	swapgs
	iretq
InterruptEntry endp


CaseInterrupt proc
	int 0fh ;f号中断系统未使用
	ret
CaseInterrupt endp


end

windbg配置

1.构建中断门
笔者InterruptEntry地址为0x0000000140001200,中断门属性就填3号中断的属性,地址填0x0000000140001200

 windbg:
 eq idtr+f0 4000ee00`00101200
 eq idtr+f8 00000000`00000001
 !idt f

Windows x64中断门提权 R3调用R0函数

2.设置Cr4寄存器中SMEP和SMAP, 把3去掉就行

Windows x64中断门提权 R3调用R0函数


运行截图

Windows x64中断门提权 R3调用R0函数


三、参考资料

  • bilibili博主_周壑:x64内核研究
  • Intel 第3卷 段页机制

如有错误, 还请大佬指正文章来源地址https://www.toymoban.com/news/detail-455705.html

到了这里,关于Windows x64中断门提权 R3调用R0函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Windows7UltimateSP1x64安装及一些设置

    Windows7UltimateSP1x64安装及一些设置

    对于只有机械硬盘的老电脑,Windows7系统相比于Windows10系统还是流畅许多。但是Windows7已停止支持,且安装的时候会出现一些问题,这里做一个自己安装过程中遇到的问题,以便重装Windows7系统之后查询。 电脑信息:8G+1T机械 操作系统:Windows7UltimateSP1x64 网址:https://msdn.itell

    2024年02月06日
    浏览(7)
  • Eclipse的超级详细的安装和配置(在windows11x64下

    Eclipse的超级详细的安装和配置(在windows11x64下

    1、获取Eclipse安装包 链接:https://pan.baidu.com/s/19Xg6PbgIH2kr1Zug5G1Ztg 提取码:zhm6 2、解压到自己想要的目录(目录不能有中文,要不然会导致解压失败等诸多错误哦) 3、打开解压目录点解eclipse.exe执行文件开始安装eclipse 4、设置workslace(主要是存储Java代码的目录 注意:红框最好不要

    2024年02月06日
    浏览(16)
  • Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Feb 2023)

    Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Feb 2023)

    Windows 11, version 22H2,2023 年 2 月 更新 请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 全新 Windows 体验,让您与热爱的人和事物离得更近。 获得全新视角 Windows 11 提供一个让人平静而富有创意的空间,全新体验引

    2024年02月04日
    浏览(13)
  • Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated May 2023)

    Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated May 2023)

    Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated May 2023) Windows 11, version 22H2 官方原版,2023 年 5 月 更新 请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 全新 Windows 体验,让您与热爱的人和事物离得更近。 获得全

    2024年02月09日
    浏览(33)
  • Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jan 2023)

    Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jan 2023)

    Windows 11, version 22H2,2023 年 1 月 更新,持续更新中 … 请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 👉 Available today: The Windows 11 2022 Update (September 20, 2022) 👉 Windows 11: A new era for the PC begins today 👉 Announcing Wind

    2024年02月07日
    浏览(36)
  • NTLite精简Windows 10 Enterprise LTSC 2019 (1809) x64 - Client 10.0.17763.316

    准备工具 NTLite 1.8.0.6790 X64:城通网盘 Win10 LTSC 2019 X64: ed2k://|file|cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24.iso|4478906368|E7C526499308841A4A6D116C857DB669|/ SHA1:24b59706d5eded392423936c82ba5a83596b50cc Win10 LTSC 2019 X32: ed2k://|file|cn_windows_10_enterprise_ltsc_2019_x86_dvd_1814dbab.iso|3196803072|2D39C54A2E99BAC308191C7

    2024年02月12日
    浏览(10)
  • Windows - Microsoft Visual C++ 2019 Redistributable Package (x64) is not installed

    Windows - Microsoft Visual C++ 2019 Redistributable Package (x64) is not installed

    Microsoft Visual C++ 2019 Redistributable Package (x64) is not installed 另外的几种报错形式: ”由于找不到MSVCR120.dll,无法继续执行代码。重新安装程序可能会解决此问题“ ”由于找不到VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可能会解决此问题“ 都是由于电脑系统缺少部分配置

    2024年02月13日
    浏览(13)
  • Visual Studio 2022 MASM x64汇编hello world以及调试(Console版 + Windows版)

    本文介绍使用Visual Studio 2022的MASM开发x64汇编程序hello world的环境配置和汇编代码,作为学习CPU指令的起点。分两个版本的hello world, 一个是console版本,另一个是windows版本。 首先安装visual studio community 2022,下载地址 https://visualstudio.microsoft.com/,安装时选择C++开发模块 安装好以

    2024年02月05日
    浏览(17)
  • 一款免费、开源、可批量识别的离线OCR软件,适用于 Windows7 x64及以上平台

    一款免费、开源、可批量识别的离线OCR软件,适用于 Windows7 x64及以上平台

    免费 :本项目所有代码开源,完全免费。 方便 :解压即用,离线运行,无需网络。 高效 :自带高效率的离线OCR引擎,内置多种语言识别库。 灵活 :支持命令行、HTTP接口等外部调用方式。 功能 :截图OCR / 批量OCR / PDF识别 / 二维码 / 公式识别(测试中 ) 使用说明: 软件发

    2024年04月17日
    浏览(10)
  • ARM64函数调用流程分析

    ARM64函数调用流程分析

    ARM64 程序调用标准 下图是介绍一个简单函数调用的示例,在该示例中简单介绍了栈的使用。 2.1.1 main的C代码实现 2.1.2 main函数对应汇编及其分析 0000000000000114 main: main函数的入口 114: a9be7bfd stp x29, x30, [sp, #-32]! 将sp = sp - 32,为main函数开一个32Byte的栈空间,然后将x29(FP),X30(LR)寄

    2024年02月11日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包