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

[原创]初学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期)

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