0x01 HEVD介绍
HEVD全称为HackSys Ex
treme Vulnerable Drive,是一个项目,故意设计包含多种漏洞的驱动程序,旨在帮助安全爱好者来提升他们在内核层面的漏洞利用能力。
说白了,是一个内核漏洞的靶场。
项目地址:https://github.com/hacksysteam/HackSysExtremeVulnerableDriver
关于安装配置初始环境,建议参考:
https://tttang.com/archive/1332/
https://bbs.pediy.com/thread-218838.htm
这里就不再赘述。
本人能力有限,刚学习过一些内核知识,文章中出现的任何错误欢迎师傅们批评指正。
下面我们直接开始,从栈溢出开始
0x02 栈溢出函数定位
在HackSysExtremeVulnerableDriver-3.00\Driver\HEVD\BufferOverflowStack.c
文件中。
位于该文件的107行,没有经过校验Size的大小而直接使用函数进行拷贝。
相关漏洞函数为:TriggerBufferOverflowStack
将HEVD.sys文件拖入ida中分析。定位到TriggerBufferOverflowStack
函数
可以看到使用了memcpy
对kernelBuffer
有拷贝动作,将UserBuffer
的值拷贝到kernelBuffer
中,拷贝长度为传入的参数Size。
问题在于kernelBuffer
的长度是固定的:
一个ULONG类型对应四个字节,那么512*4=2048=800h,这和IDA逆向出来的代码是相同的:
而UserBuffer和Size为传入的参数,并且对Size的大小没有限制,那么倘若Size大小大于800h字节,则会发生栈溢出。
0x03 溢出函数是怎样被调用的
相关调用链
首先是进入到DriverEntry(x,x)
,然后通过IrpDeviceIoCtlHandler(x,x)
根据IoControlCode
使用switch
函数跳转到BufferOverflowStackIoctlHandler
然后进入TriggerBufferOverflowStack
进行溢出操作
找到IrpIrpDeviceIoCtlHandler
函数
这里看的不是很清楚,可以通过IDA F5反编译一下
可以看到只有当IoControlCode为2236419时,才会调用BufferOverflowStackIoctlHandler
,继而调用TriggerBufferOverflowStack
。