在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)
{
print_hello();
return 0;
}
文件2(test.c):
#include "test.h"
void print_hello(void)
{
printf("hello world\n");
}
文件3(test.h):
#ifndef __TEST_H
#define __TEST_H
#include <stdio.h>
void print_hello(void);
#endif
執行相關命令生成相關文件:.out文件
、.o文件
、.so文件
。如:
下面我們使用readelf
命令來查看這三類文件的一些信息。readelf命令格式為:
readelf <option(s)> elf-file(s)
查看可執行文件頭部信息:
查看可執行文件頭部信息是,我們發現這樣一個問題,頭部信息中的類型竟然是共享庫文件,而我們查看的是可執行文件,自相矛盾?
查了一些資料:
https://blog.csdn.net/cclethe/article/details/83387685
發現: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 <option(s)> <file(s)>
可執行文件、可重定位文件與共享目標文件都屬於目標文件,所以都可以使用這個命令來查看一些信息。
查看可重定位文件反彙編信息:
查看可執行文件反彙編信息:
查看共享目標文件反彙編信息:
以上就是本次的分享。簡單地介紹了ELF文件的一些信息,同時介紹了分析ELF文件的兩個工具。
ELF文件的內容很多,並且比較抽象,詳細分析起來是個深坑。我們大致先進行一個簡單的了解,之後如果深入學習時再做另外的分享。
以上就是本次的分享,如有錯誤,歡迎指出!謝謝
歡迎大家進群交流、共同進步。同時,我也會關注一些大家問的一些問題,從中挑選一些具有代表性的、並且在我知識範圍內的問題寫出相關文章做分享。
Linux下socket編程實例
Linux下應用開發基礎
Linux下能編譯成功,而Windows下編譯不過?
【Linux筆記】Vi/Vim編輯器
C語言、嵌入式中幾個非常實用的宏技巧
C語言、嵌入式應用:TCP通信實例分析
C語言、嵌入式重點知識:回調函數
C語言、嵌入式位操作精華技巧大匯總