ELF文件格式分析

ELF文件格式分析

1、     分析ELF文件头(ELF  header)

查看ELF的文件头包含整个文件的控制结构:使用命令行输入vi /usr/include/elf.h

 

专门选一个程序来查看:

通过上图信息,可以得出Elf Header的Size为64bytes,所以可以使用hexdump工具将头文件的16进制表打开

如下图使用:hexdump  yangguang 命令来查看elf文件的16进制表对格式进行分析(前64bit是elf头文件)

第一行,对应e_ident[EI_NIDENT]。实际表示内容为7f454c46010101000000000000000000,前四个字节7f454c46(0x45,0x4c,0x46是'e','l','f'对应的ascii编码)是一个魔数,表示这是一个ELF对象。接下来的一个字节02表示是一个64位对象,接下来的一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.

第二行,e_type值为0x0002,表示是一个可执行文件。e_machine值为0x003e,表示是Advanced Micro Devices X86-64处理器体系结构。e_version值为0x00000100,表示是当前版本。e_entry值为0x 00400410,表示入口点。

第三行,e_phoff值为0x40,表示程序头表。e_shoff值为0x1170,表示段表的偏移地址。

第四行,e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0040,表示elf文件头大小(正好是64个字节)。e_phentsize表示一个program header表中的入口的长度,值为0x0038。e_phnum的值为0x0009,给出program header表中的入口数目。e_shentsize值为0x0040表示段头大小为64个字节。e_shnum值为0x001e,表示段表入口有30个。e_shstrndx值为0x001b,表示段名串表的在段表中的索引号。

2.通过文件头找到section header table,理解其内容

file yangguang显示生成的目标文件yangguang的类型

使用readelf -a yangugang查看段表Section header table

由图可知,.txt索引值为14

使用readelf -x 14 yangguang,对14索引号的.text的section的内容进行查看:

 

 

3.理解常见.text .strtab .symtab .rodata等section

text section是可执行指令的集合,.data和.text都是属于PROGBITS类型的section,这是将来要运行的程序与代码。查询段表可知.text section的位偏移为0x0000440,size为0x0000192。

strtab section是属于STRTAB类型的section,可以在文件中看到,它存着字符串,储存着符号的名字。位偏移为0x0001f08,size为0x0000238。

 

symtab section存放所有section中定义的符号名字,比如“data_items”,“start_loop”。 .symtab section是属于SYMTAB类型的section,它描述了.strtab中的符号在“内存”中对应的“内存地址”。 位偏移为0x00018f0,size为0x0000618。

 

rodata section,ro代表read only,即只读数据(const)。位偏移为0x00005e0,size为0x000000c。

 

posted @ 2016-05-26 16:17  Mccartney  阅读(408)  评论(0编辑  收藏  举报