elf中字符串主要集中section header中的.rodata、.dynstr、.shstrtab和.comment中。
.rodata 程序中使用的字符串,最终都会在这里如:
string x="hello c++";
print('打印这段内容')。
以上的字符串都会包含在.rodata中。因为字符串是只读的。
.dynstr 存放的是此elf文件的名称,依赖库的名称及是要调用的外部依赖库函数符号名称或者变量符号名称,全部都放在这里面。每个符号占16个字节,.dynsym中总字节数3952/16=247,刚好是符号表的大小。所以这个so文件中的符号表全部都是.dynsym中的内容。sym_name占4个字节,表示在 .dynstr中的偏移量。如01对应的 .dynstr 第一个偏移内容。即__cxa_finalize。
.shstrtab 段是各个section headers和s_name,如.text,.data,.plt,.dynstr, .dynsym。同样在其各个section header段中的s_name是偏移位置。占4个字节。
.comment 是elf的说明,在这里可以看到此程序使用了ollvm混淆。使用的ollvm版本是4.0.1
.dynamic包含了所需的共享库名等信息。
以下是so文件中开始地址和结束地址:
.got表:68C3Ch---69000
.data表:69000-6BB3C
.rel.dyn:2244---2C4C
.rel.plt表:2C4Ch-2E4C(size=512)
.plt表: 2E4C-3160
.fini_array:688D0--688d8
.init_array表:688d8 --68918
.dynsym:158h---10C8
.shstrtab:6BC00h---6BD03
.dynstr:10C8h---191F
.hash:1920h--2018h(size:1784)
.gnu.version:2018h--2206h(size=494)
.gnu.version_d:2208h--2224(size=28)
.gnu.version_r:2224h--2244(size=32)