%title缩略图

ELF的.dynsym节

.dynsym节保存的是一个动态符号表,其中每个条目的大小是固定的24个字节,先看看.dynsym节的属性,即描述条目信息

%title插图%num

上图只是.dynsym节在节头表里的描述信息,那.dynsym节在哪儿呢?描述信息已经给出来了,在文件中的偏移量是0x330,十进制是816,大小是0xa8,十进制是168

%title插图%num

这就是.dynsym节,数据内容代表什么呢?下面慢慢拆开。

.dynsym节大小是0xa8,十进制是168,用大小除以每个条目的大小即可得出.dynsym节一共有多少个条目,168/24=7,.dynsym节一共有7个条目

每个条目大小是固定的24个字节,这24个字节是由相应的字段构成的,每个字段占固定的某几个字节,加起来就是24个字节,下面来看看是由哪些字段构成的,我们只要找到符号表的构成即可,因为动态符号表是符号表的子集,每个条目的构成是相同的

%title插图%num

我是64位系统,所以看64位的符号表结构体

st_name。长度是4个字节,该字段表示符号名称在动态符号字符串表中的偏移量或者说索引

st_info。长度是1个字节,该字段表示符号的类型和绑定属性。

st_other。长度是1个字节,表示符号的可见性。

st_shndx。长度是2个字节,每个符号条目的定义都与某些节对应,该字段保存的是相关节头表的索引,为0表示未定义。

st_value。长度是8个字节,表示符号的值,可能是地址或者位置偏移量

st_size。长度是8个字节,表示的是符号的大小,如全局函数指针的大小。大多数符号都有大小,如果没有则此字段的内容是0。

好了,结构已经知道了,现在我们来把7个条目都挨个看看

第1个动态符号条目

已知动态符号表的偏移量是816,大小是168,我们取第1个条目看看

%title插图%num

st_name是0,说明该符号名称在动态符号字符串表中的偏移量是0。

st_info是0,符号的类型是0,表示该符号类型未定义,绑定属性是0,0对应的是STB_LOCAL,表示本地符号,该符号在目标文件之外不可见,目标文件包含了符号的定义,如一个声明为static的函数。

st_other是0,如下图,表示默认的规则,默认规则是全局和弱符号可用于其他模块,本地模块中的引用可由其他模块中的定义插入。

%title插图%num

st_shndx是0,表示未定义。

st_value是0,符号值为空。

st_size是0,符号大小为空。

第2个动态符号条目

816+24=840,用xxd指令从840处取24个字节就是第2个动态符号条目

%title插图%num

st_name是0x3d,十进制是61,说明符号名称在动态符号字符串表中的偏移量是61。如下图从动态符号字符串表中根据索引查询到该符号名称是_TIM_deregisterTMCloneTable

%title插图%num

st_info是0x20,十进制是32,符号绑定属性是2(根据ELF_ST_BIND(st_info)计算得出),2对于的STB_WEAK,表示的是弱符号,这类符号类似于全局符号,但是优先级低于全局符号。符号,符号类型是0(根据ELF_ST_TYPE(st_info)计算得出),0表示符号类型未定义。

st_other是0,表示默认的规则,默认规则是全局和弱符号可用于其他模块,本地模块中的引用可由其他模块中的定义插入。

st_shndx是0,表示未定义。

st_value是0,符号值为空。

st_size是0,符号大小为空。

第3个动态符号条目

840+24=864,用xxd指令从864处取24个字节就是第3个动态符号条目

%title插图%num

st_name是0xb,十进制是11,说明符号名称在动态符号字符串表中的偏移量是11。如下图从动态符号字符串表中根据索引查询到该符号名称是puts

%title插图%num

st_info是0x12,十进制是18,符号绑定属性是2(根据ELF_ST_BIND(st_info)计算得出),1表示的是全局符号,全局符号对于所有要合并的目标文件来说都是可见的,一个全局符号在一个文件中进行定义后在另外一个文件可以对这个符号进行引用。符号类型是2(根据ELF_ST_TYPE(st_info)计算得出),2表示符号类型是一个函数(即函数名称)。

st_other是0,表示默认的规则,默认规则是全局和弱符号可用于其他模块,本地模块中的引用可由其他模块中的定义插入。

st_shndx是0,表示未定义。

st_value是0,符号值为空。

st_size是0,符号大小为空。

第4个动态符号条目

864+24=888,用xxd指令从888处取24个字节就是第4个动态符号条目

%title插图%num

st_name是0x1f,十进制是31,说明符号名称在动态符号字符串表中的偏移量是31。如下图从动态符号字符串表中根据索引查询到该符号名称是__libc_start_main

%title插图%num

st_info是0x12,十进制是18,符号绑定属性是2(根据ELF_ST_BIND(st_info)计算得出),1表示的是全局符号,全局符号对于所有要合并的目标文件来说都是可见的,一个全局符号在一个文件中进行定义后在另外一个文件可以对这个符号进行引用。符号类型是2(根据ELF_ST_TYPE(st_info)计算得出),2表示符号类型是一个函数(即函数名称)。

st_other是0,表示默认的规则,默认规则是全局和弱符号可用于其他模块,本地模块中的引用可由其他模块中的定义插入。

st_shndx是0,表示未定义。

st_value是0,符号值为空。

st_size是0,符号大小为空。

第5个动态符号条目

888+24=912,用xxd指令从912处取24个字节就是第5个动态符号条目

%title插图%num

st_name是0x59,十进制是89,说明符号名称在动态符号字符串表中的偏移量是89。如下图从动态符号字符串表中根据索引查询到该符号名称是__gmon_start__

%title插图%num

st_info是0x20,十进制是32,符号绑定属性是2(根据ELF_ST_BIND(st_info)计算得出),2表示的是弱符号,这类符号类似于全局符号,但是优先级低于全局符号。符号,符号类型是0(根据ELF_ST_TYPE(st_info)计算得出),0表示符号类型未定义。

st_other是0,表示默认的规则,默认规则是全局和弱符号可用于其他模块,本地模块中的引用可由其他模块中的定义插入。

st_shndx是0,表示未定义。

st_value是0,符号值为空。

st_size是0,符号大小为空。

第6个动态符号条目

912+24=936,用xxd指令从936处取24个字节就是第6个动态符号条目

%title插图%num

st_name是0x68,十进制是104,说明符号名称在动态符号字符串表中的偏移量是104。如下图从动态符号字符串表中根据索引查询到该符号名称是_ITM_registerTMCloneTable

%title插图%num

st_info是0x20,十进制是32,符号绑定属性是2(根据ELF_ST_BIND(st_info)计算得出),2表示的是弱符号,这类符号类似于全局符号,但是优先级低于全局符号。符号,符号类型是0(根据ELF_ST_TYPE(st_info)计算得出),0表示符号类型未定义。

st_other是0,表示默认的规则,默认规则是全局和弱符号可用于其他模块,本地模块中的引用可由其他模块中的定义插入。

st_shndx是0,表示未定义。

st_value是0,符号值为空。

st_size是0,符号大小为空。

第7个动态符号条目

936+24=960,用xxd指令从960处取24个字节就是第7个动态符号条目

%title插图%num

st_name是0x10,十进制是16,说明符号名称在动态符号字符串表中的偏移量是16。如下图从动态符号字符串表中根据索引查询到该符号名称是__cxa_finalize

%title插图%num

st_info是0x20,十进制是34,符号绑定属性是2(根据ELF_ST_BIND(st_info)计算得出),2表示的是弱符号,这类符号类似于全局符号,但是优先级低于全局符号。符号类型是2(根据ELF_ST_TYPE(st_info)计算得出),2表示符号类型是一个函数(即函数名称)。

st_other是0,表示默认的规则,默认规则是全局和弱符号可用于其他模块,本地模块中的引用可由其他模块中的定义插入。

st_shndx是0,表示未定义。

st_value是0,符号值为空。

st_size是0,符号大小为空。

发表回复