详解如何利用Windows设备驱动
2009-02-12 13:55:33 来源:WEB开发网漏洞分析
你可以在上面的代码中发现一处明显的漏洞:
.IFeax==011111111h
moveax,(_IRPptr[edi]).SystemBuffer;inbuffer
testeax,eax
jzno_write
movedi,[eax];[inbuffer]=dest
movesi,[eax+4];[inbuffer+4]=src
movecx,512;ecx=512bytes
repmovsb;copy
no_write:
.ENDIF
如果驱动获得eax 等于0x011111111,它会检测lpInputBuffer 参数的值。如果他等于空,则什么也不发生。但是当参数不同于0 时,驱动从送入的缓冲区中读取数据(源代码描述)并且从源内存中拷贝512bytes 到目的区域中(如果你愿意,你可以将它看作memcpy())。现在你也许会想,对于这样一个如此简单的memory corruption 利用又有什么难度呢?当然,这个漏洞看起来十分容易利用,然而你有没有意识到事实上你并不能写入数据到驱动中。我想你应该十分明白看到搜索硬编码堆栈地址作为目标内存参数是完全没意义的。同样的,如果你说这样的漏洞不存在于流行软件中,那你就错了。此外,这里提到的利用技术你可以利用来攻击多种类型的memory corruption 漏洞,甚至那些被称为off-by-one 的问题,这些问题是值覆盖内存并且攻击者不可控——不要限制你的思维(好吧,很多时候:))。让我们开始寻找上面那些问题的答案。
目标:定位可写数据
首先,我们需要定位一些我们可以利用的内核模式模块,这些模块需要在大多数Windows 操作系统中都是存在的(我的意思是只限于NT 系统)。一般来说这样可以提高在不同机器上的攻击成功率。现在让我们来看看Windows 的真实内核——ntoskrnl.exe。
我们先来看看引出的函数:
更多精彩
赞助商链接