Windows XP SP2 引入多項編譯器與執行期緩解技術,大幅提高緩衝區溢位利用難度。本文從核心原始碼層面 (IDA 反組譯) 深度剖析四大核心防護機制實作細節。
NtCreateProcessEx → PspCreateProcess → MmCreateProcessAddressSpace → MmCreatePeb → MiCreatePebOrTeb。MiCreatePebOrTeb 參數 0x210 觸發隨機化邏輯 (非 0x210 則固定 0x7FFDF000)。KeQueryTickCount 取得系統啟動滴答計數低 4 位 (0~15)。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 位址的堆利用代碼穩定性。
SetUnhandledExceptionFilter 在 SP2 中重寫:設置新回呼前,先對回呼位址進行 編碼 (XOR 隨機 Cookie),解碼時驗證完整性。舊技巧直接覆寫 TopLevelExceptionFilter 全域指標失效,因寫入值未經編碼會被驗證失敗拒絕。
_RtlpCalloutEntryList (0x7C99C320) 儲存 VEH 串列頭指標。RtlCallVectoredExceptionHandlers 遍歷前,必須呼叫 RtlDecodePointer 解碼指標才能使用。call dword ptr [esi+8] 呼叫處理函數,易被利用。Heap 區塊頭部新增 Cookie (隨機值),分配/釋放時驗證完整性。覆寫區塊頭部大小/指標將導致 Cookie 不符,觸發 RtlpValidateHeapEntry 失敗終止進程。此為後續 Windows 版本 Heap Metadata Protection (XP SP3/Server 2003 SP1) 及 LFH (Low Fragmentation Heap) 隨機化的前身。
結語: XP SP2 透過「編碼指標、隨機化基址、Cookie 完整性驗證」三大手法,將單純緩衝區溢位利用門檻從「覆寫指標」提升至「資訊洩露 + 繞過編碼 + 繞過隨機化」的組合攻擊,奠定現代 Windows 緩解技術基石。