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文件类型
- 可重定位文件(Relocatable File):
- 扩展名通常为
.o
- 包含代码和数据,可链接生成可执行文件或共享库
e_type = ET_REL
- 扩展名通常为
- 可执行文件(Executable File):
- 可直接运行的程序
e_type = ET_EXEC
- 静态链接或动态链接
- 共享对象文件(Shared Object File):
- 扩展名通常为
.so
- 动态链接库
e_type = ET_DYN
- 可包含PIE(位置无关代码)
- 扩展名通常为
动态链接相关
关键组成部分:
.dynamic
节:包含动态链接所需信息.got
(Global Offset Table):全局偏移表.plt
(Procedure Linkage Table):过程链接表.dynsym
:动态符号表.dynstr
:动态字符串表
动态链接器使用这些信息在运行时解析外部符号引用。
分析工具
- readelf:
readelf -h <file> # 查看ELF头 readelf -l <file> # 查看程序头 readelf -S <file> # 查看节头 readelf -s <file> # 查看符号表 readelf -d <file> # 查看动态段
- objdump:
objdump -d <file> # 反汇编代码段 objdump -x <file> # 显示所有头信息 objdump -r <file> # 显示重定位条目
- nm:
nm <file> # 显示符号表 nm -D <file> # 显示动态符号表
ELF与安全
-
安全机制:
- PIE(位置无关可执行)
- RELRO(重定位只读)
- Canary(栈保护)
- NX(DEP,数据执行保护)
-
检查安全特性:
checksec --file=<file>
输出包括:
- RELRO(Full/Partial/No)
- Stack Canary(Yes/No)
- NX enabled(Yes/No)
- PIE enabled(Yes/No)
实际应用
- 静态分析:
- 使用IDA Pro/Ghidra分析代码逻辑
- 研究函数调用关系和数据流
- 动态调试:
- 使用GDB附加到运行中的ELF进程
- 设置断点,观察内存和寄存器状态
- 漏洞利用:
- 分析内存布局
- 构造ROP链绕过NX
- 泄露canary或地址绕过ASLR
理解ELF文件格式是Linux二进制分析的基础,对逆向工程、漏洞分析和恶意软件研究都至关重要。