Try   HackMD

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
1. 首先透過上面的網址(或 pattern_create ) 來生出個 100 bytes 的 payload
2. 用 python 生出帶有 cyclic 的 plf 檔案:

    #!/usr/bin/env python
    buf = 'pattern'
    with open('evil.plt', 'w') as f:
        f.write(buf)
  1. 丟給 DVD player
  2. 出錯的時候在 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

如此這次的利用就算結束了~