Linux实践:ELF文件格式分析

时间:2022-09-16 08:34:23

标签(空格分隔): 20135321余佳源


一、基础知识

ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序。ELF文件(目标文件)格式主要三种:

  • 可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。(目标文件或者静态库文件,即linux通常后缀为.a和.o的文件)
  • 可执行文件:文件保存着一个用来执行的程序。(例如bash,gcc等)
  • 共享目标文件:共享库。文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接。(linux下后缀为.so的文件。)

一般的 ELF 文件包括三个索引表:

  • ELF header ELF头,在文件的开始,保存了路线图,描述了该文件的组织情况。
  • Program header table 程序头表,告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。
  • Section header table 段节头表,包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。

二、ELF文件头(ELF header)的分析

进入终端输入:cd /usr/include 进入include文件夹后查看elf.h文件,查看ELF的文件头包含整个文件的控制结构,这里看到的是32位系统的elf.h

Linux实践:ELF文件格式分析

  • e_ident

    这个最初的字段标示了该文件为一个可执行的object文件,提供了一个机器无关的数据,解释文件的内容。

  • e_type

    确定了object的类型

  • e_version

    确定object的文件版本

  • e_entry

    是系统第一个传输控制 的虚拟地址,在那启动进程,假如文件没有如何关联的入口点,该值为0

  • e_phoff

    program header offset, 保持了程序头表在文件中的偏移量(bytes),假如没有程序头表的话,该值为0

  • e_shoff

    section header offset,保持着段节头表在文件中的偏移量(bytes),如果没有段节头表的话,该值为0

  • e_flags

    保存着相关文件的处理器标志

  • e_ehsize

    elf header size,保存着ELF头大小(bytes)

  • e_phentsize

    program header entry size,保存着在文件的程序头表中一个入口的大小(bytes),所有入口大小都一样。

  • e_phnum

    program header number,保存着程序头表的个数,也就是说和e_phentsize的乘积就是表的大小(bytes),如果没有程序头表,

  • e_shentsize

    section header entry size,section段节头大小(bytes),一个段节 头在段节头表中的一个入口,所有入口同样大小

  • e_shnum

    section header number,保存着在段节头表中的入口数目,与e_shentsize乘积是section头表的大小,如果没有section头表,该值为0

  • e_shstrndx

    section header string index,保存跟段节section名字字符表相关入口的section头表索引,假如没有section名字字符表,该值就会变成SHN_UNDEF,section header null,undefine

接下来对fish的elf文件头进行分析

Linux实践:ELF文件格式分析

又图可以看出elf头大小为52bytes,接下来可以使用hexdump -x fish -n 52来查看fish文件头的前52bytes并分析其格式

Linux实践:ELF文件格式分析

第一行,本系统是小端法显示,对应e_ident前四个字节457f464c,就是7f454c46,就是7f elfd对应的ASCII码,接下来一个01就是表示32位机器,接下来一个01,就是小端法的表示,再接着一个01,表示文件头版本,剩下默认设置为0。

第二行,e_type值为0x0002,表示这是一个可执行文件,e_machine值为0x0003,表示是intel80386的处理器体系结构,e_version值为0x00000001,表示当前版本,e_entry为0x08048370,表示其入口地址,e_phoff值为0x00000034,表示该程序头为52bytes

第三行,e_shoff值为0x00001158,表示的是段表的偏移地址为4440bytes,e_flags为0x00000000,表示未定的处理器标志,e_ehsize值为0x0034,表示了elf头的大小是52bytes,e_phentsize,值为0x0020表示了其中一个程序头表的入口大小是32bytes,e_phnum值是0x0009,表示程序头表的入口数为9个,e_ehentsize值为0x0028,表示了该段节的头大小为40bytes。

第四行,e_shnum值为0x001e,表示了段表入口有30个,e_shstrndx值为0x001b,表示了该段在段名字字符表中索引号是27号

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

输入readelf -S fish查看fish的section header table内容

Linux实践:ELF文件格式分析

  • [Nr]表示对应的section索引值
  • Name,名称
  • Type,section的类型
  • Addr,起始地址
  • Off,section偏移地址
  • size,section大小

输入readelf -s fish查看fish的符号表

Linux实践:ELF文件格式分析

四、通过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。

下面以可执行文件fish为例,以保存代码段的 section 为例来讲解读取某个section 的过程。

由上面的图可以看出32位系统的section header结构体

看到e_shoff值0x00001158可以知道段表地址偏移为0x1158,e_shnum值为0x001e可知段表入口30个,即从0x1158开始有30个段占了40bytes

接下来开始输入hexdump fish查看全部的16进制信息,并找到第一段开始读取

Linux实践:ELF文件格式分析

不过这里第一段全为0。

接下来是第二段

Linux实践:ELF文件格式分析

可以对应section header table看看发现是符合的,第二段是.interp段,起始地址0x08048154,偏移量是0x000154,大小是13

接着是第三段

Linux实践:ELF文件格式分析

是.note.ABI-tag段,起始地址是0x08048168,偏移量是0x000168,大小是20

同理可以看其他的段

比如说.text段,即可执行指令的集合,起始地址是0x08048370,偏移地址370,大小是1e2,换算十进制后再使用hexdump -s 880 -n 472 -C fish查看对应的数据

Linux实践:ELF文件格式分析

Linux实践:ELF文件格式分析

这时可以使用readelf -x 13 fish查看.text段的数据:

Linux实践:ELF文件格式分析

两者对比发现数据一致,说明通过section header table 成功找到了.text数据节,然后使用objdump -d fish找到.text段的数据并和section header table与readelf两者找到的一样

Linux实践:ELF文件格式分析

五、理解常见的.text .strtab .symtab .rodata等section

  • .text

    代码段,存储二进制的机器指令,这些指令可以被机器直接执行

  • .rodata

    read only data,只读数据段,存储程序中所使用的复杂常量,比如字符串。

  • .data

    数据段,存储程序中已经被明确初始化的全局数据,包括C语言的全局变量和静态变量,如果全局数据被初始化为0,则不存储在数据段中,而是存储在块数据段中,C语言局部数据存储在栈中,不出现在数据段中。

  • .bss

    块数据段,存储未被明确初始化的全局变量,在目标文件中,这个段并不占有空间,而仅仅是一个占位符,以告知指定位置上应当预留全局数据的空间,块缓存段存在的原因是为了提高磁盘的空间利用率

  • .symtab

    一个符号表,存放在程序中被定义和引用的函数和全局变量的信息,但是不包括局部变量的表目

  • .strtab

    string table,字符串表,其内容包括了.symtab和.debug节中的符号表,以及节头部中的节名称,字符串表就是以null结尾的字符串序列

Linux实践:ELF文件格式分析的更多相关文章

  1. 实践——ELF文件格式分析

    一.分析文件头 1. 段入口类型定义(/usr/include/elf.h)下面产生的hello是32位的 使用命令#Hexdump –x ELF_1.o 第一行: 前4字节,蓝色部分,是一个魔数,表 ...

  2. linux第三次实践:ELF文件格式分析

    linux第三次实践:ELF文件格式分析 标签(空格分隔): 20135328陈都 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文 ...

  3. Linux及安全实践四——ELF文件格式分析

    Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...

  4. Linux课题实践四——ELF文件格式分析

    2.4   ELF文件格式分析 20135318 刘浩晨 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...

  5. 20135337——linux实践三:ELF文件格式分析(32位系统)

    ELF文件格式分析 可重定位文件 十六进制形式显示内容 显示各个段.符号表相关信息 查看各个段信息 elf文件头信息 段表 符号表信息 查看堆栈 具体分析 1.ELF文件头信息(小字节优先,均十六进制 ...

  6. 实践2.4 ELF文件格式分析

    实践2.4 ELF文件格式分析 1.ELF文件头 查看/usr/include/elf.h文件: #define EI_NIDENT (16) typedef struct { unsigned ch ...

  7. 20135306 2.4 ELF文件格式分析

    2.4   ELF文件格式分析 20135306 黄韧 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标 ...

  8. Linux课程实践四:ELF文件格式分析

    一.ELF文件格式概述 1. ELF文件 ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东 ...

  9. ELF文件格式分析--结构篇

    ELF文件格式,全称为Excutable and Linking Format,是一个开放的可执行文件和链接文件格式,在LINUX上很流行,跨平台软件的设计也多以ELF格式作为标准,其结构扩展性兼容性 ...

随机推荐

  1. TC Hash Filter

    Overview The u32 filter allows you to match on any bit field within a packet, so it is in some ways ...

  2. object-c 内存管理机制的学习

    1.内存的创建和释放 让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期.首先创建一个对象: //“ClassName”是任何你想写的类名,比如NSString NS ...

  3. Spring常见问题解决办法汇总

    解决The prefix 'context' for element 'context:component-scan' is not bound<beans xmlns="http:/ ...

  4. SpringMVC全注解

    SpringMVC全注解不是你们那么玩的 前言:忙了段时间,忙得要死要活,累了一段时间,累得死去活来. 偶尔看到很多零注解配置SpringMVC,其实没有根本的零注解. 1)工程图一张: web.xm ...

  5. Android网络请求框架之Retrofit实践

    网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的 ...

  6. 新世界主机&lowbar;XenServer7&period;0都有哪些优势?

    新世界主机VPS全部都采用了Xen硬件虚拟化技术,每个用户都能够独享资源,一键就可以创建和重装VPS,每个VPS都拥有足够的带宽,保证顺畅运行(http://m.0830mn.com). 新世界主机使 ...

  7. Java io 入门

    目录 前言 代码演练 字符流 FileReader,FileWriter: BufferedReader,BufferedWriter: InputStreamReader,OutputStreamW ...

  8. 「WC2018」州区划分(FWT)

    「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...

  9. BZOJ4985 评分 二分答案、DP

    传送门 题意:自己去看 答案满足单调性,所以考虑二分答案. 二分答案很好想,但是check并不是很好想. 考虑DP:设$f_i$表示队列中第$i$个人的分数$\geq \, mid$的代价,最开始$N ...

  10. JPA&plus;Hibernate 3&period;3 ——第一个JPA程序

    所需要的最小的jar包(注意:jar包所在路径不能含有空格或中文) hibernate3.jarhibernate-cglib-repack-2.1_3.jarslf4j-api-1.5.2.jarj ...