标签(空格分隔): 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进制数据和前面查找到的是相同的。