1. 程式人生 > >ELF64檔案逆向分析知識—[0]搭建動態除錯環境

ELF64檔案逆向分析知識—[0]搭建動態除錯環境

之前一直學習Windows下的32位PE檔案的逆向,已經可以通過Ollydbg和IDA結合分析可執行檔案的邏輯。最近需要逆向分析一個Linux下的64位ELF可執行檔案,發現了很多問題,下面是我分析和解決過程。

搭建動態除錯環境

第一個問題擺在了我的面前,Ollydbg不能除錯Linux的ELF可執行檔案。Ollydbg提供了方便的除錯介面,讓我們很容易通過檢視暫存器、棧和記憶體來分析程式的執行細節,這極大的增加了我們分析的效率。所以我在分析過程中都是使用動(使用Ollydbg進行動態除錯)靜(使用IDA進行靜態分析)結合的方式逆向分析。

通過查詢資料發現在Linux提供了一個可以進行彙編除錯的強大工具—GDB。我嘗試了用GDB進行動態除錯,發現對於Linux新手來說這個過程真的很痛苦,當執行一條指令或一個函式前,需要記錄我們要觀察的記憶體位置(包括棧記憶體)和暫存器,執行後再次檢視它們的變化,這個過程既麻煩又不直觀,尤其是分析緩衝區溢位之類的問題。可能是自己對Linux作業系統的使用不熟悉的緣故,那還有其他辦法麼?

終於我找到了一個解決辦法,使用IDA提供的遠端除錯功能。通常我們知道IDA提供的靜態分析能力,其實IDA也提供了一個偵錯程式,只是由於Ollydbg的存在,掩蓋了它的風采(當我學習了IDA的偵錯程式後發現這個偵錯程式也有自己的獨到之處)。好的,接下來就把我搭建除錯環境的過程分享給大家。

安裝Linux

我們可以通過Linux下的file和strings工具配合,來得到除錯檔案的資訊,進而選擇要安裝的Linux。

先看下file工具的提示的資訊: 


這裡需要主要關注以下資訊:

資訊                      解釋
ELF 64-bit           說明編譯連結成可執行是在64位的Linux進行的。
x86-64                 說明了CPU的型號。
statically linked    說明程式採用的是靜態連結
Stripped               說明最終的可執行檔案去除了符號表和重定位資訊,(使用 -s 選項)


再用strings工具檢視更詳細的作業系統資訊:

我們只能謝天謝地,這個GCC資訊沒有在去除符號時被刪除,根據上面的提示資訊我們已經縮小了可執行檔案使用的作業系統版本和GCC編譯器的版本,這裡我選擇的安裝CentOS-6.5-x86_64這個版本。

Note:精確選擇Linux版本並不是除錯所必須的,只要除錯檔案可以在Linux執行就可以,這裡這麼做是為了後面方便製作C靜態標準庫的簽名檔案。更詳細請看後面的內容。


安裝除錯服務端程式

在IDA的安裝目錄/dbgsrv/找到linux_server或linux_serverx64這兩個檔案,具體選擇哪個檔案需要視待分析的ELF檔案的編譯資訊而定,根據第一步中得出的資訊,我需要選擇的是linux_serverx64,把待分析的可執行檔案和linux_serverx64一起拷貝到裝好的Linux中。然後執行linux_serverx64: 


這樣我們就在Linux中開啟了遠端除錯埠,這個埠是預設的也不需要我們修改(其 
實這個過程和我們用VS遠端除錯VC++程式很類似)。

配置客戶端除錯選項

配置好除錯的服務端後,接下來開始配置客戶端IDA,正常啟動IDA開啟【Debugger】-【Run】-【Remote Linux debugger】來設定除錯選項:

其中,填入資訊如下:

選項                              應填入的資訊
Application             帶除錯檔案在Linux上的路徑(包括帶除錯檔案).
Directory                除錯檔案所在的資料夾路徑.
Parameters            執行引數,例如執行可執行檔案時傳遞到main函式的命令引數.
Hostname               Linux的IP地址.
Port                        Linux的埠,這裡預設即可,和Linux上執行的linux_serverx64開啟的埠一致.
Password               Linux登陸密碼.


Note:上述設定,預設Linux是以root許可權開啟的,其他使用者許可權需要自己嘗試設定。
設定好後,點選【OK】就啟動了除錯,看下除錯介面: 


佈局和Ollydbg基本上是一樣的,我們很容易找到熟悉的四個視窗。

除錯指令

介紹一下常用的除錯指令:

除錯指令                                           說明
單步步入(F7)                 執行下一條指令,若遇到函式,將進入函式程式碼內部,停在函式的第一條指令.
單步步過(F8)                 執行下一條指令,若遇到函式,僅執行函式自身,不進入函式內部.
終止(CTRL-F2)              終止一個正在執行的除錯程序.
繼續(F9)                        繼續執行一個暫停的程序。執行將繼續直到遇到一個斷點、使用者暫停或終止執行或該程序自行終止.
暫停( )                           暫停一個正在除錯的程序.
執行至返回(CTRL-F7)    一直在函式程式碼內部執行,直到遇到RETN(或斷點)時才停止.

斷點

和Ollydbg一樣,可以在選中的指令記憶體位置通過F2快捷鍵,設定軟體斷點。設定成功後,會以紅色凸顯(藍色凸顯的是將要執行的下一條指令)。可以通過【Debugger】-【Breakpoints】-【Breakpoint list】檢視程式中當前已經設定的所有斷點:

我們可以編輯我們設定的斷點,在【Breakpoint list】中選中要編輯的斷點,右鍵選單選擇【Edit…】即可開啟編輯視窗: 


在這個視窗中我們看以看到,通過【Condition】欄可以為斷點設定條件,這樣斷點就轉化成“條件斷點”。在【Settings】中勾選【Hardware】後軟體斷點轉化成“硬體斷點”,這是【Hardware breakpoint mode】選項將會被啟用,來設定硬體斷點必須指定行為。

更多的除錯功能需要大家在除錯過程中慢慢摸索。
--------------------- 
作者:杏林小軒 
來源:CSDN 
原文:https://blog.csdn.net/txx_683/article/details/53454139 
版權宣告:本文為博主原創文章,轉載請附上博文連結!