ELF 资料记录
英文详细链接: https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/
ELF 文件头
// 32 位程序
#define EI_NIDENT 16
typedef struct {
+0 unsigned char e_ident[EI_NIDENT];
+16 Elf32_Half e_type; // 文件所属类型 1重定位 2可执行 3动态链接库
+18 Elf32_Half e_machine; // 处理器体系结构 IA 是 03
+22 Elf32_Word e_version; // 版本号 正常是 01
+24 Elf32_Addr e_entry; // OEP
+28 Elf32_Off e_phoff; // 程序头表开头处在文件中的偏移量
+32 Elf32_Off e_shoff; // 节头表开头处在文件中的偏移量
+36 Elf32_Word e_flags; // 处理器标志 IA处理器是0
+40 Elf32_Half e_ehsize; // ELF 文件头的大小 0x34
+42 Elf32_Half e_phentsize; // 在程序头表中每一个表项的大小 0x20
+44 Elf32_Half e_phnum; // 程序头表项数目
+46 Elf32_Half e_shentsize; // 节头表中每一个表项的大小
+48 Elf32_Half e_shnum; // 节头表中总共有多少个表项
+50 Elf32_Half e_shstrndx; // 节头表中与节名字表相对应的表项的索引
} Elf32_Ehdr;
节头
typedef struct {
Elf32_Word sh_name; /* section name */
Elf32_Word sh_type; /* SHT_... */ 0x6 是动态链接信息
Elf32_Word sh_flags; /* SHF_... */ 节属性,写、执行、占用内存属性
Elf32_Addr sh_addr; /* virtual address */
Elf32_Off sh_offset; /* file offset */该值是节的第一个字节在文件中的位置
Elf32_Word sh_size; /* section size */
Elf32_Word sh_link; /* misc info */
Elf32_Word sh_info; /* misc info */
Elf32_Word sh_addralign; /* memory alignment */对其粒度
Elf32_Word sh_entsize; /* entry size if table */
} Elf32_Shdr;
# 读取一个elf文件
readelf -h megabeets_0x2
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
……
符号表
typedef struct {
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info; /* bind, type: ELF_32_ST_... */
unsigned char st_other;
Elf32_Half st_shndx; /* SHN_... */
} Elf32_Sym;
重定位
# 重定位结构
typedef struct {
Elf32_Addr r_offset;
Elf32_Word r_info;
} Elf32_Rel;
typedef struct {
Elf32_Addr r_offset;
Elf32_Word r_info;
Elf32_Sword r_addend;
} Elf32_Rela;
程序头
typedef struct {
Elf32_Word p_type; /* entry type */
Elf32_Off p_offset; /* file offset */
Elf32_Addr p_vaddr; /* virtual address */
Elf32_Addr p_paddr; /* physical address */
Elf32_Word p_filesz; /* file size */
Elf32_Word p_memsz; /* memory size */
Elf32_Word p_flags; /* entry flags */
Elf32_Word p_align; /* memory/file alignment */
} Elf32_Phdr;
节头字符串表
名称:.shstrtab
保存节名称的字符串
字符串表
名称:.strtab
保存的是全局变量和函数名的字符串
而常量字符串是保存在 .rodata 节里面的