驱动程序是内核模式下的一个对象,当处于用户模式下时,需要一些中间方式来与驱动程序交互。为了做到这一点,需要看看它DEVICE_OBJECT
是如何创建的。DEVICE_OBJECT
通常有一个引用它的符号链接,允许客户端与驱动程序交互。该对象是客户端与之交互的对象。
可以使用 IDA 来定位符号链接的名称。该DriverEntry
函数类似于main()
内核模式驱动程序中的函数。此外,DriverEntry
函数原型化为接受指向 DEVICE_OBJECT
的指针,查看DEVICE_OBJECT
的Microsoft 文档,我们可以看到该结构的成员之一是指向DEVICE_OBJECT
的指针。
首先用Ghidra打开存在漏洞的驱动程序gdrv.sys(CVE-2018-19320
),定位到入口点entry
该\Device\GIO
字符串用于调用来IoCreateDevice
创建DEVICE_OBJECT
。
Entry中生成设备对象
以及生成符号链接
后,其中主要有两个设备控制请求
对应驱动代码类似于:
DriverObject->MajorFunction[IRP_MJ_XXX]
在FUN_00012d10
中,当IOCTL的
值为0xC3502808
,IOCTL的
也就是CTL_CODE
这个宏,它用来定义三环的DeviceIoControl
这个API的第二个参数
当IOCTL的
值为0xC3502808
的时候,进入FUN_00012860
,
看到这个就是一个内存拷贝的操作,所有我们利用这个0xC3502808
操作码,即可在三环和此漏洞驱动通信,达到任意内存读写的效果。
当然这个驱动程序现在已被众多杀软标记,但是结合ida、Ghidra等反编译工具以及gdrv-loader这个利用代码来学习驱动的加载、r3和驱动通信、定位DSE、关闭DSE等利用手法和机制是非常有学习价值的,具体的漏洞利用这个代码里非常清楚,包括了如何定位DSE,然后关闭和恢复,这种方式因为PG的存在可能会导致BSOD
gdrv-loader:https://github.com/v1k1ngfr/gdrv-loader/
这种老生常谈的vuln driver利用方式有:
可以用来Disable DSE,从而达到加载自己未签名驱动的效果。
还可以用来Disable Callback,从而屏蔽监控。
具体更多资料可以参考星球内资料学习:
关于驱动类资料随便截几张图展示(当然星球内驱动利用相关知识只是冰山一角)
加入链接