翻譯:看雪翻譯小組-玉林小學生
校對:看雪翻譯小組-Nxe 譯自英文-Ghidra是由國家安全局開發的免費開源逆向工程工具。這些二進製文件是在2019年3月的RSA大會上發布;這些資源在一個月後發佈在GitHub上。許多安全研究人員將Ghidra視為IDA Pro和JEB Decompiler的競爭對手。該軟件是使用用於GUI的Swing框架用Java編寫。
歡迎來到Ghidra逆向工程系列教程第一部分!本系列教程關注於如何使用NSA發布的新逆向工具來逆向windows可執行程序。目的是引導新手進入逆向工程領域,並為逆向高手重點介紹Ghidra的獨特功能。
本文將向你介紹Ghidra中的許多主窗口,後面是一個使用它逆向簡單CreakMe二進製文件的教程。本系列教程中,我們的所有樣例都運行在Windows主機上。你可以在這裡找到一個使用免費版Windows 64位系統的虛擬機。或者,你更喜歡在你的本地機器上直接運行,也沒問題!在介紹開始前,我們先獲取最新版本的Ghidra並運行。 安裝Ghidra
首先,Ghidra需要預先安裝好一些依賴軟件。Ghidra需要JDK 11,從這裡下載、安裝並運行它。安裝完JDK成後,從官方頁面獲到Ghidra最新版本。下載完成後,解壓文件並雙擊“runGhidra.bat”來啟動Ghidra。首次運行應該會看到用戶協議,在一些加載過程後,你會看到彈出項目窗口。如果對安裝或其它上面的操作有問題,在這裡查看說明文檔。
你的第一個項目,IOLI CreakMe
在項目窗口中可以加載二進製文件並組織項目內的文件。文中涉及的Windows二進製文件可以在這裡的“IOLI-crackme/bin-win32”目錄下找到。創建一個新項目並在下一步中使用Ghidra的batch import功能一次性導入所有文件。在project窗口,選擇“File > Batch import…”,瀏覽“bin-win32”目錄並選擇要導入的所有文件。等待操作完成,可以看到CreakMe文件被加載了。
第一次,我們從“crackme0x00.exe”開始,雙擊它將打開code browser。會彈出一個消息框詢問你是否分析二進製文件,選擇“Yes”後你會看到可以執行的不同類型分析。對於本項目選擇默認的即可,選擇“Analyze”並等Ghidra完成。當全部完成後,可以在code browser中看到加載的二進制彙編代碼及主窗口。
主窗口:Program Trees、Symbol Trees和Data Type Manager
讓我們來看看Ghidra在代碼瀏覽器中提供的主要窗口。Ghidra的一個有趣地方是上下文幫助菜單。對於大多數界面元素,你可以在懸停於上面時按F1來調出一個幫助嚮導,裡面可能有你想知道的東西。下圖嘗試使用上下文幫助來學習關於“Program Trees”窗口的更多知識。
在“Program Trees”窗口中,可以通過右鍵點擊“crackme0x00”目錄來以不同方式組織反彙編代碼的各個sections。可以點擊“Modularize By”並選擇“Subroutine”、“Complexity Depth”或“Dominance”。你也可以創建新目錄並根據自己的組織愛好拖拽各個sections。 “Program Trees”窗口下面的窗口是“Symbol Tree”窗口,從裡面可以看到二進製文件的導入、導出、函數、標籤、類和命名空間信息。擴展“Imports”節來查看目標程序使用的各種DLL和函數。如果你想看某個導入的函數在哪裡被調用,可以右鍵該函數並點擊“Show references to”,然後雙擊列出的條目以查看完整內容。 從“Data Type Manager”中可以查看所有定義的類型,包括內建類型,二進製文件特有類型和其它人工包含進Ghidra的類型(如在這裡看到的Windows下叫做“windows_vs12_32”的類型)。擴展書本樣式按鈕並右鍵一個數據類型,點擊“Find uses of”可以查看該數據類型在二進製文件的哪裡被使用。 主窗口:反彙編列表和函數圖
現在,我們看看最吸引人的地方,“Listing”窗口。在這裡,你可以看到反彙編代碼然後慢慢理解二進制代碼的每一部分功能。Ghidra向你提供了許多自定義listing窗口的方法,可以點擊右上方的“Edit the listing fields”圖標並點擊“Instruction/Data”標籤頁。Listing界面上的每個元素都可以修改大小、移動、禁用或刪除。也可以通過右鍵菜單來增加新元素。可以嘗試下修改“Address”域的大小使其更小,並刪除“Bytes”域。
可以通過在彙編代碼的任一位置右鍵看到listing窗口的上下文菜單。可以執行修改指令、設置書籤、註釋和編輯標籤功能。嘗試在listing窗口右鍵一個彙編指令並增加一個註釋。你可以通過雙擊CALL指令引用的函數來到達函數代碼以了解函數的功能。通過點擊左上方保存圖標旁邊的箭頭按鈕來實現向前、向後跳轉,或者使用快捷鍵“Alt-左箭頭按鍵”和“Alt-右箭頭按鍵”進行。試試看你能不能知道每個CALL .text指令調用的是哪個函數並通過編輯標籤來設置合適的函數名稱。嘗試增加一兩個註釋來描述不同代碼片段的功能。
熟悉IDA Pro的人喜歡首先查看圖形模式。Ghidra中對應的窗口是“Function Graph”窗口,該窗口可以通過點擊“Window”和“Function Graph”打開。函數圖可以使用“Edit the listing fields”來進行類似地自定義。Ghidra中的圖形默認不顯示註釋,可以使用域編輯器加入。你可能會注意到它的行為與IDA Pro的圖形模式有些不同,並且開始時不是全放大狀態。要配置函數圖,在圖形上點擊右鍵,選擇“Properties”然後在“View Settings”下拉列表中選擇“Start Fully Zoomed In”。
主窗口:反編譯
最後,我們在右邊看到反編譯窗口,其中是Ghidra估計的listing或unction graph窗口中的彙編代碼對應的高層代碼。嘗試在反編譯窗口高亮一個“if”表達式,你可以看到相應的彙編指令被高亮了。這是我最喜愛的Ghidra特徵之一,這在高級語言表達式和一組彙編指令之間建立了映射。
可以右鍵變量並重命名它們或者在反編譯中給變量增加註釋,這些操作也會在disassembly listing或function graph窗口中反應出來。Ghidra自動在這些窗口中進行同步。如果你想修改任一反編譯顯示選項,可以在窗口中點擊右鍵並選擇“Properties”。以更易理解的方式重命名本地變量,並查看進行的修改是否也在listing窗口顯示。
解決CreakMe
如果你到了這裡,你已經了解了Ghidra的主要界面並準備好了解決CreakMe(如果你還沒有)。運行crackme0x0.exe文件看看程序運行的結果。你被要求輸入一個密碼,根據輸入進行判斷,如果輸入不正確,返回“Invalid Password!”消息。
我們先通過在“Window > Defined Strings”窗口查看程序的字符串。可以看到在命令行中顯示的字符串。我們查看引用“Password”字符串的彙編代碼。在“Defined Strings”窗口右鍵“Password”項,會跳轉到程序中代碼段所在的節。
左鍵地址並選擇“References > Show References to Address”,你可以點擊列出的引用“Password”的代碼段中的項。找到比較用戶輸入和正確密碼的代碼段。重命名變量和函數為更有意義的名字並增加註釋來幫助分析。
在引用“Password”的地方後面,有一個scanf調用來獲得用戶輸入,之後還有一個strcmp。可以看到用戶輸入保存在EAX中並保存在本地變量local_40中。字符串“250382”存儲在本地變量local_3c中,這兩個變量都被傳輸給strcmp。如果比較函數返回的結果是0,打印“Password OK ”。否則,執行jmp指令並打印“Invalid Password!”。再次運行“crackme0x00.exe”,輸入“250382”,成功。
課程總結&回顧
我們使用Ghidra解決了第一個CrackMe!祝賀你和我們一起走到這裡。用於逆向工程這個程序的通用方法如下:
- 嘗試運行,分析在目標中可以發現哪些數據、字符串。
- 根據感興趣的數據、字符串的引用到達相關彙編代碼。
- 推測彙編代碼中的函數和變量表示什麼。
- 通過註釋和重命名函數、變量給代碼增加說明,隨著對程序理解的提高,對其進行回顧和修改。
- 使用逆向過程獲得的理解來回答已定義的問題(正確的密碼是什麼?)
我們還學習了Ghidra的主窗口和部分功能,如:
- 如何創建項目和導入文件
- Program Trees,Symbol Trees,Data Type Manager窗口和接口
- 自定義assembly listing窗口並增加註釋
- 自定義function graph窗口並修改首選項
- 反編譯窗口及它如何與listing窗口、function graph窗口同步
結論&延伸閱讀
如果你是逆向新手,這第一篇文章能夠讓你輕鬆進入該領域,並且第一次嘗試到CreakMe的勝利。如果你是一個逆向老手,期望你能獲得如何在每日的逆向任務中使用Ghidra的思路,並且熟悉其主要的UI元素。感謝閱讀本教程。 閱讀下一部分,點擊這裡(看雪翻譯版),我們將討論轉換、應用數據類型,函數調用樹、圖和腳本管理器有關內容。
|