iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Security

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

Dx21 - 修改PE強制加載DLL

  • 分享至 

  • xImage
  •  

在上一張我們學到了遠程 DLL注入,簡單說就是利用一個程序來注入另外一個程序 DLL檔案。在前幾篇也學過用 Hook 的方法來注入 。那我們今天的這個技術是直接透過修改引入的函式庫來強制程序執行要用的 DLL ,而且每次執行時都可以應用到改變。

檔案 ( 我會用 x32 來演示 ) :
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx21

首先看到 TextView ,他就是一個很簡單的文字閱讀器。

https://ithelp.ithome.com.tw/upload/images/20221005/20135675TOBpghGWvh.png

hackFile.dll 可以使 TextView 下載 google.com 並顯示在畫面上

https://ithelp.ithome.com.tw/upload/images/20221005/20135675ouAIMFxl36.png

利用 PE-BEAR 來觀察他的引入表( IDT ),可以看到他執行時會引入那些 DLL 檔案。

https://ithelp.ithome.com.tw/upload/images/20221005/201356753IyWXczUYR.png

那如果想讓程式引入我們想要的 DLL,就勢必要改變 IDT 來使程式獲得 DLL 檔案的位置與空間資訊

植入DLL

  1. 首先要查看 IDT 是否有足夠空間,用查看 Option_Header 的位置與空間。可以看到在 1D2C8 的位置有空間為 8C 的區塊。
    故空間為 1D2C8 ~ 1D353。經過偏移計算後他在檔案上的位置式在 96C8 ~ 9753

https://ithelp.ithome.com.tw/upload/images/20221005/20135675Mh56TdN5Yj.png

  1. 由於一個 IDT 中的資料 ( IMAGE_IMPORT_DESCRIPTOR ) 都是 14 個 byte,所以要觀察有沒有辦法塞進去。看到裡面有引入 6 個 DLL,再加上結尾的 NULL IDD 結構共需要 20 * 7= 140 = 0x8C 個位置,代表沒辦法塞到現有的 IDT 裡面。

https://ithelp.ithome.com.tw/upload/images/20221005/2013567592bRpoO2QI.png

  1. 既然不能塞到現有的 IDT 中,那得轉移到更開闊的空間。有幾種方法 :

    • 改放到文件中的空白位置
    • 增加最後一個 section 的空間
    • 文件尾端擴增新的 section

    在觀察文件後發現有很多大於 0xA0 ( 20 * 8 = 160 = 0xA0 )的空白空間,故使用第一種方法。

    查找後,我認為 .rdata 是最適合放入表的地方,因為他尾端有沒有資料的區塊,最方便改了。

  2. 找尋合適位置,具下圖可以看到 .rdata 的位置與載入資訊。
    雖然他的檔案空間有 2800,但實際載入的空間卻只有 26BC ( 到 8EBC ),這點要注意。

https://ithelp.ithome.com.tw/upload/images/20221005/20135675GCH6ie3xjn.png

我選擇了 8DD0 來放入資料。

https://ithelp.ithome.com.tw/upload/images/20221005/20135675L1fTLdDCgA.png

如果發現位置似乎不夠了,可以試著把區塊延長個 100 變成 27BC 吧 ( 但是不能超過 RawSize 2800,否則會與下個區塊重疊導致資料覆蓋 )。

https://ithelp.ithome.com.tw/upload/images/20221005/20135675b5CAKxYhLv.png

  1. IDT 放到新位置上

https://ithelp.ithome.com.tw/upload/images/20221005/20135675mx2APwEoEv.png

  1. Option_header 的引入表指定位置改成新的 RVA 位置與大小 :

RVA : 8DD0 - 6800 + 18000 = 0x1A5D0 → 0x D0 A5 01
Size : 20*8 → A0

https://ithelp.ithome.com.tw/upload/images/20221005/20135675sJXtuxdLYl.png

到這邊先試試看能不能正常執行,如果沒辦法就代表可能占用到原本要使用的區塊,得換地方。

  1. 創建 IDT
    IDT 表上增加一個與 hackFile.dll 對應的 IID,並在後面填充 NULL IID

https://ithelp.ithome.com.tw/upload/images/20221005/20135675AR1o66ahvN.png

  • OriginalFirstThunk : 至 INT ( Import Name Table ) 位置 → RAW.1A680 ( 下面決定 )
  • TimeDateStamp : 0
  • ForwarderChain : 0
  • Name : hackFile.dll → RAW.1A690
  • FirstThunk : 至 IAT ( Import Address TableZZ ) 位置 → RAW.1A6A0 ( 下面決定 )

整理成下圖反白資料 :

https://ithelp.ithome.com.tw/upload/images/20221005/20135675tbRd3wcLHz.png

INT 就放在 IDT 得下面方便直接取用,不過 IDD 中的數值是 RVA,須記得轉換。

把這些資訊填到下方的位置上方便引用 ( dummyhackFile.dll 的函數名稱 )。

https://ithelp.ithome.com.tw/upload/images/20221005/20135675AxZk4XPp4w.png

結果會像是這樣 :

https://ithelp.ithome.com.tw/upload/images/20221005/20135675yEogtg89mn.png

  1. 修改 Section Header : 寫入權限。使用的時候 PE loader 會改寫 IAT,所以必須讓區塊有寫入權限,看一下現在 .rdata 的權限長甚麼樣 :

https://ithelp.ithome.com.tw/upload/images/20221005/201356756yvjUMZxHP.png

看起來得加上寫入權限上去,寫入的值是 0x80000000,改變後變成 0xC0000040

試著執行程式,可以看到成功執行了 !

https://ithelp.ithome.com.tw/upload/images/20221005/20135675MfSRSs9HAc.png

如果到這邊出現了問題,可以使用 PE-BEAR 來查看導出函式的地方是否有問題。

通常顯示出來的會如下,如果有名稱或數字沒顯示那很有可能再植入的時候位置搞錯。

https://ithelp.ithome.com.tw/upload/images/20221005/20135675ObCWHv7TlX.png


上一篇
Dx20 - 遠程 DLL 注入工具解析
下一篇
Dx22 - 一些工具的介紹
系列文
我逆向你逆向我的逆向工程膩31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言