工具
X64dbg
- 註解功能
- 斷點使用
- 修改指令
- 可保存修改完的執行檔
Cheat Engine
- 透過不斷篩選得到對映的記憶體位置
- 可以更改篩選出來記憶體作用的指令
CL
為了測試 Windows 的功能如 SEH,採用 Microsoft Windows SDK(或Microsoft Build Tools 2015等)的
編譯器cl
編譯程式。
- 開啟
Windows SDK Command Prompt
setenv /x86
cl example.cpp
禁用ASLR
cl example.cpp /DYNAMICBASE:NO /link /FIXED
修改成x86環境。
setenv /x86
關閉SafeSEH
cl example.c /DYNAMICBASE:NO /link /FIXED /SAFESEH:NO
S.E.H
SEH為windows下例外處理的結構。
SEH結構體(32位元)
DWORD: 下筆SEH紀錄
DWORD: 例外處理
- 保存於系統堆疊中
- 線程初始化時,會自動安裝SEH
__try
、__except{}
- 堆疊通常同時存在多個SEH
- 堆疊中的SEH為連結單向串列,並且串接TEB的0位元組偏移處
- 異常時取出堆頂SEH處理
- SEH失敗則接續下筆SEH
- 若程式無法處理錯誤,則crash
以上為32位元應用程式的SEH結構,64位元請參考
備註
學習時可能遇到SafeSEH啟用導致覆蓋過後無法轉跳到shellcode, 在練習時關閉此保護以降低程式安全性。
SEHOP
SEHOP為SEH覆蓋保護,透過檢查ntdll
的FinalExceptionHandler
是否為
連結串列的末端,若不存在表示被複寫。
啟用的系統
在以下Windows版本與後序版本啟用SEHOP, 調整關閉啟用參見Microsoft文檔。
- Vista SP1 (默認關閉)
- win7 (默認關閉)
- win server 2008 (默認啟用)
參見
- Structured Exception Handling (C/C++)
- SEH机制学习
- Windows内存安全保护机制
- 0day安全:软件漏洞分析技术: Windows 異常處理機制(第一版第七章,第二版第六章)
SafeSEH
檢查handler是否在SafeSEH表中,啟用可以導致無法劫持SEH handler。
windows pwn問題
DEP導致無法執行shellcode
常用api
LoadLibrary()
Windows pwn Reverse Engineering