-
-
[原创]初学Windows内核漏洞之瑞星RsNTGdi.sys
-
发表于: 2021-11-4 21:07 11387
-
该漏洞存在于瑞星的RsNTGdi.sys驱动中,通过该漏洞可以实现任意地址写任意数据。
《0day安全:软件漏洞分析技术》
首先使用WinDbg查看该驱动装载到内存中的情况
可以看到RsNTGdi驱动装载到内存地址为0xF8B0E000到0xF8B0ED00中。接着在看一下分发函数的情况
可以看到DriverEntry的函数地址是0xF8B0E580,根据装载的内存地址0xF8B0E000可以知道,DriverEntry函数的偏移大小是0x580。而IRP_MJ_DEVICE_CONTROL的分发函数地址的偏移是0x36E。
在DriverEntry中,程序创建了设备对象和符号链接,同时也为分发函数进行赋值。从程序的注释中可以知道,符号名是RSNTGDI,我们就可以通过这个符号名来与驱动进行通信。
而在DispatchIoCtrl中,程序首先将几个关键的字段保存在几个寄存器中。
此时经过赋值,这几个寄存器保存的内容如下
随后取出IOCTL,在根据IOCTL来决定要执行的代码,如果传入的IOCTL不符合要求,就会跳转到函数的结束位置运行。
而要运行有漏洞的代码,IOCTL就需要是0x83003C0B,也就是说要运行的代码是loc_10458。且根据这个IOCTL的最后两位是11(0x3)可以知道,这个使用这个IOCTL的时候,用户层和驱动层的通信方式是METHOD_NEITHER。
接下来继续看loc_10458的代码,根据最开始的初始化以后各个寄存器所保存的内容可以知道。函数首先判断输入缓冲区的长度以及IRP的地址是否小于4,如果小于4则函数退出。如果满足跳转,则将缓冲区的前4字节作为参数调用VidSetTextColor,然后将VidSetTextColor函数的返回值输入到输出缓冲区中。
而VidSetTextColor函数是bootvid.dll的一个导出函数,该函数的代码如下
在这个函数中,首先将dword_80012648中保存的数据赋值到eax中,作为函数的返回值,然后将传入的参数保存到dword_80012648中。
根据以上内容可以得知,程序没有对输入缓冲区地址,输出缓冲区地址以及输出缓冲区的长度进行合法性验证。仅仅只是要求输入缓冲区的长度要大于4,这样的话,根据程序的逻辑就可以通过两次调用IOCTL为0x83003C08来任意地址修改。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [原创]CVE-2022-21882提权漏洞学习笔记 16382
- [原创]CVE-2021-1732提权漏洞学习笔记 19489
- [原创]CVE-2014-1767提权漏洞学习笔记 15192
- [原创]CVE-2018-8453提权漏洞学习笔记 18526
- [原创]CVE-2020-1054提权漏洞学习笔记 13542