4.2文件格式分析
2016-06-14 18:38
399 查看
4.2文件格式分析
20135206 于佳心
一般的 ELF 文件包括三个索引表:ELF header,Program header table,Section header table。
1)ELF header:在文件的开始,保存了路线图,描述了该文件的组织情况。
2)Program header table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。
3)Section header table :包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。
分析ELF文件头(ELF header)
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183722588-505584429.png)
进行编译运行,生成elf可执行文件。
使用'readelf –a elf1'命令,得到ELF Header头文件的信息
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183724932-1398462515.png)
发现Elf Header的Size为52bytes,使用hexdump工具将头文件的16进制表打开。
hexdump –x elf1 –n 64:查看elf文件头的16进制表
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183726338-1095323774.png)
第一行:前四个字节7f454c46是魔数,表示这是一个ELF对象。下一个字节01表示是一个32位对象,再下一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.
第二行:e_type值为0x0002,表示是一个可执行文件。e_machine值为0x0003。e_version值为0x00000100,表示是当前版本。e_entry值为0x 08048330,表示入口点。e_phoff值为0x40,表示程序头表。
第三行:e_shoff值为0x113c,表示段表的偏移地址。e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0034,表示elf文件头大小。e_phentsize表示一个program header表中的入口的长度,值为0x0020。e_phnum的值为0x0009,给出program header表中的入口数目。e_shentsize值为0x0028表示段头大小为52个字节。
第四行:e_shnum值为0x001e,表示段表入口有30个。e_shstrndx值为0x001b,表示段名串表的在段表中的索引号。
2、通过文件头找到section header table,理解其内容
file elf1显示生成的目标文件elf1的类型
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183727432-247149280.png)
elf1是一个可执行文件。
输入:ls –l elf1查看elf1的大小:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183728213-1817693156.png)
如图可知,elf1大小为7160字节。
输入:hexdump –x elf1来用16进制的数字来显示elf1的内容
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183729807-1522627938.png)
输入:readelf –a elf1来查看各个段信息:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183731495-1511270897.png)
段表Section header table:其中text的索引号是13
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183733276-1048370947.png)
符号表 Symbol table:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183735292-1071397673.png)
3、通过section header table找到各section
只要在 section header table 中找到每个 section header,就可以通过 section header 找到想要的 section。
使用'vi /usr/include/elf.h '命令查看Sections Header的结构体:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183737338-844330969.png)
用readelf 命令去查看.text这个 section 中的内容,输入readelf –x 13 elf1,对13索引号的.text的section的内容进行查看,输出".text"字节的十六进程输出:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183740604-285248802.png)
用 hexdump 的方法读取.text,先看section header,.text中offset和size分别是0x330和0x19c,通过16进制向10进制转换得到offset:816和size:412。
输入 hexdump –s 816 –n 412 –C elf1
与上面的readelf进行比较,发现得到的结果相同。
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183743698-579385898.png)
对elf1的文本段(.text)进行反汇编:objdump –d elf1
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183745979-1634753466.png)
4、理解常见.text .strtab .symtab .rodata等section
①.text section是可执行指令的集合,.data和.text都是属于PROGBITS类型的section,这是将来要运行的程序与代码。查询段表可知.text section的位偏移为0x0000440,size为0x0000192。
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183747260-1793559367.png)
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183749901-1128651824.png)
②.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。
20135206 于佳心
一般的 ELF 文件包括三个索引表:ELF header,Program header table,Section header table。
1)ELF header:在文件的开始,保存了路线图,描述了该文件的组织情况。
2)Program header table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。
3)Section header table :包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。
分析ELF文件头(ELF header)
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183722588-505584429.png)
进行编译运行,生成elf可执行文件。
使用'readelf –a elf1'命令,得到ELF Header头文件的信息
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183724932-1398462515.png)
发现Elf Header的Size为52bytes,使用hexdump工具将头文件的16进制表打开。
hexdump –x elf1 –n 64:查看elf文件头的16进制表
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183726338-1095323774.png)
第一行:前四个字节7f454c46是魔数,表示这是一个ELF对象。下一个字节01表示是一个32位对象,再下一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.
第二行:e_type值为0x0002,表示是一个可执行文件。e_machine值为0x0003。e_version值为0x00000100,表示是当前版本。e_entry值为0x 08048330,表示入口点。e_phoff值为0x40,表示程序头表。
第三行:e_shoff值为0x113c,表示段表的偏移地址。e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0034,表示elf文件头大小。e_phentsize表示一个program header表中的入口的长度,值为0x0020。e_phnum的值为0x0009,给出program header表中的入口数目。e_shentsize值为0x0028表示段头大小为52个字节。
第四行:e_shnum值为0x001e,表示段表入口有30个。e_shstrndx值为0x001b,表示段名串表的在段表中的索引号。
2、通过文件头找到section header table,理解其内容
file elf1显示生成的目标文件elf1的类型
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183727432-247149280.png)
elf1是一个可执行文件。
输入:ls –l elf1查看elf1的大小:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183728213-1817693156.png)
如图可知,elf1大小为7160字节。
输入:hexdump –x elf1来用16进制的数字来显示elf1的内容
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183729807-1522627938.png)
输入:readelf –a elf1来查看各个段信息:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183731495-1511270897.png)
段表Section header table:其中text的索引号是13
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183733276-1048370947.png)
符号表 Symbol table:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183735292-1071397673.png)
3、通过section header table找到各section
只要在 section header table 中找到每个 section header,就可以通过 section header 找到想要的 section。
使用'vi /usr/include/elf.h '命令查看Sections Header的结构体:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183737338-844330969.png)
用readelf 命令去查看.text这个 section 中的内容,输入readelf –x 13 elf1,对13索引号的.text的section的内容进行查看,输出".text"字节的十六进程输出:
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183740604-285248802.png)
用 hexdump 的方法读取.text,先看section header,.text中offset和size分别是0x330和0x19c,通过16进制向10进制转换得到offset:816和size:412。
输入 hexdump –s 816 –n 412 –C elf1
与上面的readelf进行比较,发现得到的结果相同。
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183743698-579385898.png)
对elf1的文本段(.text)进行反汇编:objdump –d elf1
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183745979-1634753466.png)
4、理解常见.text .strtab .symtab .rodata等section
①.text section是可执行指令的集合,.data和.text都是属于PROGBITS类型的section,这是将来要运行的程序与代码。查询段表可知.text section的位偏移为0x0000440,size为0x0000192。
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183747260-1793559367.png)
![](https://images2015.cnblogs.com/blog/744812/201606/744812-20160614183749901-1128651824.png)
②.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。
相关文章推荐
- 4.1程序破解
- MySQL 服务无法启动。 服务没有报告任何错误。 请键入 NET HELPMSG 3534 以获得更多的帮助。
- 【成长】——改变
- cocos2d-x 3.x学习之SpriteFrameCache
- CentOS7安装EPEL源
- sql怎么把查询出的记录插入到另一张表中
- OpenStack 学习笔记(五):OpenStack nova服务搭建
- iOS最完美的UITextField中输入金额,只能输入数字和小数点,保留两位小数点且0放在首位
- H5新增的块级的语义元素
- Activiti入门学习demo_2_简单的流程
- Android M中Settings的启动流程
- 2.2内核模块编译
- C Tricks(十三)—— trim 的实现
- firewalld对指定IP开放指定端口的配置
- CentOS 7 下MySQL 5.7.12主从复制架构配置记录(亲自验证可行)
- java堆分析工具jmap
- Cocoa过滤器NSPredicate的完全用法
- chrome插件开发
- 数据分析师8步法
- solr 自定义QueryParser 用户查询解析方案