Linux二进制分析入门
碎碎念
常用工具:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| objdump -D <elf_object> objdump -d <elf_object> objdump -tT <elf_object> objcopy -only-section=.data <infile> <outfile> strace /bin/ls -o ./ls.out strace -p <pid> -o daemon.out strace -e read=3 /bin/ls ltrace <program> -o program.out readelf -S <object> readelf -l <object> readelf -s <object> readelf -e <object> readelf -r <object> readelf -d <object> cat /proc/<pid>/maps
|
ELF文件格式
文件头:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| typedef struct { unsigned char e_ident[EI_NIDENT]; Elf64_Half e_type; Elf64_Half e_machine; Elf64_Word e_version; Elf64_Addr e_entry; Elf64_Off e_phoff; Elf64_Off e_shoff; Elf64_Word e_flags; Elf64_Half e_ehsize; Elf64_Half e_phentsize; Elf64_Half e_phnum; Elf64_Half e_shentsize; Elf64_Half e_shnum; Elf64_Half e_shstrndx; } Elf64_Ehdr;
|
对于e_type字段有:
| 类型 |
描述 |
| ET_NONE |
未知 |
| ET_REL |
重定位文件.o |
| ET_EXEC |
可执行文件 |
| ET_DYN |
共享目标文件dynamic |
| ET_CORN |
核心文件 |
e_phoff字段指向程序头结构:
1 2 3 4 5 6 7 8 9 10
| typedef struct { Elf64_Word p_type; Elf64_Word p_flags; Elf64_Off p_offset; Elf64_Addr p_vaddr; Elf64_Addr p_paddr; Elf64_Xword p_filesz; Elf64_Xword p_memsz; Elf64_Xword p_align; } Elf64_Phdr;
|
例如text和data段为PT_LOAD类型的段,表示可装载,映射时根据p_align在内存中对对齐。p_flags字段为权限,例如text段为PF_X|PF_R,data段为PF_W|PF_R。
PT_DYNAMIC类型的段为动态段,动态链接可执行文件特有,内容有运行时需链接的共享库、GOT表地址、重定位条目信息等。
PT_NOTE类型的段保存与特定供应商或系统相关的附加信息。PT_INTERP类型的段描述程序解释器位置,如/lib64/ld-linux-x86-64.so.2。PT_PHDR类型的段保存程序头本身位置和大小。
ELF节头如下:
1 2 3 4 5 6 7 8 9 10 11 12
| typedef struct { Elf64_Word sh_name; Elf64_Word sh_type; Elf64_Xword sh_flags; Elf64_Addr sh_addr; Elf64_Off sh_offset; Elf64_Xword sh_size; Elf64_Word sh_link; Elf64_Word sh_info; Elf64_Xword sh_addralign; Elf64_Xword sh_entsize; } Elf64_Shdr;
|
常见节如下:
| 节 |
节类型 |
所属段 |
描述 |
| text |
SHT_PROGBITS |
text |
|
| rodata |
SHT_PROGBITS |
text |
|
| plt |
SHT_PROGBITS |
text |
|
| data |
SHT_PROGBITS |
data |
|
| bss |
SHT_NOBITS |
data |
|
| got.plt |
SHT_PROGBITS |
|
|
| dynsym |
SHT_DYNSYM |
text |
从共享库导入的动态符号信息 |
| dynstr |
|
|
动态符号字符串表 |
| rel.* |
SHT_REL |
|
重定位信息 |
| hash或gnu.hash |
|
|
查找符号的散列表 |
| symtab |
SHT_SYMTAB |
|
符号信息 |
| strtab |
SHT_STRTAB |
|
符号字符串表 |
| shstrtab |
SHT_STRTAB |
|
节头字符串表 |
| ctors与dtors |
|
|
|