標籤:

手把手教您玩轉Malwarebytes CrackMe (下篇)

在上一篇文章中,我們詳細介紹了解決Malwarebytes CrackMe挑戰第一階段任務的相關方法,如查找關鍵變數和引用,了解變數的用途和填充方式等。在本文中,我們將繼續為讀者詳細介紹完成第二階段任務的具體過程。

檢查流量

我們已經知道,該軟體將從互聯網上下載一些東西(使用解密的URL),所以,如果對這些網路流量進行仔細檢查的話,應該會有所幫助。當然,檢查URL的方法有很多種,比如,我們可以藉助於Wireshark或Fiddler(鏈接地址:telerik.com/fiddler)來完成這項任務:

請求和應答:

我們看到,內容是從網址pastebin.com/raw/9FugFa下載的。

這些內容經過了Base64編碼,但是用Base64解碼器(鏈接地址:freeformatter.com/base6)解碼後,得到的結果還是不像明文(據我們猜測,原因是這些內容經過了壓縮處理和/或進一步的加密)。那麼,讓我們再次深入考察這個應用程序!

了解payload

首先,讓我們來做一些靜態分析,以便了解這個payload到底是幹什麼的,以及其具體用法。好了,讓我們來查找初次顯示「Nope :(」消息框的位置。我們看到,這裡有一項用於確定緩衝區是否從"MZ"開始的檢查。眾所周知,MZ是一個著名的魔術數字,它位於DOS應用程序以及Windows可執行文件(PE文件)的開頭部位。

通過仔細觀察這個函數,我們會發現,處理這個下載的文件的函數為數不多。

首先,需要用一個函數進行base64解碼。然後,輸出未壓縮的文件:

通過查看裡面的內容,同時根據發現的諸如RtlDecompressBuffer之類的API調用,我們可以判斷出,這個函數負責解壓縮工作:

然後,我們注意到一個從剪貼板中讀取內容的函數:

進入該函數後,我們也可以很輕鬆地找到相關的API調用,例如:

我們發現,從剪貼板中讀取內容的格式為CF_TEXT。

然後,我們發現從剪貼板讀取的內容會用於另一個函數。這些內容將作為XOR密鑰來解密下載的內容:

注意,這個結果是從「MZ」魔數開始的。此後,它將被注入rundll32。

在函數sub_4011F0的內部,我們可以看到具體的注入機制。這裡使用的是一種經典的RunPE技術。新進程被創建後,會被立即掛起。然後,payload會被寫入該進程的內存空間,在鏈接到它的PEB後,該進程會恢復運行:

當然,這裡不會對該技術做更加詳細的解釋,因為這超出了本文的範圍(如果讀者對此非常感興趣的話,可以訪問這裡(鏈接地址:adlice.com/runpe-hide-c))。但是,脫殼實際上是非常容易的——我們只需要在解密之後轉儲payload,然後轉換為虛擬格式並寫入遠程進程即可。接下來,我將為讀者介紹一些可用的脫殼方法

對payload進行解密

在靜態分析過程中,我們發現了如下所示的信息:

· 通過解密後的URL下載payload

· 進行Base64解碼

· 利用RtlDecompressBuffer解壓縮

· 利用從剪貼板讀取密鑰進行XOR解密

現在,我們必須找到XOR密鑰。此外,我們還知道XOR操作是自我可逆的。但是,首先,我們要在解壓縮之後轉儲payload,以便可以得到需進一步分析的相關資料。

我將在調試器(例如ImmunityDbg)下運行修改版的CrackMe,並轉到API調用RtlDecompressBuffer處:

我在解壓縮函數的末尾設置斷點,然後運行CrackMe。

我們可以在堆棧上看到傳遞給函數的相關變數。現在,我們來看看未經壓縮的緩衝區:

我們可以看到一些重複的模式和字元串「malwarebytes」。不難猜到,這可能就是通過剪貼板傳遞的XOR密鑰。雖然我們可以選擇不同的脫殼方法,但是限於篇幅,這裡只演示其中的一種。

對經過了XOR混淆處理的payload進行解碼

對緩衝區進行解壓後,我們把它轉儲到一個文件中,然後利用外部工具dexor.py(鏈接地址:github.com/hasherezade/)來進行解碼。

首先,我們來轉儲緩衝區:

然後,我們必須進行相應的調整,以使其起始地址與相應的偏移量相匹配。我們可以通過在XVI32 hexeditor中打開轉儲的內存頁面,導航到輸出緩衝區的開始部分,然後選擇:

Edit->Dump to cursor

然後,我們可以通過腳本和XOR密鑰輕鬆進行解碼。就本例來說,我們可以很容易地猜到,密鑰就是「malwarebytes」,因為這個字元串在解碼後的緩衝區中重複出現了許多次。

dexyor.py –file dump.bin –key "malwarebytes"

正如我們預期的那樣,根據之前的發現,解碼後的輸出內容是一個新的PE文件。

第二階段

第二階段的任務,將在新得到的可執行文件中完成。在我們完成轉儲之後,可以把它作為一個完全獨立的模塊來運行。 運行後,它會彈出以下消息:

讓我們利用IDA打開它,以便於進一步的觀察。這個文件沒有被混淆,並且結構非常簡單。

了解檢查條件

首先,我們終於明白為什麼之前會顯示「Fail」消息了。這裡,它做的第一件事情,就是檢查模塊路徑,並與rundll32.exe的路徑進行比較。這項檢查並非直接比較字元串,而是計算路徑的校驗和,然後比較校驗和:

簡而言之,如果當前的PE沒有被注入到rundll32.exe中,那麼檢查將會失敗,從而導致前面介紹過的消息框。現在,我們想要將這個PE文件作為獨立的單元運行,而不是通過rundll32來運行。 所以,我們需要擺脫這個檢查。 我們可以通過直接修改條件跳轉來達到這一目的(與我們在第一階段修改條件跳轉的方式是相同的)。

或者,我們可以利用調試器載入可執行文件,在檢查點上設置斷點,並更改標誌以繞過它。

為了彈出旗標,還需要滿足兩個條件:

1.系統中必須運行著一個使用給定類型的窗口的進程。

首先,調用EnumWindows函數。相應的校驗和位於回調函數的參數中:

在回調函數中,將每個窗口的類名與相應的校驗和進行比較。如果匹配,則打開相應的進程,以便於進行下一步的注入工作:

有人可能會注意到,這個檢查的實現代碼與這裡的代碼(鏈接地址:github.com/hasherezade/)非常相似。相應的窗口類屬於ProcessExplorer。

2.應用程序必須載入到調試器中。

檢查到調試器的存在後,它會設置影響XOR密鑰值的旗標。

如果我們在調試器下運行可執行文件和ProcessExplorer(32位)的話,帶有旗標的MessageBox將被注入到那裡,我們將立即得到答案。

轉儲並運行shellcode

如果我們運氣好的話,我們可能會很快找到它。但是在現實生活中,找到必須注入的那個進程可能會有些難度。此外,在64位版本的Windows上運行CrackMe的用戶也會遇到問題,因為這個shellcode是32位的,只能注入到32位版本的Process Explorer中。但是,為了解決這個問題,根本就不需要知道進程的名稱。我們可以在注入之前轉儲shellcode,並用我們自己的loader進行載入。

首先,我們看看IDA,這裡要注意注入代碼的那部分。之前,計算出來的shellcode的校驗和為:

所以,現在我們已經將有效的shellcode存儲到了緩衝區中。我們並不關心它被注入的位置——我們可以將其轉儲,然後運行它。為此,我們只需要繞過基於給定校驗和的窗口搜索就行了。我們可以通過修改條件語句來達到目的(或者在調試器中更改相應的旗標)。下面是必須修改的條件語句:

在附加的視頻中,我們可以看到完整的解決方案:轉儲shellcode並獨立運行。在這個給定的例子中,shellcode是在PE-bear的幫助下,作為一個新節被添加到原始的CrackMe中

這樣,我們就會得到最終的旗標:

小結

在本教程中,我們詳細演示了CrackMe的一個可行解決方案。我建議你看看下面的Write Up,從而學習不同的觀點,掌握更多的解決方法。當然,我鼓勵讀者親自動手嘗試一下,並將自己的解決方案寫下來,因為這是最好的學習方式。

附錄

下面是我們收到的一些Write Up:

mauronz.github.io/mb-cr – by @FraMauronz

drive.google.com/file/d – by @JR0driguezB

drive.google.com/file/d – by @ShAd0wHuNt3r_0

29wspy.ru/reversing/Sol – by @ValthekOn

本文翻譯自:blog.malwarebytes.com/m,如若轉載,請註明原文地址: 4hou.com/%e7%a0%b4%e8%a 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

Understanding the Security Threats of Dangling DNS Records - Week 8
揭秘無文件惡意軟體的前生今世
熊貓燒香技術含量高嗎?高在哪裡?
曾入侵CIA和FBI的黑客組織「Crackas With Attitude」成員獲刑5年

TAG:信息安全 |