样本为 某60 的 libjiagu_a64.so。
先用ida打开发现 导入表 和 导出表 都是空的,如下图:
ida识别出来的方法名也都是这样的:
用010editer打开看一下文件结构。
一看节就不对劲,并且没有符号表。
那既然这里都有问题,elf header肯的也是伪造的了。
先看一下这个so的elf header的内容。
第一行没什么有用的信息,第二行看到程序入口点是0x2A70。
第三行section table header偏移是11A1F0。
第四行003A知道每个section大小是0x40,一共有6个section,0x003F知道最后一个section是.shstrtab。
先看看假的.shstrtab
很明显这个指向data数据是不对的,并且位于文件尾部属于section table的位置,
先把这16个字节删掉,然后在文件中找到正确的section_name 如下:
可以看到真正的.shstrtab的地址是 0x119B15 。
同时这个正确的.shstrtab结尾 0x119BDD 就是section header table的开头,不过是否是真的先保持怀疑。
先计算一下一共有多少个section:0x11A35F - 0x119BDD = 0x782
在除以efl头中描述的每一个section大小0x40。
0x782 / 0x40 转为十进制相除 1922 / 64 = 30.03125
发现除不尽有余数,那么0x119BDD也不是正确的section table header起始位置。
那么 64 * 30 = 1920 (0x780) 就是真正段的大小。
所以修改一下elf header
section table header 偏移改为 0x119BDD
每个section table的大小改为1E
.shstrtab改为1D
保存刷新。显示如下:
最后一步,根据最开始的信息修改.shstrtab。
将s_offset修改为正确的地址:0x119B15
将s_size 修改为所选正确数据区域大小: 200 也就 0xC8
在上面改和下面改是一样的,下面改方便一点但是要注意进制转换。
保存刷新重新读取:
最最最最后一步,去掉下面多余的,把真正的.shstrtab 下标为23的 和 section table的数量在elf header中修改。
00 00 00 00 40 00 38 00 06 00 40 00 1E 00 1D 00
改为
00 00 00 00 40 00 38 00 06 00 40 00 18 00 17 00
拖到ida里查看一下:
也都可以正常查看了。