前言
首先如果大家遇到elf二進位制檔案的逆向首先考慮的可能就是通過ida進行靜態逆向分析演算法,那麼我們首先就要了解elf(executable
and linking format)的檔案格式。
elf檔案格式主要分為以下幾類:
1. 可重定位檔案(relocatable file),這類檔案包含了**和資料,可以被用來鏈結成可執行檔案或共享目標檔案,靜態鏈結庫也可以歸為這一類,如.o檔案。
2. 可執行檔案(executable file),這類檔案包含了直接執行的程式,如/bin/bash等。
3. 共享目標檔案(shared object file),鏈結器可以使用這種檔案跟其他的可重定位檔案和共享目標檔案鏈結,產生新的目標檔案;動態鏈結器可以將幾個共享目標檔案與可執行檔案結合,作為程序映像的一部分來執行,如glibc***.so。
4. 核心轉儲檔案(core dump file),當程序意外終止時,系統可以將該程序的位址空間內容及終止時的一些其他資訊轉儲到核心轉儲檔案。
一.elf檔案格式詳解
以上是elf檔案格式結構示意圖
檔案標頭檔案頭的結構定義如下所示:
typedef struct elf32_ehdr;
利用readelf命令可以檢視elf檔案的頭部資訊,大家可以對照著看
結構的各個成員的含義如注釋中所解釋的。對elf檔案,有兩個檢視,乙個是從裝載執行角度的,另乙個是從連線角度的。從裝載執行角度,我們關注的是程式頭表,由程式頭表的指引把elf檔案載入進記憶體執行它。從連線的角度,我們關注節頭表,由節頭表的指引把各個節連線組裝起來。e_type的值與這兩個檢視相聯絡,由它我們可以知道能夠從哪個檢視去解讀。
如果e_type=1,表明它是重定位檔案,可以從連線檢視去解讀它;
如果e_type=2,表明它是可執行檔案,至少可以從裝載執行檢視去解讀它;
如果e_type=3,表明它是共享動態庫檔案,同樣可以至少從裝載執行檢視去解讀它;
如果e_type=4,表明它是coredump檔案,可以從哪個檢視去解讀依賴於具體的實現。
如上圖顯示的是可執行檔案那麼我就要從裝在執行檢視去解讀它
按照這兩個檢視,整個elf檔案的內容這樣來組織:
首先是elf檔案頭,也就是上面的elf32_ehdr結構。或者對64位的elf檔案,是elf64_ehdr結構。elf檔案頭位於檔案開始處,無論e_type的值是什麼,它是必須有的。
其次是程式頭表,對可執行檔案(e_type=2)和動態庫檔案(e_type=3),它是必須有的。對重定位檔案(e_type=1),程式頭表的有無是可選的。例如用gcc的-c選項生成的.o檔案,就沒有程式頭表。但無論如何,e_phoff和e_phnum、e_phentsize給出了elf檔案的程式頭表資訊。沒有程式頭表時它們的值為零。
然後就是就是節頭表,對可執行檔案和動態庫檔案,它的有無是可選的,對重定位檔案,它是必須有的。
program header table
每個程式頭表的每個表項的結構為:
typedefstruct
elf32_phdr;
那什麼是所謂 sections 呢?可以說,sections 是在elf檔案裡頭,用以裝載內容資料的最小容器。在elf檔案裡面,每乙個 sections 內都裝載了性質屬性都一樣的內容,比方:
1) .text section 裡裝載了可執行**;
2) .data section 裡面裝載了被初始化的資料;
3) .bss section 裡面裝載了未被初始化的資料;
4) 以 .rec 打頭的 sections 裡面裝載了重定位條目;
5) .symtab 或者 .dynsym section 裡面裝載了符號資訊;
6) .strtab 或者 .dynstr section 裡面裝載了字串資訊;
7) 其他還有為滿足不同目的所設定的section,比方滿足除錯的目的、滿足動態鏈結與載入的目的等等。
section heafer table
每個節頭表的每個表項的結構為:
typedefstruct
elf32_shdr;
這裡我們來討論一下連線檢視中section與裝載執行檢視segments之間的關係。
鏈結器在鏈結可執行檔案或動態庫的過程中,它會把來自不同可重定位物件檔案中的相同名稱的 section 合併起來構成同名的 section。接著,它又會把帶有相同屬性(比方都是唯讀並可載入的)的 section 都合併成所謂 segments(段)。segments 作為鏈結器的輸出,常被稱為輸出section。
乙個單獨的 segment 通常會包含幾個不同的 sections,比方乙個可被載入的、唯讀的segment 通常就會包括可執行**section .text、唯讀的資料section .rodata以及給動態鏈結器使用的符號section .dymsym等等。section 是被鏈結器使用的,但是 segments 是被載入器所使用的。載入器會將所需要的 segment 載入到記憶體空間中執行。和用 sections header table 來指定乙個可重定位檔案中到底有哪些 sections 一樣。在乙個可執行檔案或者動態庫中, program header table中包含有 segments。
在當我們執行命令readelf -l讀取程式表頭的時候,結果顯示,在可執行檔案中,總共有8個 segments程式頭。同時,該結果也很明白顯示出了哪些 section 對映到哪乙個 segment 當中去。比方在索引為2的那個segment 中,總共有18個 sections 對映進來,其中包括我們前面提到過的 .text section。注意這個segment 有兩個標誌: r 和 e。這個表示該segment是可讀的,也可執行的。如果你看到標誌中有w,那表示該segment是可寫的。
逆向工程之ELF檔案格式分析
1.elf全稱executable and linkable format,可執行連線格式,elf格式的檔案用於儲存linux程式。elf檔案 目標檔案 格式主要三種 一般的 elf 檔案包括三個索引表 elf header,program header table,section header t...
ELF檔案分析
乙個程式要想執行,首先要載入到記憶體中,程式的pc指標指向記憶體中的 在執行的時候會使用記憶體中的資料。所以elf檔案主要包含 和資料。資料可以分為兩類 靜態資料。動態資料。什麼是動態資料?動態資料程式執行過程中產生,在堆或者棧上分配記憶體。而靜態資料則不然,靜態資料在 編譯完成後,就應該確定使用的...
ELF檔案逆向IDA的使用
elf檔案格式分類 重定向檔案 relocation file 包含 和資料,如靜態鏈結庫 可執行檔案 executable file 共享目標檔案 shared object file 鏈結器使用這種檔案同其他可重定向檔案鏈結 核心轉儲檔案 core dump file 程式意外終止,系統將中斷狀...