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

时间:2021-12-12 08:41:18

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

标签(空格分隔): 20135328陈都


一、概述

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

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

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

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

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

  • 进入终端输入:cd /usr/include 进入include文件夹后查看elf.h文件,查看ELF的文件头包含整个文件的控制结构
    linux第三次实践:ELF文件格式分析

  • 写一个小程序(hello 20135328)进行编译,生成hello可执行文件。
    使用‘readelf –a hello’命令,都得到下面的ELF Header头文件的信息,如下图:
    linux第三次实践:ELF文件格式分析
    linux第三次实践:ELF文件格式分析

  • 通过上图信息,可以得出Elf Header的Size为52bytes,所以可以使用hexdump工具将头文件的16进制表打开。
    如下图使用:‘hexdump -x hello -n 52 ’命令来查看hello文件头的16进制表(前52bytes)对格式进行分析。
    linux第三次实践:ELF文件格式分析

  • 第一行
    • 对应e_ident[EI_NIDENT]。实际表示内容为7f454c46010100010000000000000000,前四个字节7f454c46(0x45,0x4c,0x46是'e','l','f'对应的ascii编码)是一个魔数,表示这是一个ELF对象。
    • 接下来的一个字节01表示是一个32位对象,接下来的一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.
  • 第二行
    • e_type值为0x0002,表示是一个可执行文件
    • 。e_machine值为0x003e,表示是Advanced Micro Devices X86-64处理器体系结构。
    • e_version值为0x00000001,表示是当前版本。
    • e_entry值为0x 08048320,表示入口点。
  • 第三行
    • e_phof f值为0x1178,表示程序头表。
    • e_shoff值为0x0034,表示段表的偏移地址。
  • 第四行
    • e_flags值为0x001e,表示未知处理器特定标志。
    • e_ehsize值为0x0034,表示elf文件头大小(正好是52bytes)。
    • e_phentsize表示一个program header表中的入口的长度,值为0x0020。
    • e_phnum的值为0x0009,给出program header表中的入口数目。
    • e_shentsize值为0x0028表示段头大小为40个字节。e_shnum值为0x001e,表示段表入口有30个。
    • e_shstrndx值为0x001b,表示段名串表的在段表中的索引号。

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

  • file elf显示生成的目标文件hello的类型
  • elf是一个可执行文件。输入:ls –l hello查看hello的大小:
    linux第三次实践:ELF文件格式分析
  • 如图可知,hello大小为7336字节。
    输入:hexdump –x hello来用16进制的数字来显示hello的内容
    (其中,第二列是16进制表示的偏移地址)
    linux第三次实践:ELF文件格式分析
  • 输入:objdump –x hello来显示hello中各个段以及符号表的相关信息:
    linux第三次实践:ELF文件格式分析
  • 输入:readelf –a hello来查看各个段信息:
  • ELF文件头信息:
    linux第三次实践:ELF文件格式分析
  • 段表Section header table:
    linux第三次实践:ELF文件格式分析
  • 符号表 Symbol table:
    linux第三次实践:ELF文件格式分析
    linux第三次实践:ELF文件格式分析
    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。

下面以可执行文件hello为例,以保存代码段的 section 为例来讲解读取某个section 的过程。
使用‘vi /usr/include/elf.h ’命令查看Sections Header的结构体:
linux第三次实践:ELF文件格式分析

由上面分析可知,section headers table中的每一个section header所占的size均为64字节,ELF header得到了e_shoff变量的值为0X0034,也就是table入口的偏移量,通过看e_shnum值为0x001e,表示段表入口有30个。
所以从0x00000034开始有30个段,每个段占40个字节大小,输入 hexdump hello查看:
linux第三次实践:ELF文件格式分析

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

  • 第三个段,为.note.ABI-tag段

  • 第四个段,为.note.gnu.build-i段

  • 第五个段,为.gnu.hash段

.......

  • 第十四个段,为.text段

  • 第十六个段,为.rodata段

  • 第二十五个段,为.data段

  • 第二十六个段,为.bss段

  • 第二十九个段, 为.symtab段

  • 第三十个段, 为.strtab段

我们用readelf 命令去查看.text这个 section 中的内容,
输入readelf –x 13 hello,(.text前面的标号为13)对13索引号的.text的section的内容进行查看:
linux第三次实践:ELF文件格式分析

下面用 hexdump 的方法去读取.text这个 section 中的内容,通过看section header中.text中offset和size分别是0x320和0x192
输入 hexdump –C hello
找到320后的192个
linux第三次实践:ELF文件格式分析
linux第三次实践:ELF文件格式分析
得到了和上面的readelf得到的相同。
使用下面命令对hello的文本段(.text)进行反汇编:
objdump –d hello 得到如下图:
linux第三次实践:ELF文件格式分析
linux第三次实践:ELF文件格式分析
可以看出,使用反汇编的16进制数据和前面查找到的是相同的。

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

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

  1. text section是可执行指令的集合,.data和.text都是属于PROGBITS类型的section,这是将来要运行的程序与代码。查询段表可知.text section的位偏移为0x0000320,size为0x0000192。
  2. strtab section是属于STRTAB类型的section,可以在文件中看到,它存着字符串,储存着符号的名字。位偏移为0x000106f,size为0x0000106
  3. symtab section存放所有section中定义的符号名字,比如“data_items”,“start_loop”。 .symtab section是属于SYMTAB类型的section,它描述了.strtab中的符号在“内存”中对应的“内存地址”。 位偏移为0x0001628,size为0x0000430。
  4. rodata section,ro代表read only。位偏移为0x000050c,size为0x00000b0。

linux第三次实践:ELF文件格式分析的更多相关文章

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

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

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

    ELF文件格式分析 可重定位文件 十六进制形式显示内容 显示各个段.符号表相关信息 查看各个段信息 elf文件头信息 段表 符号表信息 查看堆栈 具体分析 1.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. 实践2.4 ELF文件格式分析

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

  6. 20135306 2.4 ELF文件格式分析

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

  7. LINUX第三次实践:程序破解

    LINUX第三次实践:程序破解 标签(空格分隔): 20135328陈都 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令".执行到NOP ...

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

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

  9. 20135323符运锦----LINUX第三次实践:程序破解

    程序破解 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 ①NOP:NOP指令即"空指令".执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行N ...

随机推荐

  1. ASP.NET 下载文件并继续执行JS解决方法

    需求说明:当用户点击按钮时使当前按钮为不可用,并打开新页面,关闭新页面时,按钮变为可用.并且如果不关闭新页面,当前按钮过10秒钟自动变为可用. 包含3个页面: 一.按钮页 前台代码:当刷新后采用js进 ...

  2. 如何部署Scrapy 到Scrapyd上?

    安装上传工具 1.上传工具 scrapyd-client 2.安装方法: pip install scrapyd-client 3.上传方法: python d:\Python27\Scripts\s ...

  3. Java容器类概述

    1.简介 容器是一种在一个单元里处理一组复杂元素的对象.使用集合框架理论上能够减少编程工作量,提高程序的速度和质量,毕竟类库帮我们实现的集合在一定程度上时最优的.在Java中通过java.util为用 ...

  4. Apache Common StringUtils工具类

    1.List转换成字符串并加入分隔符 public String listToString(List list, char separator) { return org.apache.commons ...

  5. 获取IIS版本

    近日,有一项目要分别获取iis6.0和7.5,然后对进程进行操作~ 研究良久,有以下办法获取iis版本. 代码: DirectoryEntry getEntity = new DirectoryEnt ...

  6. mysql 从聚合函数group by到sql_mode

    说到group by, 想必大家都不陌生, 就是对查询的数据进行分组,我们可以通过该操作实现一些特殊需求,比如去重. 最近在项目中使用HQL:" from TSjrz where CBh = ...

  7. Spring Batch 远程分区和远程分块的区别

    Partitioning is a master/slave step configuration that allows for partitions of data to be processed ...

  8. Only one complex type allowed as argument to a web api controller action.

    错误内容: message":"An error has occurred.","exceptionMessage":"Only one c ...

  9. python 游戏(数字推理游戏Bagels)

    1.游戏思路和流程图 实现功能:玩家猜测三位不一样的数字,猜错了有提示,提示分别为(位置错误数字正确),(位置和数字正确),(数字和位置都不正确) 游戏流程图 2. 使用模块和游戏提示 import ...

  10. Java程序猿笔试面试之String

    1.怎样实现字符串的反转比如:"how are you"--->"you are how" 2.怎样推断2个字符串是否有同样的字符组成 比如"a ...