4.29 IDA分析GOT/PLT时的坑 https://scz.617.cn/unix/201606171028.txt A: scz IDA反汇编.got.plt section时有特殊处理。在Segments(Shift-F7)最后几行有个 extern,实际不存在,是IDA歪歪出来的,位于该section中的内容其文件偏移显示 UNKNOWN。extern只是方便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确认。