# 壓縮殼脫殼 ###### tags: `learning` 本來打算在 ollydbg 教學上再學,但是有點懶得把當初的 winxp 裝回來,乾脆直接用別的檔案試試看,壓縮殼應該不會差太多吧... 這次的目標從這個[影片](https://www.youtube.com/watch?v=xFXd1mv0ucE)上看到的 **以下強烈建議在 win10 以下版本進行脫殼** :::info 因為 win10 要向下兼容,所以多用了一個叫 apphelp 的 dll ,造成之後修復 IAT 會出現問題,**脫殼請在最低系統上進行** ::: ## ESP 定律找 OEP 一開始會停在入口點, F9 執行後會停在 upx 解壓縮前,為了保存 registers ,會先用一個 pushad 把 registers 壓在 stack 上,解完後會在回復,因此直接在相關的 stack address 下一個 hardware breakpoint : pushad 保存 regs ![](https://i.imgur.com/8sRo7Dh.png) 對這個地址下斷點,等回復的時候就會停住了,接下來就離 OEP 不遠了 ![](https://i.imgur.com/TJLyVKb.png) 硬體斷點 ![](https://i.imgur.com/1sIDz5Y.png) F9 開開心心的跑下去,直到訪問到硬體斷點,刪除斷點後觀察附近的指令,發現有個大跳躍到 0x4021d0 ,基本就可以確定是 OEP 了 ![](https://i.imgur.com/hDNzx7h.png) ## Dump 脫完殼的 binary 脫完後將之保存但不要關掉 dbg , scylla 內建有 dump 功能,用他的就好 ![](https://i.imgur.com/QdyltzN.png) ## 修復 IAT 我不知道為啥 scylla 找 IAT 每次都找錯 = = ,所以最好手動找一下 ![](https://i.imgur.com/bOluOCu.png) 看起來很像用 IAT call function ,跟進去看發現一堆跳轉的指令,,ds:[] 放的地址應該就是 IAT 沒錯 ![](https://i.imgur.com/FSgHeuC.png) ![](https://i.imgur.com/wig0BEt.png) 考慮到放置 address 的地方應該是 data 而不是指令,我在 data window 下跟蹤下去,發現一堆奇怪東西,但仔細看會發現都是 `0x75f0????` 這種模式(有些不太一樣不過別在意),合理懷疑都是地址 ![](https://i.imgur.com/Ay4HdE7.png) 用地址的呈現方式看看 ![](https://i.imgur.com/e6xhQI7.png) ![](https://i.imgur.com/LK1ALjE.png) OK 開始找 IAT 的起點和終點 起點: ![](https://i.imgur.com/Lh1ny4r.png) 終點: ![](https://i.imgur.com/879i23p.png) 注意到 IAT 表的結尾是 0 不是地址,計算下大小是 0x10e8 把起點和大小填到 scylla 上 ![](https://i.imgur.com/X5jKl2t.png) get import ![](https://i.imgur.com/qV4vJDS.png) fix dump ![](https://i.imgur.com/lkxh5Ja.png) 執行看看新的脫殼檔案 ![](https://i.imgur.com/o8xhfn1.png) 成功!