ELF (Executable and Linkable Format)學習途徑與資源

陳孜穎
4 min readSep 27, 2018

--

前言

前陣子在嘗試反組編譯一個運行Android上的APP,過程中必須反組譯他的靜態函式庫來進一步了解其程式的運作。在解析反組譯的組語的時候遇到了一些問題,得近一步了解ELF(Executable and Linkable Format)的格式與運作方式。一開始嘗試了解的時候,發現資源很破碎,不知道該從何下手。所以決定寫一篇關於ELF學習的途徑與我目前學習的相關資源,讓想學的人可以少走一些迷糊路。

簡介

本篇主要是描述學習的順序,以及提供相關資源,只會放少少的篇幅來解釋ELF內容。

規格文件

既然要學習,就要有最完整的資料。但ELF很有趣,就如Wiki上所列,有一大堆不同版本、不同發行,發出來的規格文件(Specification)。以下給幾個我參考過的文件及來源網站。不過先別急著逐一看完,一開始直接看文件不是很容易懂。

  1. Tool Interface Standard (TIS) Portable Formats Specification, version 1.2
  2. System V ABI Edition 4.1
  3. ELF-64 Object File Format, Version 1.5 Draft 2 — — 64bits版本的文件
  4. https://refspecs.linuxfoundation.org/ — —可以找到與Linux相關的規範文件

程式碼片段

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的發行版安裝吧。

解析ELF必備知識

以下是幾個我認為初次認識ELF必須知道的關鍵知識。

Program Header 與 Section Header

ELF有兩種header table,Program header table和Section header table。

Layout of an ELF file — By Surueña — Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=2922583
  • 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的實作程式碼片段一起使用。

--

--

陳孜穎
陳孜穎

Written by 陳孜穎

我是位軟體工程師。長期關注勞交通和性別平等等議題。期望社會中的不平等可以越來越少,達到「人生而平等」這崇高的終極目標。

No responses yet