unsorted_bin_attack

unsorted bin attack

关于这个手法的学习,必须要搞清楚两件事,不然理解起来挺懵的。
第一、从unsorted bin中取堆块的时候,是从尾部取的堆块。

image-20240401202036954

上图变为结构图为:

image-20240401202756914

当从unsorted bin中拿取最后一个堆块时(unsorted bin中堆块是从最后一个取的,跟fastbin和tcachebin还不一样),会触发下面这部分的操作。

1
2
3
4
victim = unsorted_chunks (av)->bk
bck = victim->bk
unsorted_chunks (av)->bk = bck
bck->fd = unsorted_chunks (av)

代码分析:

1
2
3
victim = unsorted_chunks (av)->bk
这个就是说把main_arena(这里的main_arena我的指的是上图的那个main_arena bins[0,1]这个块)的bk指针指向的内容(也就是chunk3的地址)给victim
换言之,这行代码的意思就是说victim就是chunk3
1
2
3
bck = victim->bk
这个就是把chunk3的bk指针指向的内容(也就是chunk2)给bck
换言之,这行代码的意思就是说bck就是chunk2
1
2
unsorted_chunks (av)->bk = bck
这个就是把现在的chunk2地址给main_arena的bk指针
1
2
bck->fd = unsorted_chunks (av)
这个就是把main_arena的地址给bck(也就是chunk2)的fd指针

从上面的分析可以看出,在执行完这串代码之后,chunk3从unsorted bin中分离了出去。

这四步中,我们可以从第二步进行攻击,如果我们可以利用溢出来伪造这个bck(也就是victim->bk,大白话就是用溢出unsorted bin中的尾部的chunk的bk指针(fd指针无所谓)),这就意味着我们可以将unsorted_chunks (av)(这个也就是main_arena+88/96的地址)写入到我们伪造的chunk的bck->fd(也就是bck+0x10)中。如果我们将伪造的地址先-0x10,那么最后这个伪造的地址就会被写入main_arena+88或main_arena+96的地址。

1
注意:由于执行完unsorted bin attack 后的chunk2已经变成了一个libc中的地址(应该是main_arena+88的地址),接下来再从unsorted bin中申请堆块时,执行bck->fd这步试图往libc这个不可写的地址写入数据,而导致程序崩溃。所以unosrtedbin attack之后,无法再从unsorted bin中申请堆块了

unsorted_bin_attack
http://ak0er.github.io/2024/05/04/unsorted-bin-attack/
作者
Ak0er
发布于
2024年5月4日
许可协议