萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

Windows XP SP2 緩衝區溢位防護機制深度解析 (上):PEB 隨機化、SEHOP 前身、VEH 指標編碼、Heap Cookie

Windows XP SP2 引入多項編譯器與執行期緩解技術,大幅提高緩衝區溢位利用難度。本文從核心原始碼層面 (IDA 反組譯) 深度剖析四大核心防護機制實作細節。

1. PEB (Process Environment Block) 基址隨機化

實作流程

  1. 進程建立呼叫 NtCreateProcessEx → PspCreateProcess → MmCreateProcessAddressSpace → MmCreatePeb → MiCreatePebOrTeb。
  2. MiCreatePebOrTeb 參數 0x210 觸發隨機化邏輯 (非 0x210 則固定 0x7FFDF000)。
  3. 核心呼叫 KeQueryTickCount 取得系統啟動滴答計數低 4 位 (0~15)。
  4. 基址計算:Base = 0x7FFE0000 - (TickCount & 0xF) * 0x1000,特殊處理值 1→2 避免落回 0x7FFDF000。

結果分佈

Tick & 0xF : 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
PEB Base   : 7FFDE000 (1/8), 7FFDD000, 7FFDC000, 7FFDB000, 7FFDA000,
             7FFD9000, 7FFD8000, 7FFD7000, 7FFD6000, 7FFD5000,
             7FFD4000, 7FFD3000, 7FFD2000, 7FFD1000, 7FFDE000

熵值約 4 bits (16 種可能),7FFDE000 機率 1/8,其他 1/16。雖熵值低,但已足以破壞依賴固定 PEB 位址的堆利用代碼穩定性。

2. 頂層異常處理器 (Top-Level Exception Filter) 保護

SetUnhandledExceptionFilter 在 SP2 中重寫:設置新回呼前,先對回呼位址進行 編碼 (XOR 隨機 Cookie),解碼時驗證完整性。舊技巧直接覆寫 TopLevelExceptionFilter 全域指標失效,因寫入值未經編碼會被驗證失敗拒絕。

3. VEH (Vectored Exception Handler) 鏈表指標編碼

  • 全域變數 _RtlpCalloutEntryList (0x7C99C320) 儲存 VEH 串列頭指標。
  • RtlCallVectoredExceptionHandlers 遍歷前,必須呼叫 RtlDecodePointer 解碼指標才能使用。
  • 攻擊者覆寫串列指標後,解碼階段會產生無效指標導致崩潰,無法劫持控制流。
  • 對比 XP SP1:指標明文儲存,直接 call dword ptr [esi+8] 呼叫處理函數,易被利用。

4. 堆積區塊 Cookie 保護

Heap 區塊頭部新增 Cookie (隨機值),分配/釋放時驗證完整性。覆寫區塊頭部大小/指標將導致 Cookie 不符,觸發 RtlpValidateHeapEntry 失敗終止進程。此為後續 Windows 版本 Heap Metadata Protection (XP SP3/Server 2003 SP1) 及 LFH (Low Fragmentation Heap) 隨機化的前身。

未涵蓋主題 (將於下篇或進階研究探討)

  • 如何繞過上述防護 (資訊洩露、部分覆寫、ROP/JOP 鏈構造)。
  • 堆管理器內部演算法細節 (Lookaside、FreeList、Segment、VirtualAlloc 後備)。

結語: XP SP2 透過「編碼指標、隨機化基址、Cookie 完整性驗證」三大手法,將單純緩衝區溢位利用門檻從「覆寫指標」提升至「資訊洩露 + 繞過編碼 + 繞過隨機化」的組合攻擊,奠定現代 Windows 緩解技術基石。

copyright © 萬盛學電腦網 all rights reserved