2.4   ELF文件格式分析

20135318 刘浩晨

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

1)可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。(目标文件或者静态库文件,即linux通常后缀为.a和.o的文件)

2)可执行文件:文件保存着一个用来执行的程序。(例如bash,gcc等)

3)共享目标文件:共享库。文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接。(linux下后缀为.so的文件。)

目标文件既要参与程序链接又要参与程序执行:

一般的 ELF 文件包括三个索引表:ELF  header,Program  header  table,Section header table。

1)ELF  header:在文件的开始,保存了路线图,描述了该文件的组织情况。

2)Program  header  table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。

3)Section  header  table :包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。

1、     分析ELF文件头(ELF  header)

进入终端输入:cd /usr/include/elf.h,查看ELF的文件头包含整个文件的控制结构

代码项含义:

  最开头是16个字节的e_ident, 其中包含用以表示ELF文件的字符,以及其他一些与机器无关的信息。开头的4个字节值固定不变,为0x7f和ELF三个字符。

    e_type 它标识的是该文件的类型。

    e_machine 表明运行该程序需要的体系结构。

    e_version 表示文件的版本。

    e_entry 程序的入口地址。

    e_phoff 表示Program header table 在文件中的偏移量(以字节计数)。

    e_shoff 表示Section header table 在文件中的偏移量(以字节计数)。

    e_flags 对IA32而言,此项为0。

    e_ehsize 表示ELF header大小(以字节计数)。

    e_phentsize 表示Program header table中每一个条目的大小。

    e_phnum 表示Program header table中有多少个条目。

    e_shentsize 表示Section header table中的每一个条目的大小。

    e_shnum 表示Section header table中有多少个条目。

    e_shstrndx 包含节名称的字符串是第几个节(从零开始计数)。

  • 编写一个简单代码elf1.c为例:
#include <stdio.h>
void main()
{
int a=20135318;
printf(“Hello %d”,a);
}

进行编译运行,生成elf.o的目标文件:gcc –c elf1.c –o elf1.o。

ls –l elf1.o查看文件大小,为1032字节:

readelf –a elf1.o得到下面的ELF头文件的信息,如下图:

通过上图信息,可以得出Elf Header的Size为52bytes,所以可以使用hexdump工具将头文件的16进制表打开,或使用objdump –x elf1.o来显示.o中各个段以及符号表的相关信息:

hexdump –x elf1 –n 64查看elf文件头的16进制表(前64bytes)对格式进行分析。

注意:由于intel及其兼容处理器使用小端法,此处的-x命令选项是一次性输出两个字节,457f实际表示的是7f45,以此类推。

第一行,对应e_ident[EI_NIDENT]。实际表示内容为7f454c46010101000000000000000000,前四个字节7f454c46(0x45,0x4c,0x46是'e','l','f'对应的ascii编码)是一个魔数,表示这是一个ELF对象。接下来的一个字节01表示是一个32位对象(02是64位对象),接下来的一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.

第二行,e_type(两字节)值为0x0001,表示是一个重定位文件。

e_machine(两字节)值为0x0003,表示是Intel 80386处理器体系结构。

e_version(四字节)值为0x00000001,表示是当前版本。

e_entry(四字节)值为0x00000000,表示没有入口点。

e_phoff(四字节)值为0x00000000,表示程序头表。

第三行,e_shoff(四字节)值为0x00000124,表示段表的偏移地址。

e_flags(四字节)值为0x00000000,表示未知处理器特定标志(#define EF_SH_UNKNOWN 0x0)。

e_ehsize(两字节)值为0x0034,表示elf文件头大小为0x34H(正好是52个字节)。

e_phentsize(两字节)值为0x0000,表示一个program header大小为0。

e_phnum(两字节)的值为0x0000,给出program header表中的入口数目。

e_shentsize(两字节)值为0x0028表示段头大小为40字节。

第四行,e_shnum(两字节)值为0x000d,表示段表入口有13个。

e_shstrndx(两字节)值为0x000a,表示段名串表的在段表中的索引号(由此知.shstrtab段(符号表)的信息在段表的索引号是10)。

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

刚才已经使用objdump –x elf1.o来显示.o中各个段以及符号表的相关信息,现在可以输入:readelf –a elf1来查看各个段信息:

段表Section header table

符号表 Symbol table

再用readelf –s elf1.o查看:

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。

  ELF
header得到了e_shoff变量的值为0X00000124,也就是table入口的偏移量,通过看e_shnum值为0x000d,表示段表入口有13个。

  所以从0x00000124开始有13个段,每个段占40个字节大小,输入 hexdump elf1查看:

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

第二个段,为.text段,段偏移sh_offset为0X0034,段大小sh_size为0X0027。

第三个段,为.rel.text段,段偏移sh_offset为0X03f0,段大小sh_size为0X0010。

.......

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

首先,我们可以用readelf 命令去查看.text这个 section 中的内容,输入readelf –x 1 elf1.o,对1索引号的.text的section的内容进行查看;

其次,也用 hexdump 的方法去读取.text这个 section 中的内容,通过看section header中.text中offset和size分别是0x000034和0x000027,通过16进制向10进制转换得到offset:52和size:39。输入 hexdump –s 52–n 39 –C elf1。得到了和上面的readelf得到的相同。

最后再用使用下面命令对elf1的文本段(.text)进行反汇编,objdump
–d elf1  得到如下图:

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

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文件格式分析的更多相关文章

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

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

  2. 20135218 实践四 ELF文件格式分析

    一 :概述 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标文件)格式主要三种: (1)可重定向文件:文 ...

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

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

  4. Linux实践:ELF文件格式分析

    标签(空格分隔): 20135321余佳源 一.基础知识 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. Linux课题实践五——字符集总结与分析

    Linux课题实践三——字符集总结与分析 20135318  刘浩晨 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字 ...

  8. linux实践之ELF文件分析

    linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf ...

  9. Linux课题实践三——程序破解

    2.3   程序破解 20135318 刘浩晨 1.     掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即“空指令”.执行到NOP指令时,CPU什么也不做,仅仅当做一 ...

随机推荐

  1. Python作业第一课

    零基础开始学习,最近周边的同学们都在学习,我也来试试,嘿嘿,都写下来,下次不记得了还能来看看~~ Python作业第一课1)登陆,三次输入锁定,下次不允许登陆2)设计一个三级菜单,菜单内容可自行定义, ...

  2. Treiber Stack介绍

    简介 Treiber Stack在 R. Kent Treiber在1986年的论文Systems Programming: Coping with Parallelism中首次出现.它是一种无锁并发 ...

  3. zip 的 压缩与解压

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xiananliu/article/details/23993481 zip格式是开源的相比rar格式 ...

  4. IOS HTML5页面中数字自动变蓝并识别为手机号

    开发HTML5的项目时发现页面元素为一串数字时,IOS手机会默认显示成蓝色字体,并且添加下划线,点击数字时会提示是否识别为手机号. 解决此问题的方法很简单,在head标签中添加下面的meta标记即可解 ...

  5. CSS3渐变——线性渐变

    渐变背景一直以来在Web页面中都是一种常见的视觉元素.但一直以来,Web设计师都是通过图形软件设计这些渐变效果,然后以图片形式或者背景图片的形式运用到页面中.Web页面上实现的效果,仅从页面的视觉效果 ...

  6. yii2 修改验证码小部件样式

    <?= $form->field($model, 'verifyCode',['labelOptions' => ['class' => 'yanzhengma','style ...

  7. oracle hint 使用

    --和优化器相关的hint 1./*+ ALL_ROWS */表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. SELECT /*+ ALL+_ROWS */ EMP_NO,E ...

  8. Maven快照机制(SNAPSHOT)

    文章转自 http://www.cnblogs.com/EasonJim/p/6852840.html 以下引用自https://ayayui.gitbooks.io/tutorialspoint-m ...

  9. <数据结构与算法分析>读书笔记--运行时间中的对数及其分析结果的准确性

    分析算法最混乱的方面大概集中在对数上面.我们已经看到,某些分治算法将以O(N log N)时间运行.此外,对数最常出现的规律可概括为下列一般法则: 如果一个算法用常数时间(O(1))将问题的大小削减为 ...

  10. zabbix学习-zabbix安装

    本次安装教程完全参考官方rpm安装教程: https://www.zabbix.com/documentation/3.4/zh/manual/installation/install_from_pa ...