Linux及安全实践四——ELF文件格式分析
Linux及安全实践四——ELF文件格式分析
一、ELF文件格式概述
1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西、以及都以什么样的格式去放这些东西。
二、分析一个ELF文件
以一个最简单的helloworld程序为例
1. ELF文件头
使用工具查看ELF文件头:readelf -h obj

在/usr/include/elf.h中可以找到文件头结构定义:

大小总共为64字节,换算成十六进制为0x40。在十六进制代码中找到前0x40字节,即为文件头信息部分(阅读时注意反序问题):

(1)identification

第一部分:占四个字节。7f 45 4c 46,对应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 5309,即.c文件中的字符串:

2. .comment:本节用来存放编译器版本信息
从偏移0x5c处找到大小为0x26的 .comment节:

3. .symtab:本节存放所有section中定义的符号名字,一般是变量、函数shstrtab及symtab经常引用strtab中的字符串
从偏移0xc0处找到大小为0x0108的 .symtab节:

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

数据用“0”分隔出了三部分,用ASCII码翻译:
65 6c 66 2e 63:elf.c
6d 61 69 6e:main
70 75 74 73:puts
Linux及安全实践四——ELF文件格式分析的更多相关文章
- Linux课题实践四——ELF文件格式分析
2.4 ELF文件格式分析 20135318 刘浩晨 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...
- 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文件(目标 ...
- Linux课程实践四:ELF文件格式分析
一.ELF文件格式概述 1. ELF文件 ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东 ...
随机推荐
- 【坚持】Selenium+Python学习记录 DAY11
2018/06/1-2018/06/4 参考资料: [菜鸟教程](http://www.runoob.com/python3/python3-examples.html) [Python解惑:True ...
- 关于几个与IO相关的重要概念
1.读/写IO 读IO就是发指令从磁盘读取某段序号连续的扇区内容.指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,同时给出动作是读还是写.磁盘收到这条指令就会按照指令 ...
- 从零开始的Python学习Episode 22——多线程
多线程 线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ...
- 10款常见MySQL高可用方案选型解读
一.概述 我们在考虑MySQL数据库的高可用架构时,主要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断. ...
- [mysql] 归档工具pt-archiver,binlog格式由mixed变成row
pt-archiver官方地址:https://www.percona.com/doc/percona-toolkit/3.0/pt-archiver.html 介绍:归档数据,比如将一年前的数据备份 ...
- First Blood
自我介绍 大家好!我的名字是戴俊涵,代号211606359,喜欢看电影和古风音乐,也是一个资深漫迷(让世界感受痛楚吧),喜欢的美食是牛排. 回想初衷 (1)回想一下你初入大学时对本专业的畅想 当初你是 ...
- SpringMVC 常用注释
@Controller Controller控制器是通过服务接口定义的提供访问应用程序的一种行为 @Repository Dao层的标志 @RequestMapping 标注控制层函数的访问路径 ...
- 福大软工 · 第七次作业 - 需求分析报告(404 Note Found队)
目录 组队后的团队项目的整体计划安排 项目logo及思维导图 项目logo 思维导图 产品思维导图 产品思维导图-引导 产品思维导图-后端数据处理.存储 产品思维导图-短信识别 产品思维导图-智能分析 ...
- week4d:个人博客作业
7,程序结果的显示 1,界面 2,选第一选项. 3,输入3个数后. 4,选择第一个. 5,输入第4个数字. 6,再次进行一轮游戏. 7,选择是否要看历史记录. 8,进入下一轮游戏. 9,开始第二轮数字 ...
- [建树(非二叉树)] 1090. Highest Price in Supply Chain (25)
1090. Highest Price in Supply Chain (25) A supply chain is a network of retailers(零售商), distributors ...