首页
社区
课程
招聘
[原创]初学Windows内核漏洞之瑞星HookCont.sys
发表于: 2021-11-4 16:44 11685

[原创]初学Windows内核漏洞之瑞星HookCont.sys

2021-11-4 16:44
11685

该漏洞存在于瑞星2010 HookCont.sys驱动中,版本低于或者等于23.0.0.5的HookCont.sys都存在该漏洞。

驱动装载以后,首先在WinDbg中查看驱动装载情况。

可以看到HookCont被装载到0xB22A9000到0xB22AB200内存区域中。接着再看看分发函数的情况

可以看到DriverEntry的函数地址是0xB22AA066,根据上面得到的驱动装载地址,可以算出DriverEntry函数的偏移地址是0x1066。而驱动偏移0xD2C就是IRP_MJ_DEVICE_CONTROL的对应的函数地址。

以下是DriverEntry中比较有用的两段代码,这两段代码完成对设备的创建,对分发函数的初始化以及符号链接的创建。

而DEVICE_NAME和LINK_NAME的内容如下

那么,根据这个符号名,就可以完成对驱动的打开。

在DispatchComm函数中,程序首先会将输入缓冲区,输入缓冲区长度,输出缓冲区长度保存起来。接着会对输出缓冲区的地址的合法性进行判断,如果是非法的地址,则会跳转到函数执行结束的地方执行。如果对于偏移0x60数据不清楚的可以看下这篇:初学Windows内核漏洞之CVE-2011-2005

接着程序会调用ProbeForRead和ProbeForWrite对输入输出缓冲区进行读写检查。

由于,在调用ProbeForWrite的时候,如果它的第二个参数,也就是输出缓冲区的长度如果是0的话,那么这个函数的检查就会被绕过。所以这就产生了漏洞。只要输出缓冲区的长度是0,那么就算输出缓冲区是个非法的地址,程序依然就继续执行下去。

接下来程序就会取出发送的IOCTL,并根据IOCTL的值来决定要执行的代码

对于第一个IOCTL,它的最后两位是11(0x3),那么对应的通信方式就是METHOD_NEITHER。该通信方式会直接对传入的输入输出地址进行操作,很可能有漏洞,跟进loc_10E91查看其中的内容。

程序首先判断输入缓冲区长度是否大于等于4,如果满足条件,则把输入缓冲区前4字节的内容压入栈中并调用GetObjectInfo函数。函数的返回值如果是0,则会跳过对输出缓冲区的赋值,否则就会将返回值赋到输出缓冲区中。

而在GetObjectInfo中,函数会将传入的输入缓冲区的4字节参数作为句柄传给ObReferenceObjectByHandle来获得相应的对象,随后会从这个对象中取出相应的内容来给eax赋值。

对上面的分析进行总结,可以得出如下的结论:

IOCTL等于0x83003C07的时候,用户层和内核层会采用METHOD_NEITHER的方式进行通信,该方式会直接对传入的输入输出的地址进行操作。

程序虽然会调用ProbeForWrite对输出缓冲区进行检查,但是没对输出缓冲区长度进行检查,如果传入的参数是0,那么此函数的检查将失效


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-11-30 10:04 被1900编辑 ,原因:
上传的附件:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//