ELF格式分析实践
2018-10-27 本文已影响0人
HAPPYers
ELF魔数
用readelf -h 1.o
查看ELF文件头。
例如
7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
- linux的ELF格式文件的前四个字节分别是依次是0x7f(DEL控制符)、'E'、'L'、'F'的ASCII码
- a.out格式最开始的两个字节为0x01,0x07
- PE/COFF文件最开始的两个字节为0x4d,0x5a,即MZ的ASCII码
- 接下来一个字节标识ELF文件类:0x00表示无效文件,0x01表示32位,0x02表示64位。
- 第六个字节是字节序,
00
代表无效格式,01
代表小端格式,02
代表大端格式。 - 第七个字节规定ELF文件的主版本号,一般为1.(因为ELF标准自1.2版以后就没有更新了)
- 后面的九个字节在ELF标准中没有定义,一般填0,有些平台会使用这9个字节作为拓展标志。
段表
- 使用
readelf -S 1.o
命令查看完整段表 - 段表的结构:一个以
Elf32_Shdr
结构体为元素的数组(可以查找/usr/include/elf.h中的Elf32_Shdr结构体定义)Elf32_Shdr
又被称为段描述符
常用信息 - 段的类型(sh_type)(SHT开头)
常量 | 值 | 含义 |
---|---|---|
SHT_NULL | 0 | 无效段 |
SHT_PROGBITS | 1 | 程序段、代码段、数据段都是这种类型 |
SHT_SYMTAB | 2 | 表示该段内容为符号表 |
SHT_STRAB | 3 | 该段内容为字符串表 |
SHT_RELA | 4 | 重定向表 |
SHT_HASH | 5 | 符号表的哈希表 |
SHT_DYNAMIC | 6 | 动态链接信息 |
SHT_NOTE | 7 | 提示性信息 |
SHT_NOBITS | 8 | 表示该段在文件中内有内容,如.BSS段 |
SHT_REL | 9 | 包含了重定向信息 |
SHT_SHLIB | 10 | 保留 |
SHT_DNYSYM | 11 | 动态链接的符号表 |
- 段的标志位(sh_flag)(SHF_开头)
常量 | 值 | 含义 |
---|---|---|
SHF_WRITE | 1 | 该段在进程空间中可写 |
SHF_ALLOC | 2 | 该段在进程空间中需要分配空间。例如代码段、数据段、.bss段都会有这个标志位 |
SHF_EXECINSTR | 4 | 表示该段在进程空间中可以被执行、一般指代码段 |
-段的链接信息(sh_link sh_info)
sh_type | sh_link | sh_info |
---|---|---|
SHT_DYNAMIC | 该段所使用的字符串表在段表中的下标 | 0 |
SHT_HASH | 该段所使用的符号表在段表中的下表 | 0 |
SHT_REL SHT_RELA |
该段使用的相应符号表在段表中的下标 | 该重定向表所作用的段在段表中的下表 |
SHT_SYMTAB SHT_DYNSYM |
操作系统相关 | 操作系统相关 |
符号
使用nm 1.o
查看ELF文件的符号
使用readelf -s 1.o
查看ELF文件详细的符号表
符号表结构
一个Elf32_Sym结构的数组
- 符号绑定信息
宏定义名 | 值 | 说明 |
---|---|---|
STB_LOCAL | 0 | 局部符号,对外部目标文件不可见 |
STB_GLOABL | 1 | 全局符号,外部可见 |
STB_WEAK | 2 | 弱引用 |
- 符号类型
宏定义名 | 值 | 说明 |
---|---|---|
STT_NOTYPE | 0 | 未知类型符号 |
STT_OBJECT | 1 | 该符号是个数据对象,比如变量、数组等 |
STT_FUNC | 2 | 该符号是个函数或其他可执行代码 |
STT_SECTION | 3 | 表示一个段,这种符号必须是STB_LOCAL的 |
STT_FILE | 4 | 表示文件名,一般是该目标文件所对应的源文件名,它一定是STB_LOCAL类型的,并且它的st_shndx一定是SHN_ABS |
符号所在段(st_shndx) 如果符号定义在本目标文件内,那么这个成员表示符号所在段在段表中的下标。但如果符号不是定义在本目标文件内的,或者对于有些特殊符号,st_shndx的值有特殊:
宏定义名 | 值 | 说明 |
---|---|---|
SHN_ABS | 0xfff1 | 表示该符号包含一个绝对的值。例如文件名的符号 |
SHN_COMMON | 0xfff2 | 表示该符号是一个“COMMON块”类型的符号。一般来说,未初始化的全局符号定义就是这种类型的 |
SHN_UNDEF | 0 | 表示该符号未定义。该符号在本目标文件中被引用到,但是定义在其他目标文件中 |
符号值:
- 在目标文件中,如果是符号的定义且该符号不是“COMMON”块类型的(即st_shndx不为SHN_COMMON),则st_value表示该符号在段中的偏移。即符号对应的函数或变量位于由st_shndx指定的段偏移st_value的位置处。这是目标文件中定义全局变量的符号最常见情况。例如fun1,main,global_init_var
- 在目标文件中,如果符号是“COMMON块“,则st_value表示符号的对齐属性。例如1.o中的global_uninit_var
-在可执行文件中,st_value表示符号的虚拟地址。
注:使用readelf -s 1.o
查看ELF文件详细的符号表
**使用objdump -t 1.o
查看段名符号