首页
社区
课程
招聘
[翻译]Windows exploit开发系列教程第十四部分:内核利用程序之整数溢出
发表于: 2018-3-14 20:28 3867

[翻译]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直播授课

最后于 2018-3-15 20:24 被玉涵编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//