当前位置: 首页 > news >正文

Linux ELF文件格式

ELF(Executable and Linkable Format)是Unix/Linux系统下的标准可执行文件、目标文件和共享库格式。

ELF文件基本结构

ELF文件由以下四部分组成:

1. ELF头部(ELF Header)

位于文件开头,描述整个文件的组织结构。使用readelf -h查看。

关键字段:

  • e_ident:魔数(7F 45 4C 46)、文件类(32/64位)、数据编码(小端/大端)
  • e_type:文件类型(ET_REL/可重定位、ET_EXEC/可执行、ET_DYN/共享对象)
  • e_machine:目标架构(x86/ARM等)
  • e_entry:程序入口点地址
  • e_phoff:程序头表偏移
  • e_shoff:节头表偏移

2. 程序头表(Program Header Table)

描述段(Segment)信息,用于程序加载。使用readelf -l查看。

常见段类型:

  • PT_LOAD:可加载段(代码段和数据段)
  • PT_DYNAMIC:动态链接信息
  • PT_INTERP:程序解释器(如/lib/ld-linux.so)
  • PT_GNU_STACK:栈权限标志

3. 节头表(Section Header Table)

描述节(Section)信息,用于链接和调试。使用readelf -S查看。

重要节:

  • .text:代码段
  • .data:已初始化数据
  • .bss:未初始化数据
  • .rodata:只读数据
  • .plt/.got:动态链接相关
  • .symtab/.dynsym:符号表
  • .strtab/.dynstr:字符串表
  • .shstrtab:节名称字符串表

4. 节数据(Section Data)

实际包含各节的具体内容。

ELF文件类型

  1. 可重定位文件(Relocatable File)
    • 扩展名通常为.o
    • 包含代码和数据,可链接生成可执行文件或共享库
    • e_type = ET_REL
  2. 可执行文件(Executable File)
    • 可直接运行的程序
    • e_type = ET_EXEC
    • 静态链接或动态链接
  3. 共享对象文件(Shared Object File)
    • 扩展名通常为.so
    • 动态链接库
    • e_type = ET_DYN
    • 可包含PIE(位置无关代码)

动态链接相关

关键组成部分:

  • .dynamic节:包含动态链接所需信息
  • .got(Global Offset Table):全局偏移表
  • .plt(Procedure Linkage Table):过程链接表
  • .dynsym:动态符号表
  • .dynstr:动态字符串表

动态链接器使用这些信息在运行时解析外部符号引用。

分析工具

  1. readelf
    readelf -h <file>    # 查看ELF头
    readelf -l <file>    # 查看程序头
    readelf -S <file>    # 查看节头
    readelf -s <file>    # 查看符号表
    readelf -d <file>    # 查看动态段
    
  2. objdump
    objdump -d <file>    # 反汇编代码段
    objdump -x <file>    # 显示所有头信息
    objdump -r <file>    # 显示重定位条目
    
  3. nm
    nm <file>            # 显示符号表
    nm -D <file>         # 显示动态符号表
    

ELF与安全

  1. 安全机制

    • PIE(位置无关可执行)
    • RELRO(重定位只读)
    • Canary(栈保护)
    • NX(DEP,数据执行保护)
  2. 检查安全特性

    checksec --file=<file>
    

    输出包括:

    • RELRO(Full/Partial/No)
    • Stack Canary(Yes/No)
    • NX enabled(Yes/No)
    • PIE enabled(Yes/No)

实际应用

  1. 静态分析
    • 使用IDA Pro/Ghidra分析代码逻辑
    • 研究函数调用关系和数据流
  2. 动态调试
    • 使用GDB附加到运行中的ELF进程
    • 设置断点,观察内存和寄存器状态
  3. 漏洞利用
    • 分析内存布局
    • 构造ROP链绕过NX
    • 泄露canary或地址绕过ASLR

理解ELF文件格式是Linux二进制分析的基础,对逆向工程、漏洞分析和恶意软件研究都至关重要。

相关文章:

  • 【笔记ing】AI大模型-03深度学习基础理论
  • 深入剖析C++中 String 类的模拟实现
  • Java实现快速排序算法
  • Java 数据库访问工具 dbVisitor 的技术解析与同类工具比较
  • Kimi-VL 解读:高效 MoE 视觉语言模型VLM,兼顾长上下文与高分辨率
  • MySQL——学习InnoDB(1)
  • LabVIEW配电器自动测试系统
  • Xmind 2025 中文思维导图
  • MySQL表的使用(4)
  • 【3GPP核心网】【5G】精讲5G系统的策略和计费控制框架
  • 【口腔粘膜鳞状细胞癌】文献阅读
  • 《AI大模型应知应会100篇》第17篇:大模型的偏见与公平性问题
  • 多卡集群 - Docker命令来启动一个容器的实例
  • 【笔记ing】AI大模型-04逻辑回归模型
  • 【vue】class和styles绑定
  • 在AWS EC2上部署网站的完整步骤指南
  • idea版的cursor:Windsurf Wave 7
  • 嵌入式硬件常用总线接口知识体系总结和对比
  • 曲线与曲面的绘制
  • golang 在windows 系统的交叉编译
  • 第一集|《蛮好的人生》蛮好,《悬镜》挺玄
  • 竹笋食用不当,小心“鲜”变“险”
  • 从板凳席到指挥台,横扫广东男篮的少帅潘江究竟有何神奇
  • 孙颖莎4比1击败陈幸同,与蒯曼会师澳门世界杯女单决赛
  • 从黄仁勋到美国消费者,都在“突围”
  • 旧电梯换新如何分摊费用?低楼层可以不出钱吗?上海闵行举办讨论会