elf文件解析(二)——dynamic段/节和各个节的关系

dynamic节——以libc64为例

一个例子

先查看段表,以及段表项和节表项的映射关系,可以发现DYNAMIC段和.dynamic节是一对一映射的,而根据DYNAMIC段可以知道.dynamic的基地址和偏移

image-20240314110220680

然后再来看.dynamic表的表项,首先看最后一项是NULL,这个是DT_NULL类型的,用来标志.section的结尾

image-20240314104501619

.dynamic节的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct {
Elf32_Sword d_tag;
union {
Elf32_Word d_val;
Elf32_Addr d_ptr;
Elf32_Off d_off;
} d_un;
} Elf32_Dyn;

typedef struct {
Elf64_Xword d_tag;
union {
Elf64_Xword d_val;
Elf64_Addr d_ptr;
} d_un;
} Elf64_Dyn;

其中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_RELDT_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的结尾

根据上表得到的信息可以得到的节信息有如下图所示:

image-20240314185856916
image-20240314192332543

最后两个都是字符串表,但是IDA PRO没有解析出来,难绷。但是010 editor可以

image-20240314192245688
image-20240314192613841

而且SYMTABIDA PRO也不能解析出来(甚至是没有这块儿地址空间),但是010editor可以

image-20240314200146991
image-20240314200333321

参考链接: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段-节和各个节的关系/
作者
ShowFaker
发布于
2024年3月14日
许可协议