
# Exploit rt26cx21x64.sys (famiglia Realtek PCIe GbE/2.5GbE/5GbE)
Exploit di rt26cx21x64.sys (famiglia Realtek PCIe GbE/2.5GbE/5GbE)
L'OID 0xFF816871 mappa la bar mmio della scheda di rete nello spazio degli indirizzi virtuali del processo chiamante, (MmLockedPagesSpecifyCache), raggiungibile da modalità utente tramite \.\RealTekCard{GUID}
Questo IOCTL (0x0012C818) è protetto da un valore di registro (DrvMode=4)
Una volta ottenuto l'accesso ai registri mmio, programmiamo gli anelli dei descrittori tx/rx della scheda di rete in modalità loopback per leggere/scrivere indirizzi fisici arbitrari (AllocateUserPhysicalPages ci fornisce i PFN).
L'IOCTL 0x12C008 (1230872) è il primo ramo di dispatch vulnerabile. 0x12C00C e 0x12C010 portano a percorsi diversi, a5 trasporta il codice IOCTL attraverso lo switch

Prima di raggiungere il percorso DMA, il driver controlla un flag globale DrvMode, il bit 2 deve essere impostato o non raggiungeremo mai il percorso vulnerabile di mappatura MMIO.

dword_1400D0208 e 4 è il controllo
Due protezioni si trovano davanti al percorso vulnerabile, entrambe devono valutare false per entrare nel percorso DMA; queste sono un flag byte sull'estensione del dispositivo e il controllo di modalità nell'immagine precedente

!_(_BYTE _)(a1 + 12465) è facile da bypassare, dobbiamo solo assicurarci che il dispositivo non sia inizializzato.
Anche sub_14001B67C è banalmente facile.
Il driver alloca un MDL su un indirizzo fisico fornito dal chiamante senza alcuna validazione, non c'è alcun controllo sui limiti o sull'intervallo, proprio nessuno.

L'MDL viene mappato nel VA del kernel e l'indirizzo di base viene fornito al chiamante, 0x40000010 è MAP_NO_EXECUTE e MmNonCached.

MmMapLockedPagesSpecifyCache produce il VA mappato che viene scritto in *a2 e restituito alla modalità utente, questo ci fornisce una primitiva arbitraria di lettura/scrittura fisica.
nic.h.Esegui come amministratore.
Dopo la prima esecuzione, i valori di registro verranno impostati e dovrai riavviare il pc.
Affinché funzioni, la tua scheda di rete deve essere in stato link UP (così possiamo elaborare i descrittori).
O:
OPPURE
$ cmake -B build
$ cmake --build build --config Release