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

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

    标签(空格分隔): 20135321余佳源 一.基础知识 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...

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

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

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

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

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

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

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

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

  6. 20135306 2.4 ELF文件格式分析

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

  7. linux实践之ELF文件分析

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

  8. Linux内核--网络栈实现分析(十一)--驱动程序层(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7555870 更多请查看专栏,地 ...

  9. Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地 ...

随机推荐

  1. Git学习记录 力做全网最强入门教程

    目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...

  2. 使用sublime编写python、php代码前的一些配置

    1.使用sublime编写python代码 打开sublime软件,Tools —> Build System —> New Build System,得到后缀名为“sublime-bui ...

  3. json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1

    问题描述:使用Python代码将txt城市列表文件转换为xls文件,源码如下, #!/usr/bin/env Python # coding=utf-8 import os import json i ...

  4. Tensorflow张量

    张量常规解释 张量(tensor)理论是数学的一个分支学科,在力学中有重要应用.张量这一术语起源于力学,它最初是用来表示弹性介质中各点应力状态的,后来张量理论发展成为力学和物理学的一个有力的数学工具. ...

  5. 【洛谷】【动态规划/01背包】P1734 最大约数和

    [题目描述:] 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. [输入格式:] 输入一个正整数S. [输出格式:] 输出最大的约数之和. [算法分析:] 01背包,每个数 ...

  6. c#中开发ActiveX的学习笔记

    1.为什么要用ActiveX? 网页本身的功能是有限的,要想实现一些网页本身不支持的功能,比如:网页上的p2p视频播放,就得靠ActiveX这种古老的技术. 2.c#能开发ActiveX吗? 严格意义 ...

  7. dirty_background_ration 与 /proc/sys/vm/dirty_ratio

    wappiness的值的大小对如何使用swap分区是有着很大的联系的.swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用s ...

  8. QT 12 QTimage转换Mat

    QImage cvMat2QImage(const cv::Mat& mat) { // 8-bits unsigned, NO. OF CHANNELS = 1 if(mat.type() ...

  9. go标准库的学习-mime

    参考:https://studygolang.com/pkgdoc 导入方法: import "mime" mime实现了MIME的部分规定. 什么是MIME: MIME(Mult ...

  10. Signature Request Warnings & eth_sign学习

    https://consensys.zendesk.com/hc/en-us/articles/360004427792-Signature-Request-Warnings-eth-sign Met ...