
rt26cx21x64.sys эксплойт (семейство Realtek PCIe GbE/2.5GbE/5GbE)
rt26cx21x64.sys эксплойт (семейство Realtek PCIe GbE/2.5GbE/5GbE)
OID 0xFF816871 отображает mmio bar сетевого адаптера в адресное пространство вызывающего процесса, (MmLockedPagesSpecifyCache), доступный из um через \.\RealTekCard{GUID}
Этот IOCTL (0x0012C818) ограничен значением реестра (DrvMode=4)
Как только у нас есть доступ к регистрам mmio, мы программируем кольца tx/rx дескрипторов сетевого адаптера в режиме loopback для чтения/записи произвольных физических адресов (AllocateUserPhysicalPages даёт нам PFN).
IOCTL 0x12C008 (1230872) — первая уязвимая ветка диспетчеризации. 0x12C00C и 0x12C010 ведут к другим путям, a5 переносит код IOCTL через switch

Прежде чем попасть на путь DMA, драйвер проверяет глобальный флаг DrvMode, бит 2 должен быть установлен, иначе мы никогда не достигнем уязвимого пути отображения MMIO.

dword_1400D0208 и 4 — это проверка
Два защитника стоят перед уязвимым путём, оба должны вернуть false, чтобы попасть на путь DMA: это байтовый флаг в расширении устройства и проверка режима на предыдущем изображении

!_(_BYTE _)(a1 + 12465) легко обойти — нам просто нужно убедиться, что устройство не инициализировано.
sub_14001B67C также тривиально проста.
Драйвер выделяет MDL поверх предоставленного вызывающим физического адреса без какой-либо проверки, нет ни проверки границ, ни диапазона — вообще ничего.

MDL отображается в ядро VA, и базовый адрес передаётся вызывающему, 0x40000010 — это MAP_NO_EXECUTE и MmNonCached.

MmMapLockedPagesSpecifyCache создаёт отображённый VA, который записывается в *a2 и возвращается в um, что даёт нам примитив произвольного чтения/записи физической памяти.
nic.h.Запускать от имени администратора.
После первого запуска значения реестра будут установлены, и потребуется перезагрузка ПК.
Для работы ваш сетевой адаптер должен находиться в состоянии link UP (чтобы мы могли обрабатывать дескрипторы).
Либо:
ИЛИ
$ cmake -B build
$ cmake --build build --config Release