-
-
[翻译]Windows exploit开发系列教程第十二部分:内核利用程序之空指针引用
-
发表于: 2018-3-14 20:22 4485
-
点击查看原文
欢迎回到Windows exp开发系列教程的第12部分。今天我们来快速编写一个基于HEVD漏洞驱动的空指针引用exp。环境部署的更多细节请参考第十部分。让我们开始吧!
先看一看有漏洞的函数部分(here).。
可以看到这里有一个魔数的检查。如果检查通过则打印该值和回调函数的地址(这是正常的执行流),反之则释放池内存,将指针置空。到这里都没有什么问题,但是此后,在有漏洞的版本中,该驱动程序仅仅简单的调用了回调函数而没有检查该回调函数此前是否被置空了。
该函数的IOCTL码是0x22202B。关于如何识别IOCTL码,请参考本系列文章的第十部分和第十一部分。让我们快速的跳入到IDA中来看看该函数。
因此,如果我们调用了TriggerNullPointerDereference函数并传入该魔数,理论上我们应该会执行到该函数且不会触发空指针引用。使用下面的POC来进行测试。
完美,没有崩溃,没有触发异常。如果魔数不匹配的话,我们就会进入调用空指针回调函数的代码块。
此后我们跳入到下一个指令块,这里空指针引用被触发。
很好,让我们在此函数下个断点并验证我们的理论!我们需要做的仅仅是传递一个不匹配的魔数(例如:0xdeadb33f)。
切实触发了空指针引用。你可能从上面的C++代码中注意到了这里触发了一个驱动异常例程。这非常好毕竟我们无需以BSOD告终。
这里唯一的技巧就是在于如何在0x00000004分配一个双字(dword)。我强烈建议你快速的看一下rohitab,一个最有趣的阐述。
和linux不同,Windows允许低权限用户去映射用户进程的上下文到0页(null page)。这一功能在直觉上有一点遮蔽性,毕竟VirtualAlloc和VirtualAllocEx在分配的基地址低于0x00001000时都以拒绝访问而告终。然而,利用NtAllocateVirtualMemory函数则没有这样的限制。下列代码可以用于阐述这一现象。
前面提到的文章看起来有一点荒谬,其作者无意中想到了这样一个好点子。预分配0页可以阻止空指针引用漏洞的利用(EMET就是这样做的)。。。
我们可以复用前面文章中窃取token的shellcode。这一次无需任何改动,因为我们劫持了另一个函数调用。
澄清一下我们的exp的通用安装方法:(1)把我们的shellcode放在内存中任意位置,(2)在程序的0页上分配内存,(3)把shellcode的地址写在0x00000004,(4)触发空指针引用。
以上就是全部的过程,请参考完整的exp来掌握更多信息。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [翻译]Windows 10 Segment Heap内部机理 19880
- [翻译]Windows 8堆内部机理 7159
- [翻译]深入理解LFH 7787
- [翻译]Bitmap轶事:Windows 10纪念版后的GDI对象泄露 9296
- [翻译]理解池污染三部曲 6821