你會信任你的AutoIT反編譯程序嗎?
AutoIt 目前最新是v3版本,這是一個使用類似BASIC腳本語言的免費軟體,它的設計用於Windows GUI(圖形用戶界面)中進行自動化操作,利用模擬鍵盤按鍵,滑鼠移動和窗口/控制項的組合來實現自動化任務。而這是其它語言不可能做到或無可靠方法實現的(例如VBScript和SendKeys)。
Autoit3 Decompiler是一款功能強大的AutoIt3反編譯工具,可以反編譯由AutoIt編譯的exe程序,直接反編譯出源代碼!還帶有右鍵關聯功能,非常方便。
在Autoit3 Decompiler中,按「反編譯選中」或「反編譯當前」按鈕,還可以提取exe中的資源(圖片、exe等等)到文件夾。
Autoit3 Decompiler 主要功能簡介如下:
1. 支持全系列autoit3,包括v3.0.100.0 - v3.3.7.18,後續版本沒驗證是否支持,理論上是都支持的
2. 支持EXE及A3X文件反編譯 ;
3. 支持X86及X64格式反編譯 ;
4. 支持ANSI及UNICODE反編譯 ;
5. 支持帶密碼編譯,對於3.2.6.0之前版本可以讀取原始密碼,後續版本無法顯示密碼但可正常反編譯 ;
6. 支持代碼混淆,混淆程序反編譯後可讀性欠佳,但不影響重編譯及執行;
7. 支持反編譯後文件項信息即時預覽 ;
8. 支持反編譯後文件內容即時預覽 ;
9. 支持批量反編譯 ;
10. 支持命令行及圖形界面操作 ;
11. 支持滑鼠右鍵菜單集成。
在分析AutoIT編譯的惡意軟體樣本期間,會彈出一個消息框,指示在使用Exe2Aut反編譯器時可能執行的樣本。這引起了我對反編譯程序如何工作以及如何首先編譯AutoIt腳本的興趣。在本文中,我將解釋兩個最常見的AutoIT反編譯程序(Exe2Aut和myAut2Exe)是如何工作的,以及它們是如何被騙去反編譯一個誘餌腳本而不是真正的腳本。
什麼是「已編譯」 AutoIT可執行文件?
編譯後的AutoIT可執行文件基本上由兩部分組成:一個獨立的AutoIT解釋程序和作為PE文件中資源顯示的編譯腳本位元組碼。AutoIT的創建者已經採取了一些措施來防止簡單的反編譯,並對位元組碼應用了一種壓縮和加密的形式。位元組碼的解壓縮由編譯的AutoIT二進位文件執行,然後再解釋和執行。
現在,讓我們分析一下Exe2Aut反編譯程序。
如果要在反編譯期間動態分析Exe2Aut,則會注意到以下內容:
1. 將.tmp文件寫入%TEMP%文件夾;
2. 目標二進位文件作為Exe2Aut的子進程載入;
3. .tmp文件被注入目標二進位文件中;
4. 目標二進位文件會將反編譯的autoIT腳本寫入當前工作目錄。
因此,我們可以得出結論,Exe2Aut利用嵌入式解釋程序對腳本位元組碼進行解密和解壓縮,然後通過將動態鏈接庫(DLL)注入目標二進位文件來提取該位元組碼。這樣就鉤住了將執行位元組碼的函數,並將位元組碼解碼回函數名稱,從而使其成為一種動態方法。因此,可以添加代碼來檢測注入並更改其行為。這樣,我們可以欺騙Exe2Aut來反編譯誘餌腳本,而不是在運行應用程序時執行的真實腳本。
Exe2Aut注入模塊
那MyAut2Exe呢?
與Exe2Aut不同,MyAut2Exe無需嵌入式解釋程序就可以提取位元組碼資源並解壓縮和解碼。使其成為完整的靜態反編譯程序,因此沒有意外執行任何內容的風險。
MyAut2Exe比Exe2Aut更高級,它支持AutoIT和AutoHotkey編譯腳本的多個版本。因此,它具有更多設置來調整已編譯腳本代碼的提取和解壓縮。為了減少正確配置的麻煩,它提供了一個稱為「自動化」的功能。該暴力破解將強制反編譯程序設置,直到腳本成功反編譯為止。當使用「自動」功能時,MyAut2Exe解析可執行文件中的AutoIT魔術位元組碼簽名。一旦找到,它將提取並反編譯代碼。由於解析和反編譯會在魔術位元組碼序列首次出現時就停止了,因此只要將MyAut2Exe放置在比真實編譯腳本資源低的偏移量處,就可以很容易地誘使MyAut2Exe進行反編譯。
演示過程
雖然理論知識層面我們已經講得更清楚了,但是在網路安全領域,概念證明(POC)的價值遠遠超過任何理論。
這個想法是要使用三個不同的位元組碼來編譯AutoIt可執行文件,一旦被Exe2Aut或MyAut2Exe反編譯,其中一個誘餌腳本就會被反編譯,而不是真正的代碼。
如前所述,MyAut2Exe的誘餌腳本位於真實位元組碼之前。對於Exe2Aut,誘餌和真實腳本的腳本資源名稱將在運行時重命名,以使其反編譯錯誤的代碼。
我已經編譯了三種不同的AutoIt腳本,並將它們作為資源添加到.rsrc部分。其中兩個是誘餌腳本,而第三個是真實的腳本。然後,我將.rsrc部分的許可權設置為讀取/寫入可移植可執行文件(PE)頭。
真實和誘騙的腳本資源
接下來,我編寫了一個小的程序集shellcode來遍歷進程環境塊中的PEB_LDR_DATA結構,以檢查Exe2Aut注入的DLL是否存在。還可以在磁碟上搜索(UPX壓縮)DLL,因為在注入之前,它位於Windows%TEMP%目錄下的隨機文件名下。我之所以選擇這種方法,是因為它更可靠且更難檢測。遍歷進程環境塊以檢查所有已載入模塊中是否存在節名稱為.UPX0的已載入模塊,這是一種識別Exe2Aut注入模塊的更簡便的方法,因為其他所有DLL通常都不會被UPX壓縮。這個方法甚至可以檢測到各種各樣的Exe2Aut版本,而不僅僅是我使用的那個,甚至還有一些自定義的反編譯器。
創建了shellcode之後,我需要在準備好的可執行文件中找到一個位置,將我的shellcode注入其中。我在.text部分的末尾找到了一個大約210位元組的編解碼器,此時我的shellcode可以很容易地放入其中。為了執行我的shellcode,我決定在調用IsDebuggerPresent之後立即跳轉到它,並在執行完成後返回正常執行流程。
saveRegisters:
push ecx
push ebx
push edx
checkInjected:
mov ebx, fs:[0x30] ; Get PEB address
mov ebx, [ebx 0xC] ; Get LDR Table address
mov ebx, [ebx 0x14] ; first entry of LDR table. (the first entry is the that of the executable)
mov edx, [ebx 0x10] ; Store the offset in edx
; I need this later to calculate the offsets
; of the resource names
nextModule:
mov ebx, [ebx] ; Get address of next LDR entry
mov ecx, dword ptr ds:[ebx 0x28] ; Pointer of the module name
test ecx, ecx ; If the pointer is OxO it means we have reached
; the end of our LDR table and we want to
je restoreRegisers ; continue normal execution
mov ecx,dword ptr ds:[ebx 0x10] ; Get the modules base offset
mov ecx, dword ptr ds:[ecx 0x178] ; load a dword from the modules base offset 0x178
cmp ecx,0x30585055 ; and check if it is "UPX0"
je swapResouces
jmp nextModule
swapResouces:
mov byte ptr ds:[edx 0xc7656], 0x49 ; Replace the "1" for a "I" in "SCR1PT"
mov byte ptr ds:[edx 0xc765e] , 0x35 ; Replace the "S" for a "5" in "SCRIPT"
restoreRegisers:
pop edx
pop ebx
pop ecx
test eax, eax ; Restore the instructions that were overwritten by
jnz debugerIsPresent ; the jump to the codecave
jmp debugerNotPresent ; Return to the normal program flow
程序集shellcode(70位元組)
演示視頻可以點擊這裡,從以上POC中我們可以學到的是,我們不應該總是盲目地相信我們使用的工具。逆向工程師應該意識到他們的工具是如何工作的,以及他們如何可能被欺騙而返回具有誤導性的輸出結果。雖然這裡介紹的技巧可能會誤導兩個反編譯器,但它們不會影響沙箱中的動態分析結果。
參考及來源:https://unit42.paloaltonetworks.com/autoit-compiled-malware/
※攻擊者利用Bitbucket存儲大量惡意軟體,已感染全球超50萬台電腦
※CVE-2020-8417:WP Code Snippets CSRF RCE漏洞