續上篇,本文詳細追蹤 RtlEncodePointer/RtlDecodePointer 核心實作,揭示進程專屬隨機 Cookie 產生與驗證流程,並完整呈現 VEH 保護的執行時期解碼邏輯,最後探討實際利用可行性。
ZwQueryInformationProcess
→ 內核 NtQueryInformationProcess
→ 子功能碼 0x24 (ProcessExecuteFlags / 隨機 Cookie)
edi = [Eprocess+0x258])。KeQuerySystemTime 取得系統時間 + 核心全域變數 0xFFDFF020+0x518 / +0x4B8 多輪 XOR 產生隨機數 → cmpxchg 寫回進程物件。esi 指向) 返回。
_RtlCallVectoredExceptionHandlers@8:
mov edi, offset _RtlpCalloutEntryList ; 0x7C99C320
cmp _RtlpCalloutEntryList, edi ; 空串列檢查 (自指)
jnz Loc_7C962DA0
... 進入關鍵區域 (RtlEnterCriticalSection)
mov esi, _RtlpCalloutEntryList
Loc_7C962DC1:
push dword ptr [esi+8] ; 參數
call _RtlDecodePointer@4 ; ★ 必須先解碼
lea ecx, [ebp+var_8]
push ecx
call eax ; 呼叫處理函數
...
mov esi, [esi] ; 移至下一節點 (已解碼指標)
jmp short Loc_7C962DC1
關鍵點:指標在使用前必須經過 RtlDecodePointer 解碼,攻擊者直接覆寫 _RtlpCalloutEntryList 或節點 Next 指標,解碼後將變為亂碼導致崩潰。
mov esi, _RtlpCalloutEntryList ; 直接取得明文指標 call dword ptr [esi+8] ; 直接呼叫,無解碼步驟
無法直接利用編碼指標繞過,因攻擊者無法預知 Cookie,亦無法在無資訊洩露情況下構造有效編碼指標。
若目標應用程式存在「可寫入的函數指標」且「可控制覆寫內容/位址」,結合資訊洩露,理論上仍可構造通用利用鏈。但較 SP1 純覆寫 SEH/VEH 指標的「通用模板」利用難度指數級上升。
/GS (堆疊 Cookie)、/SAFESEH、/DYNAMICBASE (ASLR)、/NXCOMPAT (DEP) 完整組合。strcpy, sprintf, gets);使用安全版本 (StringCchCopy, StringCbPrintf);最小權限原則執行服務。總結: XP SP2 的指標編碼、隨機化、Cookie 三重奏,將溢位利用從「腳本小子可用」推向「專業研究員才能嘗試」,是防禦技術演進的關鍵里程碑。