
# Exploração do rt26cx21x64.sys (família Realtek PCIe GbE/2.5GbE/5GbE)
Exploração do rt26cx21x64.sys (família Realtek PCIe GbE/2.5GbE/5GbE)
O OID 0xFF816871 mapeia o bar MMIO da placa de rede para o espaço de endereço virtual do processo chamador, (MmLockedPagesSpecifyCache), acessível a partir do modo usuário via \.\RealTekCard{GUID}
Este IOCTL (0x0012C818) é protegido por um valor de registro (DrvMode=4)
Uma vez que temos acesso aos registradores MMIO, programamos os anéis de descritores tx/rx da placa de rede em modo loopback para ler/gravar endereços físicos arbitrários (AllocateUserPhysicalPages nos fornece os PFNs).
O IOCTL 0x12C008 (1230872) é o primeiro ramo de despacho vulnerável. 0x12C00C e 0x12C010 levam a caminhos diferentes, a5 carrega o código do IOCTL através do switch

Antes de alcançar o caminho DMA, o driver verifica um flag global DrvMode, o bit 2 deve estar definido ou nunca alcançaremos o caminho vulnerável de mapeamento MMIO.

dword_1400D0208 e 4 é a verificação
Duas proteções ficam na frente do caminho vulnerável, ambas devem ser avaliadas como falsas para entrar no caminho DMA, estas são um flag de byte na extensão do dispositivo e a verificação de modo na imagem anterior

!_(_BYTE _)(a1 + 12465) é fácil de contornar, apenas temos que garantir que o dispositivo não esteja inicializado.
sub_14001B67C também é trivialmente fácil.
O driver aloca um MDL sobre um endereço físico fornecido pelo chamador sem nenhuma validação, não há validação de limites ou intervalo, absolutamente nada.

O MDL é mapeado no VA do kernel e o endereço base é fornecido ao chamador, 0x40000010 é MAP_NO_EXECUTE & MmNonCached.

MmMapLockedPagesSpecifyCache produz o VA mapeado que é gravado em *a2 e retornado ao modo usuário, isso nos dá uma primitiva arbitrária de leitura/gravação física.
nic.h.Execute como administrador.
Após a primeira execução, os valores de registro serão definidos e você precisará reiniciar o seu PC.
Para que isso funcione, sua placa de rede deve estar em estado de link UP (para que possamos processar descritores).
Ou:
OU
$ cmake -B build
$ cmake --build build --config Release