# Windows Exploit Development - Structured Exception Handler (SEH) ###### tags: `exploitation` Fuzzy Security 第三部分教學,主要就是如何利用 SEH 機制來 exploit 2020-2-19 :從頭再看過後發現網路上的說法不太一致,我覺得還是要看具體狀況再覺得怎麼覆蓋...,光是 fuzzy security 、 aaaddr 大大、 CSDN 上的說明都有些出入。 ## SEH 概念 SEH 簡單來講就是 ms 為 exception 狀況時可以撰寫處理程序的機制,因為 exception 情況有不少種,所以針對每個 function 內不同的 exception handler 用 linked list 串連,如果遇到 overwrite return address 會觸發 SEH 則再覆蓋掉 SEH address ,此時程式就會執行已經被我們覆蓋掉的 fake SEH ,這就是 SEH基本原理。 ## 環境 基本上跟第一篇差不多,但這次用 DVD X Player 5.5 Pro 來當 target ,我就不贅述 ## 流程 因為這次不是 remote target ,需要 victim 去手動打開文件來 exploit ,操作上比較麻煩一點: ### 確認 payload 長度: 這邊跟以前差不多,就是放 cyclic 當 payload 交由程式去計算長度,但是有一點非常重要,要用 metasploit 的 pattern create 去弄出一個 cyclic 不能直接用 pwntools 的,我猜這跟 mona 的 code 有關 但是很不幸的,我的 pattern_create.rb 卡在一個奇怪的問題生不出 cyclic ,所以上網找了 online 版的: [Overflow Exploit Pattern Generator - Online Tool](https://zerosum0x0.blogspot.com/2016/11/overflow-exploit-pattern-generator.html) 1. 首先透過上面的網址(或 pattern_create ) 來生出個 100 bytes 的 payload 2. 用 python 生出帶有 cyclic 的 plf 檔案: ```python #!/usr/bin/env python buf = 'pattern' with open('evil.plt', 'w') as f: f.write(buf) ``` 3. 丟給 DVD player 4. 出錯的時候在 immunity debugger command 打上: `!mona findmsp` 會出現像是 ``` [+] Examing SEH chain SEH record (nseh field) at ??????(address) overwritten with normal pattern: ???????(pattern)(offset: 608) ``` 主要關注的就是 offset ,代表幾個 byte 後會蓋到 nseh 這邊我發現教學和實際跑出來的結果不大一樣,我的出來是 nSEH 教學的則是 SEH ,反正這邊要自己注意 到這邊基本可以確定 SEH 的位置 ### Overwrite SEH: 把上面的 payload 改下, 前 608 照樣塞 padding ,後面開始就是 nseh, seh ,首先 exception handling 會先給 seh , 如果 seh 無法 handle 再交由 nseh ,所以第一個執行的是 seh seh 可以被我們蓋到要好好利用,考慮到進入 exception 階段有些 register 會清空為 0 無法利用 jmp esp ,這樣無法確定 shellcode 地址讓我們跳過去,但是我們可以利用 nseh 地址在 esp + 8 這個特性,利用 `pop; pop; ret` gadget 放在 seh 並且在 nseh 填上一小段 jmp code 跳到 shellcode 上 找 pop pop ret 的方法: `!mona seh` 就會出現一堆藏在各種 dll 內的 gadget ,挑個能用不會 ASLR 的即可 nseh 的 `\xeb\x06\x90\x90` 前兩個是 jmp 到 6byte 之後, \x90 則是 padding * **注意**: padding 不要用 a ,原因是其中一個 dll 載入地址會是 0x61XXXXX 附近,如果用 aaaa 蓋過 return address 將觸發其他 exception 導致跑不進 SEH 那邊,為了這個我卡好久QQ ### shellcode 前面補上大概 20 bytes 的 nop 後面就 shellcode 照舊: `msfvenom -a x86 --platform -p windows/exec CMD='calc.ece' -b '\x00\x09\x0a\x0d\x1a\x20' --format python` 如此這次的利用就算結束了~