Linux二进制分析入门
Linux二进制分析入门
碎碎念
常用工具:
1 | objdump -D <elf_object> #ELF文件所有节的数据或代码 |
ELF文件格式
文件头:
1 | typedef struct { |
对于e_type字段有:
类型 | 描述 |
---|---|
ET_NONE | 未知 |
ET_REL | 重定位文件.o |
ET_EXEC | 可执行文件 |
ET_DYN | 共享目标文件dynamic |
ET_CORN | 核心文件 |
e_phoff字段指向程序头结构:
1 | typedef struct { |
例如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 | typedef struct { |
常见节如下:
节 | 节类型 | 所属段 | 描述 |
---|---|---|---|
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 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 The Blog of Monoceros406!