elf文件解析(一)——IDA PRO视角的符号

elf文件解析(一)——IDA PRO视角的符号

由于网上并没有相关资料说IDA是怎么解析符号的,那我们就手动分析一下

首先我们看一下原版的libdexhelper.so

image-20240227104937925

可以看出来文件是加过密的,只解析出来了一部分segment,但是这并不影响extern中符号名的解析

dump解密

再来看下内存中dump出来的效果,segment多了起来,而且extern的每个项都有了引用,分别是被pltgot引用

image-20240227105227498

系统库libc.so(64位)

可以看到系统库中的libc.so各种segment就都有了,符号也是正常显示出来,got表和plt表也能引用到extern中的各项。

image-20240227105944736

结论:有没有pltgot都可以解析出来符号

我们继续往下看

众所周知,符号解析需要用到符号表,测试也确实删除符号表项直接解析不出来符号,但是extern所显示的符号是怎么和dynsym对应起来的呢,答案是按顺序,如果dynsym中的表项顺序替换,extern的解析也会被互换,进而影响到plt和got的解析。

image-20240227111948951

idapython解析符号表

image-20240228133300997

可以看到每个表项的大小为

DCD(4字节)+DCB(1字节)+DCB(1字节)+DCW(2字节)+DCQ(8字节)+DCQ(8字节)=24字节

image-20240228175257769

我们使用idapython将.rela.plt都给patch 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from ida_bytes import patch_bytes
from idc import here

# 获取当前地址
current_address = here()

# 创建一个长度为24的字节串,每个字节都是0
new_bytes = b'\x00' * 24

# 重复16次操作
for i in range(16):
# 在当前地址处打补丁
patch_bytes(current_address, new_bytes)

# 更新地址,为下一次打补丁做准备
current_address += len(new_bytes) # 增加24,因为每次都替换了24个字节

发现imports表全部消失

image-20240306132952888
image-20240306133318154

结论:重定位表和符号表共同决定着imports表


elf文件解析(一)——IDA PRO视角的符号
http://showfaker.top/2024/03/06/ida-pro-elf-sym/
作者
ShowFaker
发布于
2024年3月6日
许可协议