ELF分析 实践

时间:2021-08-02 12:46:28

分析ELF文件:

首先编写一个.c文件,并使用gcc -c xx.c -o xx.o 对其进行编译。

我在这个实践中是ELF_1.o文件。

接下来输入ls -l ELF_1.o 查看重定位文件的信息。

ELF分析 实践

接下来以十六进制来查看该文件信息。输入:hexdump -x ELF_1.o

显示信息的最左一列表示的是偏移地址的16进制表示。

查看ELF文件头定义的规范。打开elf.h查看各部分内容的定义。

ELF分析 实践

我们可以看出,32位的系统与64位的系统的ELF头部分结构大致相同。只是个别字段所占用的字节个数有不同罢了。

分析一下ELF头:

ELF分析 实践

第一行:第一部分:占四个字节。7f 45 4c 46,应读为 4c 46 45 7f,对应ASCII码 ELF.,表示这是一个ELF对象。第二部分:占一个字节。02 表示是一个64位对象。

第三部分:占一个字节。01 表示是小端表示法。第四部分:占一个字节。01 表示文件头版本。

第二行中的第三、四个字节为0x003e 表示是x86-64的处理器。后四个字节0x00000001,表示的是当前版本。后八个字节表示程序的入口点,当前为0.

第三行的前八个字节表示程序头表,当前为0.后八个字节为段表的偏移地址:0x00000000000003f0.

第四行中,第七、八个字节表示段头大小为64字节(40H),第九、十字节表示段表的入口有13(0x000d)个。最后两个字节是表示段名串表(符号表)在段表中的索引号为10.

段表的分析:

ELF分析 实践

32位系统的段表定义每个段头大小是28H字节,而64位系统则变成了64字节(40H)。

40H*13=340H,ELF文件头数据结构存储在位偏移为0x0000000000000000-0x0000000000000039之间,而段表存储在0x00000000000003f0-0x0000000000000340之间。

符号表的分析:

ELF分析 实践

32位系统的符号表结构体大小是16字节,而64位系统符号表结构体的大小为22个字节。

ELF分析 实践

由图可知,一共15 个段表。

ELF分析 实践

text.section 起始位置、大小如图所示。

ELF分析 实践

text.section是可执行指令的集合,offset=0x00000040,size =74H.

data.section是初始化后数据的集合,offset=0x000000b4,size=4H.

symtab.section是存放所有section名字的集合。offset=0x00000140,size=150H.

strtab.section是存放所有符号的名字的集合。offset=0x00000290,size=1eH.