Linux实践四:ELF文件格式分析
一、分析ELF文件头
二、通过文件头找到section header table,理解内容
三、通过section header table 找到各section
四、理解常见.text .strtab .symtabl .rodata 等section
段入口类型定义(/usr/include/elf.h)下面产生的hello是32位的

Hexdump –x hello
对应内容是7f45

前4字节,蓝色部分,是一个魔数,表示这是一个ELF对象

下一个字节(右边这个)01说明是个32位对象(64位的是02);
再下一个字节是01,说明使用的是小端方式(PC大多使用)
再下来一个字节01表示文件头版本,剩下默认设置为0
第二行:
.e_type(占2字节)值为0x0002,表示是可执行文件
(若为0x0001,表示重定位文件)
e_machine(2字节)值为0003,说明是intel 80386
e_version(4字节)值为0x00000001,说明是当前版本(0,则是非法版本)
e_entry(4字节)值为0x8048310

第三行
e_phoff(4字节)值为0x00000034 ,表示程序头表
e_shoff(4字节)值为0x000017d4,表示段表的偏移地址
e_flags(4字节)0x00000000,表示未知处理器特点标志(#define EF_SH_UNKNOWN 0x0)
e_ehsize(2字节)0x0034,表示ELF文件头大小为0x34H,(64位的是0x40H)
e_phentsize(2字节)0x0020,program header的大小是32比特。
e_phnum(2字节) 0x0009,program headers的数量是9个
e_ ehentsize(2字节) 0x0028,表示段头大小为40字节(由此可知section header table 里面表个header的大小)
e_ shnum(2字节) 0x001f,表示段表入口地址有31个(由此知道段表有31个段)
e_shstrndx (2字节) 0x001c,表示段名串表的在段表中的索引号(由此知.shstrtab段(符号表)的信息在段表的索引号是28)
使用readelf -h hello查看ELF文件头,将上述分析结果,与下面的结果可以比较,查看自己分析得对不对。

e_type表示文件类型,2表示可执行文件。
e_machine:指明可以在哪种机器结构中运行。
e_version:指明版本信息
e_entry:指明系统运行该程序时将控制权转交到的虚拟地址的值,如果没有则为零。
e_phoff: program header table在文件中的字节(Byte)偏移offset,如果没有program header table, 则该值为零。
e_shoff: section header table在文件中的字节偏移,如果没有section header table, 则该值为零
e_flags: 有关处理器的信息
e_ehsize: elf header的大小,单位:字节
e_phentsize: 在program header table中一个entry的大小,前面提到过,program header table & section header table都是数组,所以它们的每一个元素,即每一个entry的大小,都是一样的。
e_phnum: program header table中元素的个数,即entry的个数。
e_shentsize: section header table每一个entry的大小,与e_phentsize类似。
e_shnum: section header table中元素的个数,即entry的个数。可以看出来,这个program header table或者section header table的大小可以用entry的个数乘以每一个entry的大小得到。
e_shstrndx: 指明string name table在section header table中的index。
section header table


program header

符号表:

可以使用readelf -s hello 查看

由之前文件头的分析可知:e_shoff(4字节)值为0x000017d4,表示段表的偏移地址
e_ ehentsize(2字节) 0x0028,表示段头大小为40字节(由此可知section header table 里面表个header的大小)
e_ shnum(2字节) 0x001f,表示段表入口地址有31个(由此知道段表有31个段)
段表大小 28H*1F=4D8H字节
0x000017d4+0xH=0X00001CAC
所以从0x000017d4—0X00001CAC,存储的是段表

在使用readelf -a hello时查看段表头的情况,
第一节区(17D4-17FC)

第二节区(17FC-1824)

第三节区(1824-184C)

第四节区(184C-1874)

第五节区(1874-189C)


通过段表头中存储的每个段的位偏移量以及段的大小找到段的具体内容。
.rela.textsection有关重定位的段,其偏移量不是有.text section的位偏移+段长度算的
.text section的位偏移+段长度计算出来的值是.data section的段偏移
反汇编指令和段的信息查看


Section Header table
目标文件的section header table可以定位所有的section,它是一个Elf32_Shdr结构的数组,Section头表的索引是这个数组的下标。有些索引号是保留的,目标文件不能使用这些特殊的索引。
Section包含目标文件除了ELF文件头、程序头表、section头表的所有信息,而且目标文件section满足几个条件:
目标文件中的每个section都只有一个section头项描述,可以存在不指示任何section的section头项。
每个section在文件中占据一块连续的空间。 Section之间不可重叠。 目标文件可以有非活动空间,各种headers和sections没有覆盖目标文件的每一个字节,这些非活动空间是没有定义的。
其中sh_name指出section的名字,它的值是后面将会讲到的section header string table中的索引,指出一个以null结尾的字符串。sh_type是类别,sh_flags指示该section在进程执行时的特性。sh_addr指出若此section在进程的内存映像中出现,则给出开始的虚地址。sh_offset给出此section在文件中的偏移。其它字段的意义不太常用,在此不细述。
文件的section含有程序和控制信息,系统使用一些特定的section,并有其固定的类型和属性(由sh_type和sh_info指出)。下面介绍几个常用到的section:“.bss”段含有占据程序内存映像的未初始化数据,当程序开始运行时系统对这段数据初始为零,但这个section并不占文件空间。“.data.”和“.data1”段包含占据内存映像的初始化数据。“.rodata”和“.rodata1”段含程序映像中的只读数据。“.shstrtab”段含有每个section的名字,由section入口结构中的sh_name索引。“.strtab”段含有表示符号表(symbol table)名字的字符串。“.symtab”段含有文件的符号表,在后文专门介绍。“.text”段包含程序的可执行指令。
参考资料:
* .bss
该sectiopn保存着未初始化的数据,这些数据存在于程序内存映象中。
通过定义,当程序开始运行,系统初始化那些数据为0。该section不占
文件空间,正如它的section类型SHT_NOBITS指示的一样。
* .comment
该section保存着版本控制信息。
* .data and .data1
这些sections保存着初始化了的数据,那些数据存在于程序内存映象中。
* .debug
该section保存着为标号调试的信息。该内容是未指明的。
* .dynamic
该section保存着动态连接的信息。该section的属性将包括SHF_ALLOC位。
是否需要SHF_WRITE是跟处理器有关。第二部分有更详细的信息。
* .dynstr
该section保存着动态连接时需要的字符串,一般情况下,名字字符串关联着
符号表的入口。第二部分有更详细的信息。
* .dynsym
该section保存着动态符号表,如“Symbol Table”的描述。第二部分有更
详细的信息。
* .fini
该section保存着可执行指令,它构成了进程的终止代码。
因此,当一个程序正常退出时,系统安排执行这个section的中的代码。
* .got
该section保存着全局的偏移量表。看第一部分的“Special Sections”和
第二部分的“Global Offset Table”获得更多的信息。
* .hash
该section保存着一个标号的哈希表。看第二部分的“Hash Table”获得更多
的信息。
* .init
该section保存着可执行指令,它构成了进程的初始化代码。
因此,当一个程序开始运行时,在main函数被调用之前(c语言称为main),
系统安排执行这个section的中的代码。
* .interp
该section保存了程序的解释程序(interpreter)的路径。假如在这个section
中有一个可装载的段,那么该section的属性的SHF_ALLOC位将被设置;否则,
该位不会被设置。看第二部分获得更多的信息。
* .line
该section包含编辑字符的行数信息,它描述源程序与机器代码之间的对于
关系。该section内容不明确的。
* .note
该section保存一些信息,使用“Note Section”(在第二部分)中提到的格式。
* .plt
该section保存着过程连接表(Procedure Linkage Table)。看第一部分的
``Special Sections''和第二部分的“Procedure Linkage Table”。
* .rel<name> and .rela<name>
这些section保存着重定位的信息,看下面的``Relocation''描述。
假如文件包含了一个可装载的段,并且这个段是重定位的,那么该section的
属性将设置SHF_ALLOC位;否则该位被关闭。按照惯例,<name>由重定位适用
的section来提供。因此,一个重定位的section适用的是.text,那么该名字
就为.rel.text或者是.rela.text。
* .rodata and .rodata1
这些section保存着只读数据,在进程映象中构造不可写的段。看第二部分的
``Program Header''获得更多的资料。
* .shstrtab
该section保存着section名称。
* .strtab
该section保存着字符串,一般地,描述名字的字符串和一个标号的入口相关
联。假如文件有一个可装载的段,并且该段包括了符号字符串表,那么section
的SHF_ALLOC属性将被设置;否则不设置。
* .symtab
该section保存着一个符号表,正如在这个section里``Symbol Table''的
描述。假如文件有一个可装载的段,并且该段包含了符号表,那么section
的SHF_ALLOC属性将被设置;否则不设置。
* .text
该section保存着程序的``text''或者说是可执行指令。
Linux实践四:ELF文件格式分析的更多相关文章
- Linux及安全实践四——ELF文件格式分析
Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...
- 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文件格式分析
标签(空格分隔): 20135321余佳源 一.基础知识 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文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf ...
- 【实践报告】Linux实践四
Linux内核分析 实践四——ELF文件格式分析 一.概述 1.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 ...
- 20135306 2.4 ELF文件格式分析
2.4 ELF文件格式分析 20135306 黄韧 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标 ...
随机推荐
- 【项目 · WonderLand】 系 统 设 计
团 队 作 业 ---- 系 统 设 计 Part 0 · 简 要 目 录 Part 1 · 完 善 需 求 规 格 说 明 书 Part 2 · 团 队 编 码 规 范 Part 3 · 数 据 库 ...
- navicat连接mysql时出现2003(10060)错误
问题解决步骤: 参考http://jingyan.baidu.com/article/95c9d20dac9040ec4f75617a.html,发现是防火墙未关闭: 那么我们就有两种方法去解决了 关 ...
- golang xorm框架的使用
1.创建engine engine, err := xorm.NewEngine(driverName, dataSourceName) 上述代码创建了一个数据库引擎,可以在一个程序中创建多个engi ...
- CentOS6.9 安装Oracle 11G 版本11.2.0.1.0
安装实例与数据库 CentOS6.9 安装Oracle 11G 版本11.2.0.1.0 一.检查系统类别. 查看 系统的类别,这里是 64位系统:[root@localhost ~]# uname ...
- intellij idea 修改背景保护色&&修改字体&&快捷键大全(转)
文章转自http://blog.csdn.net/hpf911/article/details/16888797 近Idea比较流行,Eclipse因为maven的问题,运行起来非常慢,各种提示也不够 ...
- 通过JSP网页连接MySQL数据库,从MySQL数据库中读出一张表并显示在JSP网页中
1.安装所需软件 ①安装java和tomcat,建立JSP网页最基础的软件②安装MySQL数据库(下载地址:https://www.mysql.com/)③安装Navicat Premium来查看数据 ...
- 【Codeforces 710F】String Set Queries
Codeforces 710 F 思路:KMP学的还是不过关啊... 按照字符串的长度分类,如果长度大于\(\sqrt{n}\)的就扔到什么地方等待查询,否则就扔进trie里面. 对于查询,我们先在t ...
- Android学习之基础知识八—Android广播机制
一.广播机制简介 Android提供了一套完整的API,允许应用程序自由的发送和接受广播,发送广播借助于我们之前学过的:Intent,而接收广播需要借助于广播接收器(Broadcast Receive ...
- 看think in java 随笔
java的方法是运行期动态绑定上去的,可以根据自己真正实例化的类来判断调用哪个方法,比如子类重写了父类方法,会调用子类方法. 而利用final关键字可以让方法不能重写,就可以在编译期就绑定,这样就可以 ...
- angularjs的$window功能小练习
我们想在一个文本框输入一些文字,然后点击铵钮,alert()出来. <div ng-app="alertApp" ng-controller="alertContr ...