標籤(空格分隔): 20135328陳都linux
1.ELF全稱Executable and Linkable Format,可執行鏈接格式,ELF格式的文件用於存儲Linux程序。ELF文件(目標文件)格式主要三種:小程序
通常的 ELF 文件包括三個索引表:ELF header,Program header table,Section header table。bash
進入終端輸入:cd /usr/include 進入include文件夾後查看elf.h文件,查看ELF的文件頭包含整個文件的控制結構
編輯器
寫一個小程序(hello 20135328)進行編譯,生成hello可執行文件。
使用‘readelf –a hello’命令,都獲得下面的ELF Header頭文件的信息,以下圖:
ide
經過上圖信息,能夠得出Elf Header的Size爲52bytes,因此可使用hexdump工具將頭文件的16進製表打開。
以下圖使用:‘hexdump -x hello -n 52 ’命令來查看hello文件頭的16進製表(前52bytes)對格式進行分析。
工具
e_shstrndx值爲0x001b,表示段名串表的在段表中的索引號。oop
符號表 Symbol table:
ui
在一個ELF文件中有一個section header table,經過它咱們能夠定位到全部的 section,而 ELF header 中的e_shoff 變量就是保存 section header table 入口對文件頭的偏移量。而每一個 section 都會對應一個 section header ,因此只要在 section header table 中找到每一個 section header,就能夠經過 section header 找到你想要的 section。編碼
下面以可執行文件hello爲例,以保存代碼段的 section 爲例來說解讀取某個section 的過程。
使用‘vi /usr/include/elf.h ’命令查看Sections Header的結構體:
3d
由上面分析可知,section headers table中的每個section header所佔的size均爲64字節,ELF header獲得了e_shoff變量的值爲0X0034,也就是table入口的偏移量,經過看e_shnum值爲0x001e,表示段表入口有30個。
因此從0x00000034開始有30個段,每一個段佔40個字節大小,輸入 hexdump hello查看:
第二個段,爲.interp段
第三個段,爲.note.ABI-tag段
第四個段,爲.note.gnu.build-i段
第五個段,爲.gnu.hash段
.......
第十四個段,爲.text段
第十六個段,爲.rodata段
第二十五個段,爲.data段
第二十六個段,爲.bss段
第二十九個段, 爲.symtab段
第三十個段, 爲.strtab段
咱們用readelf 命令去查看.text這個 section 中的內容,
輸入readelf –x 13 hello,(.text前面的標號爲13)對13索引號的.text的section的內容進行查看:
下面用 hexdump 的方法去讀取.text這個 section 中的內容,經過看section header中.text中offset和size分別是0x320和0x192
輸入 hexdump –C hello
找到320後的192個
獲得了和上面的readelf獲得的相同。
使用下面命令對hello的文本段(.text)進行反彙編:
objdump –d hello 獲得以下圖:
能夠看出,使用反彙編的16進制數據和前面查找到的是相同的。