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安装及一些设置

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

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

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

    2024年02月06日
    浏览(38)
  • 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日
    浏览(46)
  • 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日
    浏览(35)
  • 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日
    浏览(42)
  • 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日
    浏览(29)
  • 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日
    浏览(31)
  • 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日
    浏览(81)
  • 一款免费、开源、可批量识别的离线OCR软件,适用于 Windows7 x64及以上平台

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

    2024年04月17日
    浏览(54)
  • 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日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包