ELF文件格式分析(一)

news2024/11/13 10:02:47

目录

  • 一、ELF 格式介绍
  • 二、ELF组成部分
    • 2.1) ELF Header
    • 2.2) Program Headers
    • 2.3)Section Headers Table
    • 2.3.2) Section

此篇文章介绍了ELF文件由哪些部分组成,他们的功能是什么,并在文章末尾给出了一份ELF文件解析的参考资料。

一、ELF 格式介绍

ELF(Executable and Linkable Format)即可执行的和可链接的格式。
出于方便性和效率考虑,ELF文件提供了两种并行视图,即链接视图,执行视图。
img

二、ELF组成部分

下面我们使用 readelf 来读取ls的文件信息

2.1) ELF Header

以Magic Str开头,描述文件类型,abi, version等信息,并提供到Program Header Table*和 Section Header Table的索引。

[root@localhost tgt]# readelf -h  /bin/ls
ELF 头:
  Magic:  7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  类别:                              ELF64
  数据:                              2 补码,小端序 (little endian)
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI 版本:                          0
  类型:                              DYN (共享目标文件)
  系统架构:                          AArch64
  版本:                              0x1
  入口点地址:              0x5914
  程序头起点:              64 (bytes into file)
  Start of section headers:          197648 (bytes into file)
  标志:             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         28
  Section header string table index: 27

2.2) Program Headers

存在于可执行文件或共享库中,是一个结构体组成的数组。一般在ELF Header之后。每个数组元素描述一个段(segment)或者其他程序执行时需要的信息;该结构用于执行阶段。

[root@localhost tgt]# readelf -l  /bin/ls

Elf 文件类型为 DYN (共享目标文件)
Entry point 0x5914
There are 9 program headers, starting at offset 64

程序头:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000000040 0x0000000000000040
                 0x00000000000001f8 0x00000000000001f8  R      0x8
  INTERP         0x0000000000000238 0x0000000000000238 0x0000000000000238
                 0x000000000000001b 0x000000000000001b  R      0x1
      [Requesting program interpreter: /lib/ld-linux-aarch64.so.1]
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000020780 0x0000000000020780  R E    0x10000
  LOAD           0x000000000002ef30 0x000000000003ef30 0x000000000003ef30
                 0x0000000000001380 0x0000000000002648  RW     0x10000
  DYNAMIC        0x000000000002f948 0x000000000003f948 0x000000000003f948
                 0x0000000000000220 0x0000000000000220  RW     0x8
  NOTE           0x0000000000000254 0x0000000000000254 0x0000000000000254
                 0x0000000000000044 0x0000000000000044  R      0x4
  GNU_EH_FRAME   0x000000000001c914 0x000000000001c914 0x000000000001c914
                 0x000000000000093c 0x000000000000093c  R      0x4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     0x10
  GNU_RELRO      0x000000000002ef30 0x000000000003ef30 0x000000000003ef30
                 0x00000000000010d0 0x00000000000010d0  R      0x1

 Section to Segment mapping:
  段节...
   00
   01     .interp
   02     .interp .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
   03     .init_array .fini_array .data.rel.ro .dynamic .got .data .bss
   04     .dynamic
   05     .note.gnu.build-id .note.ABI-tag
   06     .eh_frame_hdr
   07
   08     .init_array .fini_array .data.rel.ro .dynamic .got

2.3)Section Headers Table

索引每个section的位置,该结构用于链接阶段。

[root@localhost tgt]# readelf -S  /bin/ls
There are 28 section headers, starting at offset 0x30410:

节头:
  [] 名称              类型             地址              偏移量
       大小              全体大小          旗标   链接   信息   对齐
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .interp           PROGBITS         0000000000000238  00000238
       000000000000001b  0000000000000000   A       0     0     1
  [ 2] .note.gnu.build-i NOTE             0000000000000254  00000254
       0000000000000024  0000000000000000   A       0     0     4
  [ 3] .note.ABI-tag     NOTE             0000000000000278  00000278
       0000000000000020  0000000000000000   A       0     0     4
  [ 4] .gnu.hash         GNU_HASH         0000000000000298  00000298
       0000000000000040  0000000000000000   A       5     0     8
  [ 5] .dynsym           DYNSYM           00000000000002d8  000002d8
       0000000000000c90  0000000000000018   A       6     3     8
  [ 6] .dynstr           STRTAB           0000000000000f68  00000f68
       00000000000005e4  0000000000000000   A       0     0     1
  [ 7] .gnu.version      VERSYM           000000000000154c  0000154c
       000000000000010c  0000000000000002   A       5     0     2
  [ 8] .gnu.version_r    VERNEED          0000000000001658  00001658
       0000000000000070  0000000000000000   A       6     3     8
  [ 9] .rela.dyn         RELA             00000000000016c8  000016c8
       00000000000016f8  0000000000000018   A       5     0     8
  [10] .rela.plt         RELA             0000000000002dc0  00002dc0
       0000000000000a98  0000000000000018  AI       5    22     8
  [11] .init             PROGBITS         0000000000003858  00003858
       0000000000000014  0000000000000000  AX       0     0     4
  [12] .plt              PROGBITS         0000000000003870  00003870
       0000000000000730  0000000000000010  AX       0     0     16
  [13] .text             PROGBITS         0000000000003fa0  00003fa0
       0000000000013fa8  0000000000000000  AX       0     0     8
  [14] .fini             PROGBITS         0000000000017f48  00017f48
       0000000000000010  0000000000000000  AX       0     0     4
  [15] .rodata           PROGBITS         0000000000017f60  00017f60
       00000000000049b4  0000000000000000   A       0     0     16
  [16] .eh_frame_hdr     PROGBITS         000000000001c914  0001c914
       000000000000093c  0000000000000000   A       0     0     4
  [17] .eh_frame         PROGBITS         000000000001d250  0001d250
       0000000000003530  0000000000000000   A       0     0     8
  [18] .init_array       INIT_ARRAY       000000000003ef30  0002ef30
       0000000000000008  0000000000000008  WA       0     0     8
  [19] .fini_array       FINI_ARRAY       000000000003ef38  0002ef38
       0000000000000008  0000000000000008  WA       0     0     8
  [20] .data.rel.ro      PROGBITS         000000000003ef40  0002ef40
       0000000000000a08  0000000000000000  WA       0     0     8
  [21] .dynamic          DYNAMIC          000000000003f948  0002f948
       0000000000000220  0000000000000010  WA       6     0     8
  [22] .got              PROGBITS         000000000003fb68  0002fb68
       0000000000000498  0000000000000008  WA       0     0     8
  [23] .data             PROGBITS         0000000000040000  00030000
       00000000000002b0  0000000000000000  WA       0     0     8
  [24] .bss              NOBITS           00000000000402b0  000302b0
       00000000000012c8  0000000000000000  WA       0     0     8
  [25] .gnu.build.attrib NOTE             0000000000041578  000302b0
       0000000000000024  0000000000000000           0     0     4
  [26] .gnu_debuglink    PROGBITS         0000000000000000  000302d4
       0000000000000028  0000000000000000           0     0     4
  [27] .shstrtab         STRTAB           0000000000000000  000302fc
       0000000000000113  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  p (processor specific)

2.3.2) Section

节区名介绍
[.text].text 节是保存了程序代码指令的代码节。一段可执行程序,如果存在Phdr,.text 节就会存在于text 段中。由于.text 节保存了程序代码,因此节的类型为SHT_PROGBITS。
[.dynsym]保存了引用来自外部文件符号的全局符号,如printf 这样的库函数。.dynsym 是被标记了ALLOC 的,在运行时分配并装载进入内存,因此动态链接可执行文件的执行来说是必需的。该节保存在text 段中,节类型被标记为SHT_DYNSYM。
[.rodata].rodata 节保存了只读的数据,如一行C 语言代码中的字符串。下面这条命令就是存放在.rodata 节中的:
printf(“Hello World!\n”);因为.rodata 节是只读的,所以只能存在于一个可执行文件的只读段中。因此,只能在text 段(不是data 段)中找到.rodata 节。由于.rodata 节是只读的,因此节类型为SHT_PROGBITS。
[.plt]程序链接表(Procedure Linkage Table,PLT)包含了动态链接器调用从共享库导入的函数所必需的相关代码。由于其存在于text 段中,同样保存了代码,因此节类型为SHT_PROGBITS。
[.data]不要将.data 节和data 段混淆了,.data 节存在于data 段中,保存了初始化的全局变量等数据。由于其保存了程序的变量数据,因此类型被标记为SHT_PROGBITS。
[.bss].bss 节保存了未进行初始化的全局数据,是data 段的一部分,占用空间不超过4 字节,仅表示这个节本身的空间。程序加载时数据被初始化为0,在程序执行期间可以进行赋值。由于.bss 节未保存实际的数据,因此节类型为SHT_NOBITS。
[.got.plt].got 节保存了全局偏移表。.got 节和.plt 节一起提供了对导入的共享库函数的访问入口,由动态链接器在运行时进行修改。如果攻击者获得了堆或者.bss 漏洞的一个指针大小的写原语,就可以对该节任意进行修改。.got.plt 节跟程序执行有关,因此节类型被标记为SHT_PROGBITS。
[.symtab].symtab 中保存了可执行文件的本地符号,如全局变量,或者代码中定义的本地函数等。只是用来进行调试和链接的,有时候为了节省空间,会将.symtab 符号表从生产二进制文件中删掉

参考资料:

  1. ELF文件格式分析-北京大学操作系统实验室.pdf
  2. ELF文件 及 nm & readelf & objdump 使用与对比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/897839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信袋鼠尾形态选股公式,也称手指线

在《以交易为生》这本书中,作者埃尔德提到“袋鼠尾”形态(也称“手指线”),这是作者比较认可的图表信号,很有吸引力,也容易辨认。 袋鼠靠尾巴推动前进,跳跃方向和它的尾巴方向相反,…

Docker容器监控系统

目录 简化描述 Cadvisor InfluxDBGrafana 监控组件架构图 部署 安装docker-ce 阿里云镜像加速器 下载组件镜像 创建自定义网络 创建influxdb容器 创建granafa容器 简化描述 Docker作为目前十分出色的容器管理技术,得到大量企业的青睐,在生产环…

深度解读波卡 2.0:多核、更有韧性、以应用为中心

本文基于 Polkadot 生态研究院整理,有所删节 随着波卡 1.0 的正式实现,波卡于 6 月 28 日至 29 日在哥本哈根举办了年度最重要的会议 Polkadot Decoded 2023,吸引了来自全球的行业专家、开发者和爱好者,共同探讨和分享波卡生态的…

数据结构 - 算法的时间效率和空间效率

一、时间效率 程序在计算机上执行所消耗的时间。 两种估算方式: 事后统计事前分析 算法运行时间 一个简单操作所需的时间X简单操作次数 算法运行总时间 Σ每条语句执行次数(即:每条语句频度)X该语句执行一次所需的时间 每条语…

【SpringCloud】Hystrix使用

文章目录 Hystrix重要概念使用POM启动类YML示例Global fallback 服务降级,客户端去调用服务端,碰上服务端宕机或关闭服务熔断HystrixCommand中commandProperties参数 Hystrix执行流程服务监控hystrixDashboardPOM Hystrix重要概念 https://github.com/N…

Golang Gorm 更新字段 save update updates

更新和删除操作的前提条件都是要在找到数据的情况下,先要查询到数据才可以做操作。 更新的前提的先查询到记录,Save保存所有字段,用于单个记录的全字段更新它会保控所有字段,即使零值也会保存。 在更新和删除之前,要利…

Python学习笔记_进阶篇(二)_django知识(一)

本章简介: Django 简介Django 基本配置Django urlDjango viewDjango 模板语言Django Form Django 简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来…

不知道开黑语音哪个软件好?

黑盒语音官方网站:https://chat.top 免费支持AI降噪免费支持高品质立体声免费支持码率128Kbps,192Kbps免费支持上传100M文件免费支持动态房间头像和横幅支持更多自定义动态表情即将支持更多免费功能

Lua 语言笔记(一)

1. 变量命名规范 弱类型语言(动态类型语言),定义变量的时候,不需要类型修饰 而且,变量类型可以随时改变每行代码结束的时候,要不要分号都可以变量名 由数字,字母下划线组成,不能以数字开头,也不…

CSS:filter滤镜 详解(用法 + 代码 + 例子 + 效果)

文章目录 filter 滤镜blur() 模糊度例子 渐变光晕 brightness() 元素亮度contrast() 对比度grayscale() 元素灰度hue-rorate() 色相opacity() 透明度invert() 反转颜色saturate() 饱和度 backdrop-filter 蒙版,滤镜例子 卷轴展开 filter 滤镜 动图为效果添加前后对…

计算复杂度基础

1. 抽象问题 抽象问题包括决策问题和优化问题 注意:描述中,I的缩写是Instance,S的缩写是Solution。 2. 决策问题 3. 优化问题 将一个优化问题转换为决策问题后,不会变的更难。 \color {green}将一个优化问题转换为决策问题后&…

实验篇——多序列比对,构树

实验篇——多序列比对,构树 文章目录 前言一、名词解释二、实操1. 文件准备2. 多序列比对3. 对比对序列修剪4. 构建进化树5. 可视化进化树 总结 前言 系统发育树构建的软件大致有如下几种策略:从最简单的UPGMA法,到邻接法,最大简…

一文学会配置Fanuc控制柜端ROS2驱动

文章目录 前言一、RobotGuide是什么?二、实现步骤创建机器人工作单元导入程序TP程序Karel程序 构建程序配置控制柜配置机器人控制柜通讯配置可同时运行程序数量配置ROS_RELAY变量配置ROS_STATE变量设置启用标志 三、测试机器人状态反馈机器人命令接收整体运行测试 总…

新晋游资:华东大导弹音频读后感

昨天晚上听了新晋游资 华东大导弹的一个音频,感受还是颇多的,首先他是一个很谦虚,很善良的人,同样的评价我会给92科比老师。其实,他说的都是很实在的话,没有半点虚言,很想帮助大家利用超短线走出…

C++初阶语法——static类成员

前言:本文将介绍类和对象中的static类成员——静态成员函数,静态成员变量的使用方法和注意点。在某些场景下,静态成员很有意义。 目录 一.概念二.特性静态成员不存在对象中 三.静态成员变量在类外初始化四.静态成员函数 一.概念 声明为stati…

RDMA qp数量和RDMA性能

QP数量上升性能下降 ​​​​​​https://icnp21.cs.ucr.edu/papers/icnp21camera-paper30.pdf 在现代云数据中心中,大规模分布式应用通常构建在许多机器上,需要使用大量并发连接进行频繁的网络通信[4]–[6]。但是,RDMA的性能会随着连接数的…

SpringBoot第42讲:SpringBoot集成Redis - 基于RedisTemplate+Lettuce数据操作

SpringBoot第42讲:SpringBoot集成Redis - 基于RedisTemplateLettuce数据操作 在SpringBoot 2.x版本中Redis默认客户端是Lettuce,本文是SpringBoot第42讲,主要介绍SpringBoot 和默认的 Lettuce 的整合案例。 文章目录 SpringBoot第42讲&#x…

通过案例学习pandas计算相关系数

pandas计算相关系数 在数据分析和统计学中,相关系数是一种用于衡量两个变量之间关系强度的统计指标。它可以帮助我们了解两个变量之间的线性关系强度和方向。 Pandas是一个强大的Python库,提供了许多用于数据分析和处理的功能。在本文中,我…

「新整理」战略定位理论发展史

1954年,彼得德鲁克——现代管理学之父 代表作《管理的实践》 提出具有划时代意义的概念——目标管理,将管理划分为战略管理、组织管理和自我管理。将生产力从生产部门扩大到组织的所有职能部门,以知识精英为代表的职业经理人开始代替资本家走…

基于ssm的CRM客户管理系统(spring + springMVC + mybatis)营销业务信息java jsp源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于ssm的CRM客户管理系统(spring spring…