-
-
[原创]初学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期)
赞赏
- [原创]CVE-2022-21882提权漏洞学习笔记 16382
- [原创]CVE-2021-1732提权漏洞学习笔记 19489
- [原创]CVE-2014-1767提权漏洞学习笔记 15192
- [原创]CVE-2018-8453提权漏洞学习笔记 18526
- [原创]CVE-2020-1054提权漏洞学习笔记 13542