基於Python的逆向工程1:ELF文件

Python 腳本語言 GCC Python部落 2019-06-23
基於Python的逆向工程1:ELF文件

當解決複雜的逆向問題時,我們常使用radare2或IDA等成熟工具進行反彙編和調試。但有時也需要深入挖掘並瞭解它們是如何運作的。

編寫一些反彙編腳本對於自動化某些流程非常有用,並且可以形成自己的逆向工具鏈。至少,這是我現在正在嘗試的事情。

配置環境

如標題所說的那樣,你需要先安裝Python 3。如果你無法確定是否安裝了Python 3,可以運行如下命令:

基於Python的逆向工程1:ELF文件

其中capstone是反彙編引擎,將使用腳本和pyelftools來幫助解析ELF文件。

配置完成後,我將以一個基本的逆向問題為例進行演示。

基於Python的逆向工程1:ELF文件

用GCC/Clang進行編譯:

基於Python的逆向工程1:ELF文件

創建腳本

首先,來看一下二進制文件中不同的節(section)。

基於Python的逆向工程1:ELF文件

上述腳本遍歷了所有的節,並說明了文件加載位置,這些將在後續非常有用。運行此腳本將獲得如下結果:

基於Python的逆向工程1:ELF文件

其中大多數無需關注,但有一些節需要特別注意。.text包含指令(操作碼);.data用於在編譯時初始化字符串和常量;.plt是過程鏈接表,而.got是全局偏移表。 不清楚之處請閱讀ELF文件格式及其內部結構。

既然.text有操作碼,那麼可以從該地址開始反彙編二進制文件。

基於Python的逆向工程1:ELF文件

代碼很簡單吧(我是這麼認為的哈),下面來跑跑看這段代碼吧~

基於Python的逆向工程1:ELF文件

加粗的部分其實相當有趣呢。[rip + 0x200916]的地址相當於[0x6ca + 0x200916],後者的計算結果為0x200fe0。那麼第一次調用函數是在0x200fe0嗎?這個功能有什麼用呢?

為此,需要來重定位一下。引自linuxbase.org

重定位是將符號引用與符號定義連接的過程。例如,當程序調用函數時,相關的調用指令必須在執行時將控制轉移到正確的目標地址。可重定位文件需要有“重定位入口”,因為它們包含描述如何修改每個節內容的信息,從而允許可執行文件和共享對象文件保存進程程序映像的正確信息。

為了找到這些重定位入口,編寫腳本如下:

基於Python的逆向工程1:ELF文件

首先遍歷各個節,檢查它是否屬於RelocationSection類型。 然後遍歷每個節的符號表中的重定位。最終運行結果如下:

基於Python的逆向工程1:ELF文件

還記得之前在0x200fe0處的函數調用嗎?是的,這就是對那個大名鼎鼎的__libc_start_main的調用。參考linuxbase.org

__libc_start_main函數會執行任何必要的執行環境的初始化,傳入適當的參數調用main函數,並處理main的返回。如果main函數返回,則返回值應傳遞給exit函數。

它的定義如下:

基於Python的逆向工程1:ELF文件

再來回顧一下我們的反彙編結果:

基於Python的逆向工程1:ELF文件

但這次是在lea或Load Effective Address指令處,它將一些地址[rip + 0xe6]加載到rdi寄存器中。 [rip + 0xe6]的計算結果為0x7aa,恰好是main函數的地址!你問 我怎麼知道的? 因為__libc_start_main在執行任何操作之後,最終會跳轉到rdi處的函數,這通常就是main函數。它看起來就像這樣。

如果想查看main的反彙編,可以在之前編寫的腳本(disas1.py)的輸出中尋找0x7aa。

根據之前的驗證,每個調用指令都指向那些有重定位入口的函數。因此,每次調用它們的重定位會獲取如下結果:

基於Python的逆向工程1:ELF文件

綜上所述,這個問題是不是開始有些頭緒啦。這裡我要重點講一講反彙編的關鍵節(section),這些都是不言而喻的。

基於Python的逆向工程1:ELF文件

填充*pw字符串的循環:

基於Python的逆向工程1:ELF文件

這看起來有點兒像strcmp:

基於Python的逆向工程1:ELF文件

我不確定為什麼它會在這裡使用put? 我也許遺漏一些東西,或許是printf調用了put,不過我可能是錯的。 我還用radare2確認那些位置實際上是"haha yes!"和"nah dude"字符串。

總結

這確實花了一些時間呢,不過我還是完成了。如果你是一個初學者,對這些感到非常的困惑,或者甚至不知道本文在講些什麼,這都無傷大雅。要掌握反彙編需要多多實踐,我也不是很擅長呢。

文中的源碼可以在這裡找到:

https://github.com/icyphox/asdf/tree/master/reversing-elf

以上是本文的全部內容,我們將在系列文章2-《PE文件》再會。

英文原文:https://icyphox.sh/blog/python-for-re-1/
譯者:我是暱稱耶~

相關推薦

推薦中...