rt26cx21x64.sys 漏洞利用(Realtek PCIe GbE/2.5GbE/5GbE 系列)
OID 0xFF816871 将网卡的 mmio bar 映射到调用进程的虚拟地址空间中, (MmLockedPagesSpecifyCache),可通过 \.\RealTekCard{GUID} 从用户态访问
该 IOCTL(0x0012C818)受注册表值(DrvMode=4)控制
一旦我们获得 mmio 寄存器访问权限,就可以在环回模式下对网卡的 tx/rx 描述符环进行编程, 以实现对任意物理地址的读写(AllocateUserPhysicalPages 为我们提供 PFN)。
IOCTL 0x12C008(1230872)是第一个存在漏洞的分发分支。0x12C00C 和 0x12C010 通向不同的路径,a5 通过 switch 携带 IOCTL 代码

在到达 DMA 路径之前,驱动程序会检查全局 DrvMode 标志,必须设置第 2 位,否则我们永远无法到达存在漏洞的 MMIO 映射路径。

dword_1400D0208 与 4 进行与运算即为该检查
在存在漏洞的路径前有两个防护,两者都必须评估为 false 才能进入 DMA 路径,这两个防护分别是设备扩展上的一个字节标志以及 上一张图片中的模式检查

!_(_BYTE _)(a1 + 12465) 很容易绕过,我们只需确保设备未初始化即可。
sub_14001B67C 同样非常简单。
驱动程序在调用者提供的物理地址上分配一个 MDL,且不进行任何验证, 没有边界或范围验证,完全没有。

MDL 被映射到内核虚拟地址空间,基地址返回给调用者, 0x40000010 是 MAP_NO_EXECUTE 与 MmNonCached。

MmMapLockedPagesSpecifyCache 生成映射后的虚拟地址,该地址被写入 *a2 并返回 给用户态,这为我们提供了任意物理地址读写原语。
nic.h 匹配的兼容 Realtek 适配器。以管理员身份运行。
首次运行后,注册表值将被设置,你需要重启电脑。
要使其正常工作,你的网卡必须处于链路 UP 状态(这样我们才能处理描述符)。
任选其一:
或者
$ cmake -B build
$ cmake --build build --config Release