
# rt26cx21x64.sys Exploit (Realtek PCIe GbE/2.5GbE/5GbE-Familie)
rt26cx21x64.sys Exploit (Realtek PCIe GbE/2.5GbE/5GbE-Familie)
OID 0xFF816871 bildet die MMIO-Bar des NICs in den virtuellen Adressraum des aufrufenden Prozesses ab, (MmLockedPagesSpecifyCache), erreichbar aus dem User-Mode über \.\RealTekCard{GUID}
Dieser IOCTL (0x0012C818) ist durch einen Registrierungswert (DrvMode=4) abgesichert.
Sobald wir MMIO-Registerzugriff haben, programmieren wir die TX/RX-Deskriptor-Ringe des NICs im Loopback-Modus, um beliebige physische Adressen zu lesen/schreiben (AllocateUserPhysicalPages liefert uns PFNs).
IOCTL 0x12C008 (1230872) ist der erste verwundbare Dispatch-Zweig. 0x12C00C und 0x12C010 führen zu unterschiedlichen Pfaden, a5 trägt den IOCTL-Code durch die Switch-Anweisung

Bevor der DMA-Pfad erreicht wird, prüft der Treiber ein globales DrvMode-Flag, Bit 2 muss gesetzt sein, sonst erreichen wir den verwundbaren MMIO-Mapping-Pfad nie.

dword_1400D0208 und 4 ist die Prüfung
Zwei Guards sitzen vor dem verwundbaren Pfad, beide müssen false ergeben, um in den DMA-Pfad zu gelangen. Diese sind ein Byte-Flag auf der Geräteerweiterung und die Modusprüfung im vorherigen Bild

!_(_BYTE _)(a1 + 12465) ist leicht zu umgehen, wir müssen nur sicherstellen, dass das Gerät nicht initialisiert ist.
sub_14001B67C ist ebenfalls trivial einfach.
Der Treiber weist ein MDL über eine vom Aufrufer bereitgestellte physische Adresse ohne Validierung zu, es gibt keine Grenz- oder Bereichsvalidierung, absolut keine.

Das MDL wird in den Kernel-VA abgebildet und die Basisadresse wird dem Aufrufer übergeben, 0x40000010 ist MAP_NO_EXECUTE & MmNonCached.

MmMapLockedPagesSpecifyCache erzeugt den abgebildeten VA, der an *a2 geschrieben und an den User-Mode zurückgegeben wird. Dies gibt uns eine beliebige physische Lese-/Schreib-Primitive.
nic.h übereinstimmt.Als Administrator ausführen.
Nach dem ersten Lauf werden die Registrierungswerte gesetzt und du musst deinen PC neu starten.
Damit dies funktioniert, muss dein NIC im Link-UP-Zustand sein (damit wir Deskriptoren verarbeiten können).
Entweder:
ODER
$ cmake -B build
$ cmake --build build --config Release