Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Windows 堆疊溢位三大利用技術深度剖析:RtlAllocHeap、RtlFreeHeap 兩種路徑與實戰構造

編輯:Windows Server 教學

本文系統整理 Windows 堆疊溢位的三種經典利用路徑,含原始碼範例、結構體定義、關鍵指令追蹤與利用前提條件,供安全研究者參考。

技術一:利用 RtlAllocHeap 覆寫雙向鏈表指標

buf1 = malloc(32);
memcpy(buf1, shellcode, 32+16); // 溢位 16 bytes 覆蓋下一塊管理結構 + 雙向鏈表指標
buf2 = malloc(16); // RtlAllocHeap 將執行 [ECX]=EAX / [EAX+4]=ECX 任意寫入
  • 前提:buf2 分配前 buf1 已溢位覆蓋 FreeList[0] 指標。
  • ECX 指向偽造的 Flink (0x11111111),EAX 指向 Blink (0x21212121),達到任意位址寫入 (類 Format String)。

技術二:利用 RtlFreeHeap 路徑一 (覆蓋 HEAP_ENTRY 旗標)

buf1 = malloc(32); buf2 = malloc(16);
memcpy(buf1, shellcode, 32+6); // 溢位 6 bytes 覆蓋 buf2 的 HEAP_ENTRY (8 bytes)
free(buf2); // 觸發異常

HEAP_ENTRY 結構 (8 bytes):

Size (2) | PreviousSize (2) | SegmentIndex (1) | Flags (1) | UnusedBytes (1) | SmallTagIndex (1)
Size = 實際大小 8-byte aligned / 8
Flags 關鍵位:0x01 BUSY, 0x08 VIRTUAL_ALLOC, 0x10 LAST_ENTRY, 0x20/0x40/0x80 SETTABLE_FLAG

關鍵檢查點 (RtlFreeHeap):

  1. TEST AL,01 → 必須含 BUSY flag (不可跳過)。
  2. CMP [ESI+04],40 → SegmentIndex < 0x40。
  3. TEST AL,E0 → SETTABLE_FLAG 任一置位則跳轉 (非關鍵)。
  4. TEST [ESI+05],08 → 必須含 VIRTUAL_ALLOC flag (需跳轉至 0x77FCBB49)。

利用前提:

  • 構造 buf2 Flags = 0xFF (含 BUSY + VIRTUAL_ALLOC)。
  • SegmentIndex < 0x40。
  • buf1 大小 ≥ 0x18+0x08 = 32 bytes (確保 ESI-0x18 仍在可控區域)。

技術三:利用 RtlFreeHeap 路徑二 (Unlink 風格合併空閒區塊)

buf1 = malloc(32); buf2 = malloc(16);
memcpy(buf1, shellcode, 32+16); // 溢位 16 bytes 覆蓋 buf2 管理結構
free(buf1); // 在 free(buf1) 即觸發異常

分歧點: 關鍵檢查點 4 TEST [ESI+05],08 → 不含 VIRTUAL_ALLOC (不跳轉),進入 CALL 77FCC9C1 合併邏輯。

合併邏輯關鍵檢查:

  1. buf2 Size ≠ 0。
  2. buf1 Size + buf2 Size ≤ 0xFE00 (div 8 後)。
  3. buf2 Flags 不含 BUSY (否則跳過合併)。

異常發生於 MOV [ECX],EAX / MOV [EAX+4],ECX,ECX=buf2 Flink、EAX=buf2 Blink,均可控 → 任意寫入。

補充:第四種 (free(buf2) 時合併下一區塊長度誤差)

類 Linux unlink,但 Windows 無法將 Size 設為負數,利用難度較高。


編譯器注意: .NET 平台編譯有效;VC++ 6.0 的 malloc 未真正呼叫 RtlAllocHeap/FreeHeap,需改用 HeapAlloc/HeapFree 才能觸發。

溢位後利用 (Shellcode 部署、SEH 覆寫等) 不在本文範圍。希望此整理能幫助初學者建立 Windows 堆疊利用的系統性認知。

Copyright © Windows教程網 All Rights Reserved