ELF格式分析实践

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码
  1. 接下来一个字节标识ELF文件类:0x00表示无效文件,0x01表示32位,0x02表示64位。
  2. 第六个字节是字节序,00代表无效格式,01代表小端格式,02代表大端格式。
  3. 第七个字节规定ELF文件的主版本号,一般为1.(因为ELF标准自1.2版以后就没有更新了)
  4. 后面的九个字节在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查看段名符号

你可能感兴趣的:(ELF格式分析实践)