前言
前陣子在嘗試反組編譯一個運行Android上的APP,過程中必須反組譯他的靜態函式庫來進一步了解其程式的運作。在解析反組譯的組語的時候遇到了一些問題,得近一步了解ELF(Executable and Linkable Format)的格式與運作方式。一開始嘗試了解的時候,發現資源很破碎,不知道該從何下手。所以決定寫一篇關於ELF學習的途徑與我目前學習的相關資源,讓想學的人可以少走一些迷糊路。
簡介
本篇主要是描述學習的順序,以及提供相關資源,只會放少少的篇幅來解釋ELF內容。
規格文件
既然要學習,就要有最完整的資料。但ELF很有趣,就如Wiki上所列,有一大堆不同版本、不同發行,發出來的規格文件(Specification)。以下給幾個我參考過的文件及來源網站。不過先別急著逐一看完,一開始直接看文件不是很容易懂。
程式碼片段
GNU C library實作ELF定義的程式碼也是很好的參考資料,可以快速找到自己想要了解的關鍵字
https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=elf/elf.h
輔助工具
readelf是一個在Linux上的內建程式,其指令及用法可以參考這裡。在Windows上我沒有尋找相關工具,既然要研究的對象是ELF那就到Microsoft Store上選一個Linux的發行版安裝吧。
Program Header 與 Section Header
ELF有兩種header table,Program header table和Section header table。
- Program header table:程式載入時給linker讀取,以尋找需要的section
- Section header table:給程式(如readelf)或人分析檔案用
同一個Section在兩種不同的header table中可能會被標記在檔案的不同位置,由於運行的時候linker式讀取progran header table,所以section所在檔案中的位置要以progran header table為主。可以參考我遇到的問題:ELF — The start address of .got section is different from the entry point address of the GOT(global offset table)
PLT和GOT機制
PLT(Procedure Linkage Table)和GOT(Global Offset Table)在連結外部動態函式庫中扮演必要的角色,反組譯ELF時幾乎必定碰到。其運作方式請參考:Shared Library 中 PLT 和 GOT 的使用機制
後記
了解必備知識之後,接下來就可以開始嘗試分析ELF了,從嘗試中繼續學習,記得搭配ELF的格式文件和GNU C library的實作程式碼片段一起使用。