
rt26cx21x64.sys 익스플로잇 (Realtek PCIe GbE/2.5GbE/5GbE 제품군)
rt26cx21x64.sys 익스플로잇 (Realtek PCIe GbE/2.5GbE/5GbE 계열)
OID 0xFF816871은 NIC의 mmio BAR를 호출 프로세스의 가상 주소 공간에 매핑합니다. (MmLockedPagesSpecifyCache), \.\RealTekCard{GUID}를 통해 UM에서 접근 가능
이 IOCTL(0x0012C818)은 레지스트리 값(DrvMode=4)에 의해 게이트됩니다.
mmio 레지스터 접근 권한을 얻으면, 루프백 모드에서 NIC의 tx/rx 디스크립터 링을 프로그래밍하여 임의의 물리 주소를 읽고 쓸 수 있습니다(AllocateUserPhysicalPages가 PFN을 제공).
IOCTL 0x12C008(1230872)은 첫 번째 취약한 디스패치 분기입니다. 0x12C00C와 0x12C010은 다른 경로로 이어지며, a5는 스위치를 통해 IOCTL 코드를 전달합니다.

DMA 경로에 도달하기 전에 드라이버는 전역 DrvMode 플래그를 확인하며, 비트 2가 설정되어 있어야 합니다. 그렇지 않으면 취약한 MMIO 매핑 경로에 도달할 수 없습니다.

dword_1400D0208과 4의 AND 연산이 확인입니다.
취약한 경로 앞에는 두 개의 가드가 있으며, DMA 경로에 진입하려면 둘 다 false로 평가되어야 합니다. 이는 디바이스 확장의 바이트 플래그와 이전 이미지의 모드 확인입니다.

!_(_BYTE _)(a1 + 12465)는 우회하기 쉽습니다. 디바이스가 초기화되지 않았는지만 확인하면 됩니다.
sub_14001B67C도 사소하게 쉽습니다.
드라이버는 호출자가 제공한 물리 주소에 대해 검증 없이 MDL을 할당합니다. 경계나 범위 검증이 전혀 없습니다. 아무것도 없습니다.

MDL은 커널 VA에 매핑되고 기본 주소가 호출자에게 전달됩니다. 0x40000010은 MAP_NO_EXECUTE 및 MmNonCached입니다.

MmMapLockedPagesSpecifyCache는 매핑된 VA를 생성하여 *a2에 기록하고 UM에 반환합니다. 이를 통해 임의의 물리 읽기/쓰기 프리미티브를 얻을 수 있습니다.
nic.h와 호환되는 Realtek 어댑터.관리자 권한으로 실행합니다.
첫 실행 후 레지스트리 값이 설정되며 PC를 재시작해야 합니다.
이 기능이 작동하려면 NIC가 링크 UP 상태여야 합니다(디스크립터를 처리할 수 있도록).
다음 중 하나를 수행하세요:
또는
$ cmake -B build
$ cmake --build build --config Release