ELF檔案格式分析

2021-08-20 05:34:51 字數 4587 閱讀 3179

elf檔案(目標檔案)格式主要三種:

1)可重定向檔案:檔案儲存著**和適當的資料,用來和其他的目標檔案一起來建立乙個可執行檔案或者是乙個共享目標檔案。(目標檔案或者靜態庫檔案,即linux通常字尾為.a和.o的檔案)

2)可執行檔案:檔案儲存著乙個用來執行的程式。(例如bash,gcc等)

3)共享目標檔案:共享庫。檔案儲存著**和合適的資料,用來被下連線編輯器和動態鏈結器鏈結。(linux下字尾為.so的檔案。)

一般的 elf 檔案包括三個索引表:

1)elf  header:在檔案的開始,儲存了路線圖,描述了該檔案的組織情況。

2)program  header  table:告訴系統如何建立程序映像。用來構造程序映像的目標檔案必須具有程式頭部表,可重定位檔案不需要這個表。

3)section  header  table:包含了描述檔案節區的資訊,每個節區在表中都有一項,每一項給出諸如節區名稱、節區大小這類資訊。用於鏈結的目標檔案必須包含節區頭部表,其他目標檔案可以有,也可以沒有這個表。

1、分析elf檔案頭(elf  header)

進入終端輸入:cd /usr/include/elf.h,檢視elf的檔案頭包含整個檔案的控制結構

順便選取乙個簡單**為例:

進行編譯執行,生成elf可執行檔案。

使用『readelf 』命令,得到下面的elf header標頭檔案的資訊,如下圖:

通過上圖資訊,可以得出elf header的size為64bytes,所以可以使用hexdump工具將標頭檔案的16進製表開啟。

如下圖使用:『hexdump –x elf1 –n 64』命令來檢視elf檔案頭的16進製表(前64bytes)對格式進行分析。

第一行,對應e_ident[ei_nident]。實際表示內容為7f454c46020101000000000000000000,前四個位元組7f454c46(0x45,0x4c,46是'e','l','f'對應的ascii編碼)是乙個魔數,表示這是乙個elf物件。

接下來的乙個位元組02表示是乙個64位物件,接下來的乙個位元組01表示是小端法表示,再接下來的乙個位元組01表示檔案頭版本。剩下的預設都設定為0.

第二行,e_type值為0x0002,表示是乙個可執行檔案。e_machine值為0x003e,表示是advanced micro devices x86-64處理器體系結構。e_version值為0x00000100,表示是當前版本。e_entry值為0x 004003f0,表示入口點(下面會用到)

第三行,e_phoff值為0x40,表示程式頭表。e_shoff值為0x1290,表示段表的偏移位址。

第四行,e_flags值為0x00000000,表示未知處理器特定標誌。e_ehsize值為0x0040,表示elf檔案頭大小(正好是64個位元組)。e_phentsize表示乙個program header表中的入口的長度,值為0x0038。e_phnum的值為0x0008,給出program header表中的入口數目。e_shentsize值為0x0040表示段頭大小為64個位元組。e_shnum值為0x001f,表示段表入口有31個。e_shstrndx值為0x001c,表示段名串表的在段表中的索引號。

2、通過檔案頭找到section header table,理解其內容

輸入:hexdump –x elf1來用16進製制的數字來顯示elf1的內容

(其中,標紅第二列是16進製表示的偏移位址)

輸入:objdump –x elf1來顯示elf1中各個段以及符號表的相關資訊:

輸入:readelf –a elf1來檢視各個段資訊:

elf檔案頭資訊:

段表section header table

.text的索引值為14

符號表symbol table

3、通過section header table找到各section

在乙個elf檔案中有乙個section header table,通過它我們可以定位到所有的 section,而 elf header 中的e_shoff 變數就是儲存 section header table 入口對檔案頭的偏移量。而每個 section 都會對應乙個 section  header ,所以只要在 section  header  table 中找到每個 section header,就可以通過 section header 找到你想要的 section。

下面以可執行檔案elf1為例,以儲存**段的 section 為例來講解讀取某個section 的過程。

使用『vi  /usr/include/elf.h 』命令檢視sections header的結構體:

由上面分析可知,section headers table中的每乙個section header所佔的size均為64位元組,elf header得到了e_shoff變數的值為0x1170,也就是table入口的偏移量,通過看e_shnum值為0x001e,表示段表入口有30個。

所以從0x00001170開始有30個段,每個段佔64個位元組大小,輸入 hexdump elf1檢視:

第乙個段,其中內容全部為0,所以不表示任何段。

第二個段,為.interp段,段偏移sh_offset為0x200,段大小sh_size為0x1c

第三個段,為.note.abi-tag段,段偏移sh_offset為0x 21c,段大小sh_size為0x20。

第四個段,為.note.gnu.build-i段,段偏移sh_offset為0x23c(紅線), 段大小sh_size為0x 24(藍線)。

第五個段,為.gnu.hash段,段偏移sh_offset為0x 260, 段大小sh_size為0x 1c

……中間的段省略……

第十四個段,為.text段, 段偏移sh_offset為0x 3f0, 段大小sh_size為0x 182

下面用readelf –s elf1命令先去看看elf1的section table中存放的所有的 section header。

我們用readelf 命令去檢視.text這個 section 中的內容,

輸入readelf –x 14 elf1,對14索引號的.text的section的內容進行檢視:

下面用 hexdump 的方法去讀取.text這個 section 中的內容,通過看section header中.text中offset和size分別是0x3f0和0x182,通過16進製制向10進製轉換得到offset:1008和size:386。

輸入 hexdump –s 1008 –n 386 –c elf1

得到了和上面的readelf得到的相同。

使用下面命令對elf1的文字段(.text)進行反彙編:

objdump –d elf1  得到如下圖:

可以看出,使用反彙編的16進製制資料和前面查詢到的是相同的。

我們可以使用相同的方法對其他section進行檢視,.data 資料段   .bbs 堆疊段(存放沒有初始化的資料) .symtab(符號表)段。

①   檢視.data資料段的section

比較簡單,使用readelf –x 24(索引號) elf1(檔名)來檢視

同理分析其他段表

4、理解常見.text .strtab .symtab .rodata等section

①.text section是可執行指令的集合,.data和.text都是屬於progbits型別的section,這是將來要執行的程式與**。查詢段表可知.text section的位偏移為0x0000440,size為0x0000192。

②.strtab section是屬於strtab型別的section,可以在檔案中看到,它存著字串,儲存著符號的名字。位偏移為0x0001f08,size為0x0000238。

③.symtab section存放所有section中定義的符號名字,比如「data_items」,「start_loop」。 .symtab section是屬於symtab型別的section,它描述了.strtab中的符號在「記憶體」中對應的「記憶體位址」。 位偏移為0x00018f0,size為0x0000618。

④.rodata section,ro代表read only,即唯讀資料(const)。位偏移為0x00005e0,size為0x000000c。

ELF檔案格式

在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程 1 編寫c原始檔,或彙編原始檔 2 準備共享庫格式的目標檔案 shared object file 如數學庫 標準庫 2 用編譯器 compiler 將c編譯成可重定位格式的目標檔案 relocatable object file 用彙編器 ...

ELF檔案格式

1.目標檔案 編譯器和彙編器生成可重定位目標檔案 包括共享目標檔案 鏈結器生成可執行目標檔案。2.可重定位目標檔案和可執行目標檔案的格式 可重定位目標檔案格式 可執行目標檔案格式 3.下面我們開始分析上面 而對於未被初始化的全域性變數和靜態區域性變數,編譯的時候並未被分配空間,而是僅僅在.bss段中...

ELF檔案格式

elf指executable and linking format,不僅包含可執行檔案,也包含庫檔案,包括靜態庫和動態庫。準備的說,也就是三種 這不廢話嗎 可執行檔案 靜態鏈結庫 動態鏈結庫 要觀察elf的具體資訊,可以用以下幾個工具 nm lists symbols from object fil...