-
-
[翻译]Windows exploit开发系列教程第十四部分:内核利用程序之整数溢出
-
发表于: 2018-3-14 20:28 3867
-
点击查看原文
欢迎回到Windows exp开发系列教程的第十四部分。今天我们来完成另一个基于HEVD漏洞驱动程序的exp。本次我们看一看整数溢出,这不包括GS栈溢出(后面会涉及到)和类型混淆(太简单了,exp在 GitHub),这将是最后一个简单的漏洞利用!调试环境的按照请参考本系列的第十部分。
让我们看看相关漏洞函数(here)。
驱动函数比较了用户提供的缓冲区长度和驱动分配缓冲区的长度。然而在有漏洞的版本中,这一检查的执行是这样的:
很明显的bug,terminator的大小是4字节,所以如果我们通过DeviceIoCtrl给驱动提供一个大小在0xfffffffc到0xffffffff的缓冲区的话,整数会溢出并借此通过了这一检查!我们可以在PowerShell控制台中做相似的操作来展示这一问题。
该函数的IOCTL码为0x222027。可以参考本系列教程的第十和第十一部分来查看IOCTL码是如何获取的。快速跳入IDA,看看这个函数。下图中我们可以看到函数的开头存在着错误的长度检查。
跳过这块代码,我们会进入一个循环,它将拷贝用户缓冲区的数据岛内核缓冲区。注意下面的橘色块,拷贝操作将一直持续下去直到遇到缓冲区终止标志DWORD(译者注:其实就是0xbad0b0b0)。
简单的填充一些期望值给缓冲区,保证我们可以调用到相关函数。
完美。现在,尝试传递一个大小为0xffffffff(size)、尺寸大于驱动分配的缓冲区大小(例如0x900)的缓冲区给DeviceIoControl,来引发一个虚拟机蓝屏。
如前所见,我们崩溃在了异常处理例程。这并不完全可信,我们真正想要做的是一个宝贵的覆盖以致于当TriggerIntegerOverflow函数退出时可以获取执行体的控制。
我将此任务留给勤勉的读者。我给后来人“发明”了一些粗糙的Powershell代码来做这个exp开发,下面的代码可以用来创建一个模式缓冲区(pattern buffer)。
覆盖函数的返回值为0x42424242,我们可以使用下面的结构。
与内核栈溢出类似,我们得看看要如何修改shellcode的尾部来防止一个BSOD!首先让我们看看正常的执行流如何执行。我们在TriggerIntegerOverflow返回指令下一个断点。
看起来和第十部分处理的栈溢出完全一致。检查一下触发整数溢出时的栈。
我们可以修改shellcode的结尾,保存丢失的指令。
请参考下面的完整exp获取更多信息。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [翻译]Windows 10 Segment Heap内部机理 19880
- [翻译]Windows 8堆内部机理 7159
- [翻译]深入理解LFH 7787
- [翻译]Bitmap轶事:Windows 10纪念版后的GDI对象泄露 9296
- [翻译]理解池污染三部曲 6821