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

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

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

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

一、分析ELF文件头

vi /usr/include/elf.h查看elf头数据结构

用readelf –h 1(可执行文件名)读取一个简单可执行文件的elf头

可见elf头大小为52字节,用dump命令16进制读取前52个字节进行分析

命令:hexdump –x 1 –n 52

解析:

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

第二行,e_type值为0x0002,表示是一个可执行文件。e_machine值为0x0003,表示是intel80386处理器体系结构。e_version值为0x00000001,表示是当前版本。e_entry值为0x08048320,表示入口点。e_phoff值为0x00000034,表示程序头表的偏移量为0x34即52个字节刚好是elf头大小。

第三行,e_shoff值为0x0000114c,表示节头表的偏移地址。e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0034,表示elf文件头大小52个字节。e_phentsize表示一个程序头表中的入口(程序头)的长度,值为0x0020即32字节。e_phnum的值为0x0009,给出程序头表中的入口数目。e_shentsize值为0x0028表示节头表入口(节头)大小为40字节。

第四行,e_shnum值为0x001e,表示节头表入口有30个。e_shstrndx值为0x001b,表示节名串表的在节表中的索引号。

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

vi /usr/include/elf.h查看节头数据结构

使用readelf -S 1读取节头表

使用命令hexdump 1查看16进制值

由前面分析elf头可知节头表的偏移地址为0x0000114c即图示位置开始为节头表

可见全为0,如节头表所示为空节

接着看第一个节

三个红框分别是节的起始地址、偏移地址和大小,可以看出与readelf的显示结果一致

随后的40字节是第二个段,以此类推不再赘述

第十三个节.text节为可执行指令的集合

下面用 hexdump 的方法去读取.text这个 section 中的内容,通过看section header中.text中offset和size分别是0x00000320和0x00000192,通过16进制向10进制转换得到offset:800和size:402。

输入 hexdump –s 800 –n 402 –C 1

然后使用readelf -x 13 1

两者也是一致的

使用objdump -d 1查看.text节反汇编代码

结果也是一致的

可以用同样的方法分析其他节

三、理解常见.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。

ELF文件格式分析的更多相关文章

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

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

  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. 20135337——linux实践三:ELF文件格式分析(32位系统)

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

  5. 20135306 2.4 ELF文件格式分析

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

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

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

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

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

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

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

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

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

随机推荐

  1. banner图片全屏显示

    <script> $(function () { function reinitSize() { var window_h = $(window).height(); var window ...

  2. mysqldump与innobackupex备份过程你知多少

    mysqldump与innobackupex备份过程你知多少 测试库表创建(这里在同一个库下创建两个表,一个表为innodb引擎,一个为myisam引擎) root@localhost : (none ...

  3. 使用POI读写word docx文件

    目录 1     读docx文件 1.1     通过XWPFWordExtractor读 1.2     通过XWPFDocument读 2     写docx文件 2.1     直接通过XWPF ...

  4. centos7下安装docker(13docker存储)

    Docker为容器提供了两种存放数据的资源: 1.storage driver管理的镜像层和容器层 2.Data volume Storage driver 之前我们学习镜像的时候知道镜像的分层结构: ...

  5. DBN 大作业

  6. window10+linux双系统安装

    参考教程 安装Windos U盘制作 启动UltraISO,点击“文件”菜单下的“打开”按钮,打开已准备好的ISO镜像文件,如JINHU_SYSTEM_TOOL_2009.iso 刻录U盘过程.点击菜 ...

  7. go标准库的学习-net/rpc/jsonrpc

    参考:https://studygolang.com/pkgdoc 导入方式: import "net/rpc/jsonrpc" jsonrpc包实现了JSON-RPC的Clien ...

  8. oracle创建em

    语法:emca -config dbcontrol db [-repos (create | recreate)] [-cluster] [-silent] [-backup] [parameters ...

  9. Android学习之基础知识四-Activity活动4讲(Intent传递数据)

    Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据.  一.使 ...

  10. 数据库隔离级别深入理解(ORACLE)

    TRANSACTION_READ_UNCOMMITTED 1 这种隔离级别最低,脏读,不可重复读,幻读都会发生,我用的oracle,并没有支持这个级别,不作研究. TRANSACTION_READ_C ...