elf文件解析(二)——dynamic段/节和各个节的关系
dynamic节——以libc64为例
一个例子
先查看段表,以及段表项和节表项的映射关系,可以发现DYNAMIC段和.dynamic节是一对一映射的,而根据DYNAMIC段可以知道.dynamic的基地址和偏移
然后再来看.dynamic表的表项,首先看最后一项是NULL,这个是DT_NULL类型的,用来标志.section的结尾
.dynamic节的定义
1 | |
其中d_tag字段决定了此项的类型,已经d_un的含义
上图各个项的类型和含义如下表所示:
| 序号 | 类型 | 描述 |
|---|---|---|
| 1 | DT_NEEDED | 依赖项名称的索引,表示依赖ld-android.so |
| 2 | DT_NEEDED | 依赖项名称的索引,表示依赖libdl.so |
| 3 | SONAME | 动态库的名字 |
| 4 | BIND_NOW | 执行非惰性处理 |
| 5 | NOW | 执行完整的重定位处理 |
| 6 | RELA | 重定位表(.rela.dyn)的地址 |
| 7 | RELASZ | 重定位表的总大小 |
| 8 | RELANET | 相对重定位表项的大小 |
| 9 | RELACOUNT | 相对重定位表项的数目 |
| 10 | JMPREL | 与PLT相关的重定位表项(.rela.plt)的入口地址 |
| 11 | PLTRELSZ | 与PLT相关的重定位表项的大小 |
| 12 | PLTGOT | got.plt(全局偏移量表)的起始地址 |
| 13 | PLTREL | 过程链接表引用的重定位条目的类型,DT_REL或DT_RELA |
| 14 | SYMTAB | 符号表(.dynsym)的地址 |
| 15 | SYMNET | DT_SYMTAB符号条目的大小(以字节为单位) |
| 16 | STRTAB | 字符串表(.dynstr)的地址。包含符号名称、依赖项名称和其他字符串 |
| 17 | STRSZ | DT_STRTAB字符串表的总大小(以字节为单位) |
| 18 | GNU_HASH | 符号哈希表(.gnu.hash)的地址 |
| 19 | INIT_ARRAY | 初始化函数指针数组(.init_array)的地址 |
| 20 | INIT_ARRAYSZ | DT_INIT_ARRAY数组的总大小(以字节为单位) |
| 21 | FINI_ARRAY | 终止函数指针数组(.fini_array)的地址 |
| 22 | FINI_ARRAYSZ | DT_FINI_ARRAY数组的总大小(以字节为单位) |
| 23 | VERSYM | .gnu.version节的起始地址 |
| 24 | VERDEF | 版本定义表(.gnu.version_d)的起始地址 |
| 25 | VERDEFNUM | DT_VERDEF表中的条目数 |
| 26 | VERNEED | 版本依赖表(.gnu.version_r)的地址 |
| 27 | VERNEEDNUM | DT_VERNEEDNUM表中的条目数 |
| 28 | NULL | 标志.section的结尾 |
根据上表得到的信息可以得到的节信息有如下图所示:
最后两个都是字符串表,但是IDA PRO没有解析出来,难绷。但是010 editor可以
而且SYMTABIDA
PRO也不能解析出来(甚至是没有这块儿地址空间),但是010editor可以
参考链接:https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-42444.html#chapter7-tbl-5
elf文件解析(二)——dynamic段/节和各个节的关系
http://showfaker.top/2024/03/14/dynamic段-节和各个节的关系/