Linux内核分析——ELF文件格式分析
ELF文件(目标文件)格式主要三种:
1)可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。(目标文件或者静态库文件,即linux通常后缀为.a和.o的文件)
2)可执行文件:文件保存着一个用来执行的程序。(例如bash,gcc等)
3)共享目标文件:共享库。文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接。(linux下后缀为.so的文件。)
一般的 ELF 文件包括三个索引表:
1)ELF header:在文件的开始,保存了路线图,描述了该文件的组织情况。
2)Program header table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。
3)Section header table :包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。
1、 分析ELF文件头(ELF header)
进入终端输入:cd /usr/include/elf.h,查看ELF的文件头包含整个文件的控制结构

顺便选取一个简单代码为例:

进行编译运行,生成elf可执行文件。

使用‘readelf ’命令,得到下面的ELF Header头文件的信息,如下图:

通过上图信息,可以得出Elf Header的Size为64bytes,所以可以使用hexdump工具将头文件的16进制表打开。
如下图使用:‘hexdump –x elf1 –n 64’命令来查看elf文件头的16进制表(前64bytes)对格式进行分析。

第一行,对应e_ident[EI_NIDENT]。实际表示内容为7f454c46020101000000000000000000,前四个字节7f454c46(0x45,0x4c,46是'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 004003f0,表示入口点(下面会用到)。
第三行,e_phoff值为0x40,表示程序头表。e_shoff值为0x1290,表示段表的偏移地址。
第四行,e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0040,表示elf文件头大小(正好是64个字节)。e_phentsize表示一个program header表中的入口的长度,值为0x0038。e_phnum的值为0x0008,给出program header表中的入口数目。e_shentsize值为0x0040表示段头大小为64个字节。e_shnum值为0x001f,表示段表入口有31个。e_shstrndx值为0x001c,表示段名串表的在段表中的索引号。
2、通过文件头找到section header table,理解其内容
输入:hexdump –x elf1来用16进制的数字来显示elf1的内容
(其中,标红第二列是16进制表示的偏移地址)

输入:objdump –x elf1来显示elf1中各个段以及符号表的相关信息:

输入:readelf –a elf1来查看各个段信息:
ELF文件头信息:

段表Section header table:

.text的索引值为14。
符号表 Symbol table:

3、通过section header table找到各section
在一个ELF文件中有一个section header table,通过它我们可以定位到所有的 section,而 ELF header 中的e_shoff 变量就是保存 section header table 入口对文件头的偏移量。而每个 section 都会对应一个 section
header ,所以只要在 section
header table 中找到每个 section
header,就可以通过 section header 找到你想要的 section。
下面以可执行文件elf1为例,以保存代码段的 section 为例来讲解读取某个section 的过程。
使用‘vi
/usr/include/elf.h ’命令查看Sections Header的结构体:

由上面分析可知,section headers table中的每一个section header所占的size均为64字节,ELF header得到了e_shoff变量的值为0X1170,也就是table入口的偏移量,通过看e_shnum值为0x001e,表示段表入口有30个。
所以从0x00001170开始有30个段,每个段占64个字节大小,输入 hexdump elf1查看:

第一个段,其中内容全部为0,所以不表示任何段。

第二个段,为.interp段,段偏移sh_offset为0X200,段大小sh_size为0X1c

第三个段,为.note.ABI-tag段,段偏移sh_offset为0X 21c,段大小sh_size为0X20。

第四个段,为.note.gnu.build-i段,段偏移sh_offset为0X23c(红线), 段大小sh_size为0X 24(蓝线)。

第五个段,为.gnu.hash段,段偏移sh_offset为0X 260, 段大小sh_size为0X 1c

……中间的段省略……
第十四个段,为.text段, 段偏移sh_offset为0X 3f0, 段大小sh_size为0X 182

下面用readelf –S elf1命令先去看看elf1的section table中存放的所有的 section header。

我们用readelf 命令去查看.text这个 section 中的内容,
输入readelf –x 14 elf1,对14索引号的.text的section的内容进行查看:

下面用 hexdump 的方法去读取.text这个 section 中的内容,通过看section header中.text中offset和size分别是0x3f0和0x182,通过16进制向10进制转换得到offset:1008和size:386。
输入 hexdump –s 1008 –n 386 –C elf1

得到了和上面的readelf得到的相同。
使用下面命令对elf1的文本段(.text)进行反汇编:
objdump
–d elf1 得到如下图:

可以看出,使用反汇编的16进制数据和前面查找到的是相同的。

我们可以使用相同的方法对其他section进行查看,.data 数据段 .bbs 堆栈段(存放没有初始化的数据) .symtab(符号表)段。
① 查看.data数据段的section
比较简单,使用readelf –x 24(索引号) elf1(文件名)来查看

同理分析其他段表
4、理解常见.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。

Linux内核分析——ELF文件格式分析的更多相关文章
- Linux实践:ELF文件格式分析
标签(空格分隔): 20135321余佳源 一.基础知识 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...
- Linux课题实践四——ELF文件格式分析
2.4 ELF文件格式分析 20135318 刘浩晨 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...
- linux第三次实践:ELF文件格式分析
linux第三次实践:ELF文件格式分析 标签(空格分隔): 20135328陈都 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文 ...
- Linux及安全实践四——ELF文件格式分析
Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...
- 20135337——linux实践三:ELF文件格式分析(32位系统)
ELF文件格式分析 可重定位文件 十六进制形式显示内容 显示各个段.符号表相关信息 查看各个段信息 elf文件头信息 段表 符号表信息 查看堆栈 具体分析 1.ELF文件头信息(小字节优先,均十六进制 ...
- 20135306 2.4 ELF文件格式分析
2.4 ELF文件格式分析 20135306 黄韧 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标 ...
- linux实践之ELF文件分析
linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf ...
- Linux内核--网络栈实现分析(十一)--驱动程序层(下)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7555870 更多请查看专栏,地 ...
- Linux内核--网络栈实现分析(七)--数据包的传递过程(下)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地 ...
随机推荐
- 解决win10系统dpi放大后,部分网页文字颜色很浅的问题
前段时间,换了个27寸的4k显示器.原始分辨率下文字太小,眼睛估计得看瞎 放大dpi后,这问题,那问题,好多 百度知道,淘宝,这网页文字颜色也非常的浅,看着眼睛很累人 看了半天是字体若的祸 暂时发现A ...
- 学生与部门管理app-产品功能与界面的简单设计
学生与部门管理app-产品功能与界面的简单设计 1. 结对成员学号 我:********* 大佬:*******10 2. 需求分析(NABCD模型) 2.1 N-需求 各个部门在开学初占据学校青春广 ...
- St_geometry 初始用
数据准备 点表 CREATE TABLE point_stgeom tablespace UBOSS_STS_WAREHOUSE as select car_number, longid, latid ...
- 【html5】如何让Canvas标签自适应设备
javascript方法: var oC=document.querySelectorAll('canvas')[0];oC.width=document.documentElement.client ...
- E325: ATTENTION
vim/vi编辑器异常 E325: ATTENTION Found a swap file by the name "/usr/local/msmtp/etc/.msmtprc.swp&qu ...
- 理解WebSocket心跳及重连机制(五)
理解WebSocket心跳及重连机制 在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件.这样会有:服务器会继续向客户端发送多余的 ...
- HDU1233(Kruskal&Prim两解)
https://vjudge.net/problem/HDU-1233 还是畅通工程 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以 ...
- NSTimer深入理解
NSTimer,即计时器,用于定时执行一些任务,一次或者多次. 系统Foundation框架提供的最常用方法如下,创建一个NSTimer,并将它放到当前runloop的default mode中. + ...
- <转>浅谈缓存击穿、缓存并发和缓存失效
原文地址:缓存穿透.缓存并发.缓存失效之思路变迁 我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 一.缓存穿透 注 ...
- Omi框架学习之旅 - 之开篇扯蛋
说实话, 我也不知道Omi是干啥的, 只因此框架是alloyTeam出的, dntzhang写的, 也有其他腾讯大神参与了, 还有一些其他贡献者, 以上我也不太清楚, 当我胡说八嘎. 因其写法有人说好 ...