Skip to content

Latest commit

 

History

History
55 lines (36 loc) · 2.07 KB

201606171028.txt.md

File metadata and controls

55 lines (36 loc) · 2.07 KB

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]

要求%ebx指向GOT[],即%ebx等于_GLOBAL_OFFSET_TABLE_

这种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确认。