通過「熱修補程式」執行惡意程式碼實例分析
- 2019 年 10 月 5 日
- 筆記
序言
前兩天在「蜂鳥」圖標的社交網站看到一個高危樣本,便下載審查一番。文件是一個壓縮包,壓縮包中有兩個普通圖片、一個EXE和一個DLL文件(wwlib.dll)。

通過使用VirusTotal查詢MD5後發現只有wwlib.dll被殺毒引擎檢出為惡意文件,於是筆者不老道的經驗判斷這是一個普通的DLL劫持操作。在一番動態運行後發現確實如此,然後就按照DLL劫持的分析思路進行分析,結果並沒有找到具體得惡意程式碼執行處。之後經過多個小時的奮鬥,終於發現wwlib.dll使用類似「熱修補程式」技術修改了系統ntdll.LdrLoadDLL函數的返回地址使其跳轉到wwlib.dll的惡意函數進而執行多層shellcode。
熱修補程式:又稱為patch,指能夠修復軟體漏洞的一些程式碼,是一種快速、低成本修復產品軟體版本缺陷的方式,可以運行狀態下對程式進行修復。
「熱修補程式」位置
壓縮包中的exe文件作用只是用來載入wwlib.dll,所以我們只對wwlib.dll進行詳細分析。
文件名:wwlib.dll
MD5:6875f307d95790ca25c1da542ea736a8
wwlib.dll被載入後首先執行sub_1000101A函數,獲取ntdll.LdrLoadDll的函數地址並將其返回地址進行修改。

ntdll.LdrLoadDll的返回地址被修改為跳轉到wwlib.dll的sub_1000168E函數。
修改前:

修改後:

除了以上修改外作者還開闢了新的記憶體空間並寫入跳轉到ntdll.LdrLoadDll返回地址7c9364ee的程式碼。但是在調試時並未發現有執行改程式碼的操作,懷疑是作者的測試程式碼。

修改了以上程式碼就能確保惡意程式碼被順利執行。
如何觸發執行惡意程式碼?
以下結果是使用32位的win XP調試而得。當載入DLL文件時調用Kernel32.LoadLibraryA函數,經過下圖中的層層調用最終執行ntdll.LdrLoadDll函數。

由於ntdll.LdrLoadDll函數的返回地址「7c9364ee」被修改為跳轉到wwlib.1000168E地址。「熱修補程式」設置成功後只要進行載入DLL動作即可觸發惡意程式碼,下面是對惡意程式碼下斷點分析的內容。
解密執行shellcode
惡意程式碼首先將修改過的ntdll函數返回地址恢復,對比上一節的圖片可知將「E9 9B B1 6C 93」恢復為「C2 10 00 90 90」。

將解密後的shellcode拷貝到新開闢的記憶體空間並執行。

啟動執行緒進行連接C2操作。

獲取網卡資訊。

執行緒解密C2地址後啟動新的執行緒進行網路操作。

請求地址https:// cloud.doomdns.org/hk12獲取下一階段shellcode程式碼。

執行下載的shellcode程式碼。

總結
詳細分析後發現這並不是一個簡單的DLL劫持操作,而是通過精心構造的跳轉執行惡意程式碼。shellcode程式碼雖然有很多層,但是執行邏輯與程式碼風格基本相同。只要耐下心來,一層一層跟下去就能找到惡意程式碼的執行邏輯。
想到很多朋友不能在VirusTotal直接下載樣本,筆者將本文的樣本放置在github上供大家學習研究。本文種若有遺漏錯誤之處,歡迎大家批評指正、留言交流。
樣本地址:
https://github.com/ShareSample/Hot-Patch-Sample
IOC
3061f320d47a6c985bd219f5ac14ff8a cloud.doomdns.org https:// cloud.doomdns.org/hk12
*本文原創作者:DD黃藥師BB,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載
