亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

幾種常見的ELF文件

在linux下,我們經(jīng)gcc編譯之后生成的可執(zhí)行文件屬于ELF文件:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

ELF是一類文件類型,而不是特指某一后綴的文件。ELF(Executable and Linkable Format,可執(zhí)行與可鏈接格式)文件格式,在Linux下主要有如下三種文件:

  • 可執(zhí)行文件(.out):Executable File,包含代碼和數(shù)據(jù),是可以直接運行的程序。其代碼和數(shù)據(jù)都有固定的地址 (或相對于基地址的偏移 ),系統(tǒng)可根據(jù)這些地址信息把程序加載到內(nèi)存執(zhí)行。
  • 可重定位文件(.o文件):Relocatable File,包含基礎(chǔ)代碼和數(shù)據(jù),但它的代碼及數(shù)據(jù)都沒有指定絕對地址,因此它適合于與其他目標(biāo)文件鏈接來創(chuàng)建可執(zhí)行文件或者共享目標(biāo)文件。
  • 共享目標(biāo)文件(.so):Shared Object File,也稱動態(tài)庫文件,包含了代碼和數(shù)據(jù),這些數(shù)據(jù)是在鏈接時被鏈接器(ld)和運行時動態(tài)鏈接器(ld.so.l、libc.so.l、ld-linux.so.l)使用的。

ELF格式可結(jié)構(gòu)大致為:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

ELF文件由4部分組成,分別是ELF頭(ELF header)、程序頭表(Program header table)、節(jié)(Section)和節(jié)頭表(Section header table)。

實際上,一個文件中不一定包含全部內(nèi)容,而且它們的位置也未必如同所示這樣安排,只有ELF頭的位置是固定的,其余各部分的位置、大小等信息由ELF頭中的各項值來決定。

readelf工具的使用

在Linux下,我們可以使用readelf 命令工具可以查看ELF格式文件的一些信息。下面我們先準(zhǔn)備一個動態(tài)鏈接相關(guān)的demo,就拿我們之前分享的文章:========中的demo吧:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

文件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 worldn");
}

文件3(test.h):

#ifndef __TEST_H
#define __TEST_H
?
#include <stdio.h>
?
void print_hello(void);
?
#endif

執(zhí)行相關(guān)命令生成相關(guān)文件:.out文件、.o文件、.so文件。如:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

下面我們使用readelf命令來查看這三類文件的一些信息。readelf命令格式為:

readelf <option(s)> elf-file(s)

查看可執(zhí)行文件頭部信息:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

查看可執(zhí)行文件頭部信息是,我們發(fā)現(xiàn)這樣一個問題,頭部信息中的類型竟然是共享庫文件,而我們查看的是可執(zhí)行文件,自相矛盾?

查了一些資料:

https://blog.csdn.net/cclethe/article/details/83387685

發(fā)現(xiàn):gcc編譯默認(rèn)加了--enable-default-pie選項:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

Position-Independent-Executable是Binutils,glibc和gcc的一個功能,能用來創(chuàng)建介于共享庫和通常可執(zhí)行代碼之間的代碼–能像共享庫一樣可重分配地址的程序,這種程序必須連接到Scrt1.o。標(biāo)準(zhǔn)的可執(zhí)行程序需要固定的地址,并且只有被裝載到這個地址時,程序才能正確執(zhí)行。PIE能使程序像共享庫一樣在主存任何位置裝載,這需要將程序編譯成位置無關(guān),并鏈接為ELF共享對象。

引入PIE的原因是讓程序能裝載在隨機的地址,通常情況下,內(nèi)核都在固定的地址運行,如果能改用位置無關(guān),那攻擊者就很難借助系統(tǒng)中的可執(zhí)行碼實施攻擊了。類似緩沖區(qū)溢出之類的攻擊將無法實施。而且這種安全提升的代價很小。

也就是說,pie這是一種保護我們可執(zhí)行程序的一種手段。這里我們只是做實驗,我們可以加-no-pie參數(shù)先把pie給關(guān)掉:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

可以看到,類型終于對得上了。ELF頭部信息還包含有Entry point address(入口地址)、Start of program headers(程序頭的起始字節(jié))、Start of section headers(節(jié)頭的起始字節(jié))等信息。

查看可重定位文件頭部信息:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

查看共享目標(biāo)文件頭部信息:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

同樣的,readelf 搭配其它參數(shù)可以查看ELF文件的其它信息:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

objdump工具的使用

objdump工具用于顯示一個或多個目標(biāo)文件的信息。objdump命令格式:

objdump <option(s)> <file(s)>

可執(zhí)行文件、可重定位文件與共享目標(biāo)文件都屬于目標(biāo)文件,所以都可以使用這個命令來查看一些信息。

查看可重定位文件反匯編信息:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

查看可執(zhí)行文件匯編信息:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

查看共享目標(biāo)文件匯編信息:

「Linux」簡單認(rèn)識認(rèn)識ELF文件

 

總結(jié)

以上就是本次的分享。簡單地介紹了ELF文件的一些信息,同時介紹了分析ELF文件的兩個工具。ELF文件的內(nèi)容很多,并且比較抽象,詳細(xì)分析起來是個深坑。我們大致先進行一個簡單的了解,我現(xiàn)在還沒有這個能力或者說還沒有這個需求去學(xué)習(xí)、分析這些底層的東西,之后如果深入學(xué)習(xí)時再做另外的分享。

分享到:
標(biāo)簽:文件 ELF
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定