iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Security

我逆向你逆向我的逆向工程膩系列 第 12

Dx12 - UPX 脫殼解析

  • 分享至 

  • xImage
  •  

UPX 脫殼解析

這裡嘗試用熟悉的 Helloworld 來解析 UPX 是如何脫殼的。

這一章我一行一行的檢查,然後猜測……由於經驗不足我無法確定我是正確的,所以程式流程的解說不一定是正確的。
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx12

  1. 對目標進行壓縮。

https://ithelp.ithome.com.tw/upload/images/20220926/20135675iaKRoLog9j.png

  1. 使用 x64dbg 進入 EP,但這裡只是解壓縮器的 EP,而且位置是在 UPX[ 1 ] 區域。但還不是原本程式的 OEP ( Original Entry Point )

    第一行的 pushad 會將 EAX~EDI 暫存器都存進 Stack

    第二行把 第二個 Section (放壓縮檔的區塊) 起始點設到 ESI

    第三行把 EDI 設到第一個區塊的起始位置

    既然把傳輸位置 ( ESI & EDI )的起始點與終點設成這樣,就可以預見資料會從第二區塊解壓縮到第一區塊,而指令碼始終只會在記憶體中

https://ithelp.ithome.com.tw/upload/images/20220926/20135675d6OvyDFZRf.png

  1. 可以利用 ctrl + F8 來連續執行程序,在開始後我發現了循環中的 009A7E03 會將 ESI 貼到 EDI,也是 009A1000 ( Base of UPX[0] )
    這是原本的

https://ithelp.ithome.com.tw/upload/images/20220926/20135675lomWGDMeoD.png

  1. 009A7EBA停止點讓他脫離循環,可以發現指令和 009A6000INT 被貼上來了,觀察 EDI 發現他複製到 009A65D4 ( 雖然中間一大部分是空的 )

https://ithelp.ithome.com.tw/upload/images/20220926/20135675HuUYiJaLwl.png

https://ithelp.ithome.com.tw/upload/images/20220926/20135675MweoJGG3N9.png

  1. 接下來在 009A7EC2009A7EEE 的循環,可以發現 calljmp 的目的位置被修復了。

https://ithelp.ithome.com.tw/upload/images/20220926/20135675kVrEo5ga8O.png

  1. 之後 009A7F39 的循環會根據之前第一次循環設好的名稱等把 ITA 設好。

https://ithelp.ithome.com.tw/upload/images/20220926/20135675BqwkrYVkRL.png

  1. 009A7F39009A7F67 會將字串與 Function Name 附到正確的位置上。

https://ithelp.ithome.com.tw/upload/images/20220926/20135675jDCG4TnGzH.png

  1. 到了 009A7F96popadpushad 對應。把 stack 推回去後就可以由 009A7FA4 跳到 OEP

https://ithelp.ithome.com.tw/upload/images/20220926/20135675DZFjykg5YK.png

之後就是快快樂樂地原本的 Helloworld,透過這次實驗也了解了經過 UPX 如何破殼而出。

快速尋找 OEP

可以發現在 EP 後有一個 pushad,推測他保存的值會留給原本的程式,所以只需要找到 popad 後的 jmp 就可以知道原本的 OEP 在哪裡。 在 x64dbg 中可以到 EP 後使用 alt+F 搜尋 popad 就可以快速搜尋到該指令。


上一篇
Dx11 - 加殼時間
下一篇
Dx13 - PE 基址重定位
系列文
我逆向你逆向我的逆向工程膩31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言