Linux课程实践四:ELF文件格式分析
一、ELF文件格式概述
1. ELF文件
- ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。
2. 三种类型
(1)可重定位文件
- 编译器和汇编器创建
- 运行前需要被链接器处理
(2)可执行文件
- 完成了所有重定位工作和符号解析
- 除了运行时解析的共享库符号
(3)共享库文件
- 链接器需要的符号信息
- 运行时可以直接执行的代码
二、分析一个ELF文件
- 以一个最简单的helloworld程序为例
1. ELF文件头
使用工具查看ELF文件头:
readelf -h obj

在
/usr/include/elf.h中可以找到文件头结构定义:
大小总共为64字节,换算成十六进制为0x40。在十六进制代码中找到前0x40字节,即为文件头信息部分(阅读时注意反序问题):

(1)identification
魔数部分:

第一部分:占四个字节。
7f 45 4c 46,应读为4c 46 45 7f,对应ASCII码ELF.,表示这是一个ELF对象。
第二部分:占一个字节。
02表示是一个64位对象。
第三部分:占一个字节。
01表示是小端表示法。
第四部分:占一个字节。
01表示文件头版本。
其余默认为
0。
(2)information
信息部分:

e_type:两个字节
01 00表示是一个重定位文件。
e_machine:两个字节
3e 00表示是intel80386处理器体系结构。
e_version:四个字节
01 00 00 00表示是当前版本。
e_entry:八个字节。
00 00 00 00 00 00 00 00表示当前程序没有入口点。
e_phoff:八个字节
00 00 00 00 00 00 00 00表示没有程序头表。
e_shoff:八个字节
90 02 00 00 00 00 00 00表示段表的偏移地址在00 00 00 00 00 00 02 90处。
e_flags:四个字节
00 00 00 00表示未知处理器特定标志#define EF_SH_UNKNOWN 0x0。
e_ehsize:两个字节
40 00表示elf文件头大小为00 40(64个字节)。
e_phentsize:两个字节
00 00表示重定位文件没有程序头表。
e_phnum:两个字节
00 00表示重定位文件没有程序头表。
e_ehentsize:两个字节
40 00表示段头大小为00 40(64字节),section header table中每个header的大小。
e_shnum:两个字节
0d 00表示段表入口有13个,即段表有13段。
e_shstrndx:两个字节
0a 00表示段表字符串在段表中的索引号,.shstrab段的段表索引号为00 0a,即10.
2. 通过文件头找到各个节
使用工具查看段表信息
readelf -S obj

(1)找到段表
在文件头中
e_shoff可以找到段表偏移地址00 00 00 00 00 00 02 90,从这个地址去查找段表。段表长度由
e_ehentsize为00 40(64字节)。段表个数由
e_shnum可知有13个。/usr/include/elf.h中可以找到段表结构:
(2)分析一个段表
第一个段:全为零,不表示任何段。

第二个段:

sh_name:四个字节
20 00 00 00表示该段名称在.shstrtab中偏移量,为.test节。
sh_type:四个字节
01 00 00 00表示这个段拥有程序所定义的信息,其格式和含义完全由该程序确定,这里表示PROGBITS。
sh_flags:八个字节
06 00 00 00 00 00 00 00表示alloc和execute。
sh_addr:八个字节
00 00 00 00 00 00 00 00表示是section在内存中的虚拟地址,.o文件不需要执行,这里都是0。
sh_offset:八个字节
40 00 00 00 00 00 00 00表示是section与文件头之间的偏移。
sh_size:八个字节
11 00 00 00 00 00 00 00表示文件里面section占用的大小。
sh_link:四个字节
00 00 00 00表示没有链接信息。
sh_info:四个字节
00 00 00 00表示没有辅助信息。
sh_addralign:八个字节
01 00 00 00 00 00 00 00表示字节对齐长度。
sh_entsize:八个字节
00 00 00 00 00 00 00 00表示没有入口。
(3)所有段表
第三个段:

- 段名:.rel.text
- 类型:RELA
- 标志:info
- 相对文件头偏移:0x1e0
- 占用大小:0x30
第四个段

- 段名:.data
- 类型:PROGBITS
- 标志:write、alloc
- 相对文件头偏移:0x51
- 占用大小:0
第五个段

- 段名:.bss
- 类型:NOBITS
- 标志:write、alloc
- 相对文件头偏移:0x51
- 占用大小:0
第六个段

- 段名:.rodata
- 类型:PROGBITS
- 标志:alloc
- 相对文件头偏移:0x51
- 占用大小:0x0b
第七个段

- 段名:.comment
- 类型:PROGBITS
- 标志:merge、strings
- 相对文件头偏移:0x5c
- 占用大小:0x26
第八个段

- 段名:.note.GNU-stack
- 类型:PROGBITS
- 标志:无
- 相对文件头偏移:0x82
- 占用大小:0
第九个段

- 段名:.eh_frame
- 类型:PROGBITS
- 标志:alloc
- 相对文件头偏移:0x88
- 占用大小:0x38
第十个段

- 段名:.rela.eh_frame
- 类型:RELA
- 标志:info
- 相对文件头偏移:0x210
- 占用大小:0x18
第十一段

- 段名:.shstrtab
- 类型:STRTAB
- 标志:无
- 相对文件头偏移:0x228
- 占用大小:0x61
第十二段

- 段名:.symtab
- 类型:STRTAB
- 标志:无
- 相对文件头偏移:0xc0
- 占用大小:0x0108
第十三段

- 段名:.strtab
- 类型:STRTAB
- 标志:无
- 相对文件头偏移:0x1c8
- 占用大小:0x11
三、理解常见节
1. .text节
本节中是可执行指令的集合
通过刚才的信息,我们可以从文件中偏移0x40处找到大小为0x11的 .text节:

可以通过反汇编该程序来查看:

2. .rodata
本节是只读数据,ro代表read only
从偏移0x51处找到大小为0x0b的 .rodata节:

使用ASCII码对照表翻译数据为
hello 5317,即.c文件中的字符串:
2. .comment
本节用来存放编译器版本信息
从偏移0x5c处找到大小为0x26的 .comment节:

使用ASCII码对照表翻译出来数据为
GCC:(Debian 5.3.1-8) 5.3.1 20160205
3. .symtab
本节存放所有section中定义的符号名字,一般是变量、函数shstrtab及symtab经常引用strtab中的字符串
从偏移0xc0处找到大小为0x0108的 .symtab节:

4. .strtab
本节是段表的字符串表
从偏移0x1c8处找到大小为0x11的 .strtab节:

数据用“0”分隔出了三部分,用ASCII码翻译:
65 6c 66 2e 63:elf.c6d 61 69 6e:main70 75 74 73:puts
Linux课程实践四:ELF文件格式分析的更多相关文章
- Linux课题实践四——ELF文件格式分析
2.4 ELF文件格式分析 20135318 刘浩晨 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...
- Linux及安全实践四——ELF文件格式分析
Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...
- 20135218 实践四 ELF文件格式分析
一 :概述 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标文件)格式主要三种: (1)可重定向文件:文 ...
- linux第三次实践:ELF文件格式分析
linux第三次实践:ELF文件格式分析 标签(空格分隔): 20135328陈都 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文 ...
- Linux实践:ELF文件格式分析
标签(空格分隔): 20135321余佳源 一.基础知识 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...
- 20135337——linux实践三:ELF文件格式分析(32位系统)
ELF文件格式分析 可重定位文件 十六进制形式显示内容 显示各个段.符号表相关信息 查看各个段信息 elf文件头信息 段表 符号表信息 查看堆栈 具体分析 1.ELF文件头信息(小字节优先,均十六进制 ...
- 实践2.4 ELF文件格式分析
实践2.4 ELF文件格式分析 1.ELF文件头 查看/usr/include/elf.h文件: #define EI_NIDENT (16) typedef struct { unsigned ch ...
- linux实践之ELF文件分析
linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf ...
- 20135306 2.4 ELF文件格式分析
2.4 ELF文件格式分析 20135306 黄韧 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标 ...
随机推荐
- ld.so.conf 和 ldconfig
1. 查看执行文件的链接库 ldd 例子: # ldd /sbin/sln not a dynamic executable “not a dynamic executable”是 ldd 说明 sl ...
- JAVA垃圾收集机制剖析
1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象.该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽 ...
- Netty是什么?
Netty是什么? 本质:JBoss做的一个Jar包 目的:快速开发高性能.高可靠性的网络服务器和客户端程序 优点:提供异步的.事件驱动的网络应用程序框架和工具 通俗的说:一个好使的处理Socket的 ...
- 在iframe中使用cookie需要注意
cookie的使用早已不新鲜了,但是最近在做项目时还是被坑了一把. 那么接下来让我们来看一下这个"坑"是个什么情况! 前提: 1.现在有两个页面A.html, B.html,同时, ...
- Servlet--表单、超链接、转发、重定向4种情况的路径
Servlet中相对路径总结 假设web工程使用如下目录结构: 在介绍相对路径和绝对路径前需要先了解几个概念: 服务器的站点根目录:以tomcat服务器为例,tomcat服务器站点根目录就是apach ...
- css定位和浮动
1.css中一切元素皆为框.div.p.h1等为块框:span.strong等为行内框,(在文本中每一行会被自动默认为行框,行框和行内框是不一样的概念).通过display可以改变框的类型,行内框通过 ...
- 17.linux下root用户与普通用户
默认安装完成之后并不知道root用户的密码,那么如何应用root权限呢? (1)sudo 命令 这样输入当前管理员用户密码就可以得到超级用户的权限.但默认的情况下5分钟root权限就失效了. (2 ...
- asp.net mvc4 Html.BeginForm表单提交
默认是get提交,如果是post提交需要在控制器ActionResult上加:[AcceptVerbs(HttpVerbs.Post)] 举例: 在HelpController中,会定义如下的Acti ...
- Windows出现带空格文件名无法删除
下午同事的电脑上突然出现一个文件夹,怎么也删除不了,也无法重命名. 直接删除文件夹提示:无法读取源文件或磁盘. 然后查相关进程,未发现异常.重启进安全模式下删除,一样的结果,提示:无法读取源文件或磁盘 ...
- 微软第四题 给定cost能遍历的最大城市数
有向图中N*N矩阵 cost:M, 最多可以遍历的结点个数 例如A可以有0->1->2->0->1 代价:2+2+3+2=9<10 输出4 #include <io ...