本文系統整理 Windows 堆疊溢位的三種經典利用路徑,含原始碼範例、結構體定義、關鍵指令追蹤與利用前提條件,供安全研究者參考。
buf1 = malloc(32); memcpy(buf1, shellcode, 32+16); // 溢位 16 bytes 覆蓋下一塊管理結構 + 雙向鏈表指標 buf2 = malloc(16); // RtlAllocHeap 將執行 [ECX]=EAX / [EAX+4]=ECX 任意寫入
FreeList[0] 指標。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):
TEST AL,01 → 必須含 BUSY flag (不可跳過)。CMP [ESI+04],40 → SegmentIndex < 0x40。TEST AL,E0 → SETTABLE_FLAG 任一置位則跳轉 (非關鍵)。TEST [ESI+05],08 → 必須含 VIRTUAL_ALLOC flag (需跳轉至 0x77FCBB49)。利用前提:
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 合併邏輯。
合併邏輯關鍵檢查:
異常發生於 MOV [ECX],EAX / MOV [EAX+4],ECX,ECX=buf2 Flink、EAX=buf2 Blink,均可控 → 任意寫入。
類 Linux unlink,但 Windows 無法將 Size 設為負數,利用難度較高。
編譯器注意: .NET 平台編譯有效;VC++ 6.0 的 malloc 未真正呼叫 RtlAllocHeap/FreeHeap,需改用 HeapAlloc/HeapFree 才能觸發。
溢位後利用 (Shellcode 部署、SEH 覆寫等) 不在本文範圍。希望此整理能幫助初學者建立 Windows 堆疊利用的系統性認知。
Windows 2000 進階電源管理 (APM/ACPI) 命令列診斷工具 apmstat 完整解析
Windows 2000 無人值守安裝應答檔手工定制完整指南
Windows Server 2003 裝置管理員完整指南:硬體資源配置、衝突排除與疑難解析
Windows 2000 系統安全防護實戰:從安裝到日常管理的完整清單
Windows 2000 Server TCP/IP 完整設定指南 (下):WINS 伺服器配置
Windows 2000 登錄檔備份與還原完整指南:完整/部分備份、匯入匯出、配置單元載入與檔案位置詳解
Windows Server 2003 架設視訊廣播平台:Windows Media Services 實作指南
Windows Server 2003 Active Directory 應用篇:DNS 整合、SRV 記錄、動態更新與 WINS 淘汰