4.29 IDA分析GOT/PLT时的坑
http://scz.617.cn/unix/201606171028.txt
A: scz
反汇编.got.plt section时,IDA有特殊处理。看Segments(Shift-F7),在最后一行 多了一个extern,实际是不存在的,是IDA歪歪出来的,它只是方便IDA在.got.plt中 填写一些可读性较好的符号,再直白点,IDA"假装"完成了GOT[]的重定向处理。再看 .plt,也被特殊处理,比如PLT[i]的第二条、第三条指令都被抹去了,原因仍然是 IDA"假装"完成了GOT[]的重定向处理。如果切到"Hex View-1"窗口查看.plt,很多地 址显示??,而实际上这些地址在静态文件中有对应数据。
有两种PLT。第二种是位置无关的PLT:
PLT[0]:
pushl 4(%ebx) // GOT[1],struct link_map *
jmp 8(%ebx) // GOT[2],_dl_runtime_resolve()
dd 0 // 4字节填充
PLT[1+0]:
jmp ((3+0)*4)(%ebx) // GOT[3+0],初值为(&PLT[1+0]+6),即下一条指令的地址
push 0*8 // &.rel.plt[0]
jmp &PLT[0]
PLT[1+n]: // n从0计,readelf -Wr obj | grep R_386_JUMP_SLOT
jmp ((3+n)*4)(%ebx) // GOT[3+n],初值为(&PLT[1+n]+6),即下一条指令的地址
push n*8 // &.rel.plt[n]
jmp &PLT[0]
这种PLT[1+n]的字节流一般形如:
00000FC0 FF A3 14 00 00 00 68 10 00 00 00 E9 C0 FF FF FF
$ objdump -C -D --start-address=0xfc0 --stop-address=0xfd0
fc0: ff a3 14 00 00 00 jmp *0x14(%ebx)
fc6: 68 10 00 00 00 push $0x10
fcb: e9 c0 ff ff ff jmp f90
但在IDA的Hex View-1中你看到的可能是:
00000FC0 FF 25 90 A1 00 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
ff2590a10000 jmp dword ptr ds:[0A190h]
不要相信IDA的Hex View-1,这里的数据有可能是特别处理过的,不是原始数据,建 议WinHex确认。