got,plt表學習記錄

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>)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章