got表和plt表
#include <stdio.h>
#include <stdlib.h>
int main(int argc,argv** argv)
{
int n=argc;
printf("%d\n",n);
printf("%d\n",n);
}
以下两步分别用pwntools和objdump查看got表和plt表
用pwntools获取got表和plt表
>>>from pwn import*
>>>elf=ELF("a.out")
>>>print "0x"+"%x" %elf.symbols['printf']
0x80482e0
>>> print "0x"+"%x" %elf.got['printf']
0x804a00c
再使用objdump
>>>objdump -d -j .plt a.out
080482e0 <printf@plt>:
80482e0: ff 25 0c a0 04 08 jmp *0x804a00c
80482e6: 68 00 00 00 00 push $0x0
80482eb: e9 e0 ff ff ff jmp 80482d0 <_init+0x24>
>>> objdump -R a.out
0804a00c R_386_JUMP_SLOT printf@GLIBC_2.0
用gdb-peda查看main函数中反汇编结果
call 0x80482e0 <printf@plt>
对反汇编printf的plf表值
gdb-peda$ pdisass 0x80482e0
0x080482e0 <printf@plt+0>: jmp DWORD PTR ds:0x804a00c
0x080482e6 <printf@plt+6>: push 0x0
0x080482eb <printf@plt+11>: jmp 0x80482d0
上面的0x804a00c为printf的got表值
gdb-peda$ xinfo 0x804a00c
0x804a00c --> 0x80482e6 (<printf@plt+6>: push 0x0)
当我们执行完一次printf后
gdb-peda$ xinfo 0x804a00c
0x804a00c --> 0xb7e52670 (<__printf>: call 0xb7f28b09 <__x86.get_pc_thunk.ax>)