漏洞分析丨HEVD-0x6.UninitializedStackVariable[win7x86]
来源:http://www.tudoupe.com时间:2022-08-02
探索 Ring0 脆弱性世界: 单元化堆栈变量脆弱性
单元化变量本身并不是一个问题,但如果在这个变量结构中存储将被执行的东西(例如撤销函数),那也是另一个问题。
实验环境
•虚拟机:Windows 7 x86
•物理机器:Windows 10 x64
•软件:IDA,Windbg,VS2022
同样,IDA首先发现了触发函数TriggerUninitializedMemoryStack,它分析了该漏洞的存在。
首先,从用户提供的指针中提取值并保存到toebx:
然后立即确定值是否是一个魔术数字0BAD0B0B0h。
是的话,就将该值和一个函数地址保存到了栈中一个结构体里,如果不是的话,则不进行操作,然后进行判断,判断栈中的这个变量是否有值,如果有值,且为固定这个函数的地址的话,就执行这个函数。
如果该位置有值,且不是固定函数地址,则将此值称为函数:
驱动源码:
安全版本和非安全版本之间的区别只是一个局部变量是否被初始化。事实上,不初始化似乎是一个问题,问题的关键是撤销函数在变量中存储,然后撤销,导致一个漏洞。
如果您输入一个错误值(而不是一个魔术号码)并控制转导地址,您可以执行shellcode。
问题是,如何控制转向地址? 单一化局部变量存储在堆栈中,而值是不可预测的。堆栈中存储的值是多少,变量的价值是多少。
为参考[1],控制堆栈中的值需要编写如下:
1.找到内核堆栈的初始化地址;
2.在调用地址所在的内核堆栈中找到初始化地址的极化;
3. 通过在用户模式下用户可控输入喷射内核栈(参考资料[2])。
根据参考 [2], 称为 NtMapUserPhysicalPages 的未文档函数可以将大量数据注入内核堆栈:
这里是一个缓冲阵列,堆栈空间为1024*大小(ULONG_PTR)。
最后,如果NumberOfPages变量小于1024,则使用堆栈缓冲地址来调用MiCaptureUlongPtrArray函数。
使用IDA打开Windows 7 x86内核文件ntkrnlpa并找到呼叫:
由于该函数是一个快速调用调用,在x86下快速调用将优先使用ecx和 edx输入,额外的参数只使用堆栈,换句话说,通过的参数是: NumberOfPages,UserPfnArray,栈缓冲区的地址。
然后, MiCaptureUlongPtrArray的实现如下:
在NtMapUserPhysicalPages函数中,发送到堆栈缓冲区的数据被填充。
到此,可以知道,只需要向调用NtMapUserPhysicalPages函数,提供第二个参数是大小,第三个参数是用户缓冲区,即可实现在栈中进行喷射,接下来进行编写exp实现利用。
继续使用以前的模板更改。
通过函数,可以实现内核堆栈的预配置,然后使用非魔法输入来调用循环函数,使未初始化变量填满我们配置的值,从而完成使用:
参考资料
•[1] Windows Kernel Exploitation Tutorial Part 6: Uninitialized Stack Variable - rootkit (rootkits.xyz) https://rootkits.xyz/blog/2018/01/kernel-uninitialized-stack-variable/
•[2] nt!NtMapUserPhysicalPages and Kernel Stack-Spraying Techniques | j00ru//vx tech blog (vexillium.org) https://j00ru.vexillium.org/2011/05/windows-kernel-stack-spraying-techniques/
•[3] CVE-2016-0040 - DreamoneOnly - 博客园 (cnblogs.com) https://www.cnblogs.com/DreamoneOnly/p/13163036.html
•[4] HEVD Kernel Exploitation -- Uninitialized Stack & Heap (seebug.org) https://paper.seebug.org/200/
•[5] ヾ(Ő∀Ő3)ノ嘻嘻![05] HEVD 内核漏洞之未初始化栈变量 | Saturn35 https://saturn35.com/2019/07/26/20190726-2/
•[6] C library function - memcpy() (tutorialspoint.com) https://www.tutorialspoint.com/c_standard_library/c_function_memcpy.htm
•[7] __fastcall | Microsoft Docs https://docs.microsoft.com/zh-cn/cpp/cpp/fastcall?view=msvc-170
上一篇:MySQL8.0.28安装教程
下一篇:小白系统初始化配置资源失败怎么办
相关新闻
- 2022-08-04 WPF的由来
- 2022-08-04 Win11勒索软件防护怎么打开?Win11安
- 2022-08-04 Windows系统jdk的配置
- 2022-08-04 Windows10 OneNote怎么重新登录?如何重
- 2022-08-04 超好用的 Windows 效率工具推荐
- 2022-08-04 Windows如何在CMD或PowerShell中配置代理
- 2022-08-04 powershell和cmd对比
- 2022-08-04 【QT】Windows下QT下载安装
- 2022-08-04 windows下 C++ 实现类属性的get和set方
- 2022-08-04 Win11快速助手在哪里?Win11打开快速
|
|
|
|
|
|
|
|
|
|