幾種常見的ELF檔案

2021-10-25 03:56:42 字數 2917 閱讀 4317

在linux下,我們經gcc編譯之後生成的可執行檔案屬於elf檔案:

elf是一類檔案型別,而不是特指某一字尾的檔案。elf(executable and linkable format,可執行與可鏈結格式)檔案格式,在linux下主要有如下三種檔案:

elf格式可結構大致為:

elf檔案由4部分組成,分別是elf頭(elf header)程式頭表(program header table)節(section)節頭表(section header table)

實際上,乙個檔案中不一定包含全部內容,而且它們的位置也未必如同所示這樣安排,只有elf頭的位置是固定的,其餘各部分的位置、大小等資訊由elf頭中的各項值來決定。

在linux下,我們可以使用readelf命令工具可以檢視elf格式檔案的一些資訊。

下面我們先準備乙個動態鏈結相關的demo,就拿我們之前分享的文章:靜態鏈結與動態鏈結補充(linux)中的demo來做演示:

檔案1(main.c):

#include "test.h"

int main(void)

檔案2(test.c):

#include "test.h"

void print_hello(void)

檔案3(test.h):

下面我們使用readelf命令來檢視這三類檔案的一些資訊。readelf命令格式為:

readelf elf-file(s)
檢視可執行檔案頭部資訊:

檢視可執行檔案頭部資訊是,我們發現這樣乙個問題,頭部資訊中的型別竟然是共享庫檔案,而我們檢視的是可執行檔案,自相矛盾?

查了一些資料:

發現:gcc編譯預設加了--enable-default-pie選項:

position-independent-executable是binutils,glibc和gcc的乙個功能,能用來建立介於共享庫和通常可執行**之間的**–能像共享庫一樣可重分配位址的程式,這種程式必須連線到scrt1.o。

標準的可執行程式需要固定的位址,並且只有被裝載到這個位址時,程式才能正確執行。

pie能使程式像共享庫一樣在主存任何位置裝載,這需要將程式編譯成位置無關,並鏈結為elf共享物件。

引入pie的原因是讓程式能裝載在隨機的位址,通常情況下,核心都在固定的位址執行,如果能改用位置無關,那攻擊者就很難借助系統中的可執行碼實施攻擊了。

類似緩衝區溢位之類的攻擊將無法實施。而且這種安全提公升的代價很小。

也就是說,pie這是一種保護我們可執行程式的一種手段。這裡我們只是做實驗,我們可以加-no-pie引數先把pie給關掉:

可以看到,型別終於對得上了。elf頭部資訊還包含有entry point address(入口位址)、start of program headers(程式頭的起始位元組)、start of section headers(節頭的起始位元組)等資訊。

檢視可重定位檔案頭部資訊:

檢視共享目標檔案頭部資訊:

同樣的,readelf搭配其它引數可以檢視elf檔案的其它資訊:

objdump工具用於顯示乙個或多個目標檔案的資訊。objdump命令格式:

objdump

可執行檔案、可重定位檔案與共享目標檔案都屬於目標檔案,所以都可以使用這個命令來檢視一些資訊。

檢視可重定位檔案反彙編資訊:

檢視可執行檔案反彙編資訊:

檢視共享目標檔案反彙編資訊:

linux下常見的ELF檔案

linux下常見的elf檔案 1 可重定位檔案.obj,這種檔案包括資料和指令,可以被鏈結成為可執行檔案 exe 或者共享目標檔案 so 靜態鏈結庫可以歸為這一類 2 可執行檔案.exe,這種檔案包含了可以直接執行的程式,它的代表就是elf可執行檔案,他們一般都沒有副檔名 3 共享目標檔案.so,這...

ELF檔案 介紹

elf 檔案格式是乙個開放標準,各種unix系統的可執行檔案都採用elf格式,它有三種不同的型別 在這裡先詳細解釋一下程式的彙編 鏈結 執行過程 1 寫乙個匯程式設計序儲存成文字檔案max.s。2 彙編器讀取這個文字檔案轉換成目標檔案max.o,目標檔案由若干個section組成,我們在匯程式設計序...

ELF檔案分析

乙個程式要想執行,首先要載入到記憶體中,程式的pc指標指向記憶體中的 在執行的時候會使用記憶體中的資料。所以elf檔案主要包含 和資料。資料可以分為兩類 靜態資料。動態資料。什麼是動態資料?動態資料程式執行過程中產生,在堆或者棧上分配記憶體。而靜態資料則不然,靜態資料在 編譯完成後,就應該確定使用的...