
rt26cx21x64.sys エクスプロイト (Realtek PCIe GbE/2.5GbE/5GbE ファミリ)
rt26cx21x64.sys エクスプロイト(Realtek PCIe GbE/2.5GbE/5GbE ファミリー)
OID 0xFF816871 は、NIC の MMIO BAR を呼び出しプロセスの仮想アドレス空間にマッピングします(MmLockedPagesSpecifyCache)。\.\RealTekCard{GUID} 経由でユーザーモードから到達可能です。
この IOCTL(0x0012C818)は、レジストリ値(DrvMode=4)によってゲートされています。
MMIO レジスタアクセスを取得したら、ループバックモードで NIC の TX/RX ディスクリプタリングをプログラムし、任意の物理アドレスを読み書きします(AllocateUserPhysicalPages で PFN を取得します)。
IOCTL 0x12C008(1230872)は、最初の脆弱なディスパッチ分岐です。0x12C00C と 0x12C010 は異なるパスにつながり、a5 はスイッチを通して IOCTL コードを運びます。

DMA パスに到達する前に、ドライバはグローバルな DrvMode フラグをチェックします。ビット 2 が設定されている必要があり、そうでなければ脆弱な MMIO マッピングパスには決して到達できません。

dword_1400D0208 と 4 の比較がチェックです。
脆弱なパスの前に 2 つのガードがあり、DMA パスに入るには両方が false と評価される必要があります。これらは、デバイス拡張上のバイトフラグと、前の画像のモードチェックです。

!_(_BYTE _)(a1 + 12465) は簡単にバイパスできます。デバイスが初期化されていないことを確認するだけです。
sub_14001B67C も同様に簡単です。
ドライバは、呼び出し元が指定した物理アドレスに対して検証なしで MDL を割り当てます。境界や範囲の検証は一切なく、まったく何もありません。

MDL はカーネル仮想アドレスにマッピングされ、ベースアドレスが呼び出し元に渡されます。0x40000010 は MAP_NO_EXECUTE と MmNonCached です。

MmMapLockedPagesSpecifyCache はマッピングされた仮想アドレスを生成し、それが *a2 に書き込まれてユーザーモードに返されます。これにより、任意の物理アドレス読み書きプリミティブが得られます。
nic.h に一致する互換性のある Realtek アダプタ。管理者として実行します。
初回実行後、レジストリ値が設定されるため、PC を再起動する必要があります。
これを機能させるには、NIC がリンク UP 状態である必要があります(ディスクリプタを処理するため)。
以下のいずれかを行います:
または
$ cmake -B build
$ cmake --build build --config Release