Unlink | Unsortedbin_Attack
unsorted_bin_attack
unsortedbin
-
一个
chunk被释放时,当他不属于fastbin的范围且不和top_chunk相邻,他就会被首先放入unsortedbin中。 -
malloc的时候,如果fastbin和smallbin里都找不到相应大小的chunk,就会去unsortedbin里面找。
如果大小满足,就会返回相应的chunk给用户,不满足,就会将unsortedbin中所有的chunk放入smallbin中。 -
是一个双向链表。
- FILO,从链表头部取,放进链表尾部。
- 取出
chunk的时候不使用unlink的宏。1
2
3
4bck = victim -> bk //victim 是当前要取出来的chunk unsorted_chunks(av) -> bk = bck bck -> fd = unsorted_chunks(av)
attack
-
如果控制了
victim的bk指向target_addr - 8,那么target_addr就可以被改写成为unsorted_bin的地址。 -
无法更改
target_addr为指定内容,但可以将其覆盖为一个较大的数字。- 可以用来更改循环次数
- 更改判断流程
- ……

漏洞
一个普通的菜单选择题堆的专属题型(bushi。
提供create、edit & delete,但是edit里面没有检查长度造成堆溢出。
流程中提供一个猜数功能,猜中了就可以调用system
思路
- 一个错误的想法
一开始是想用double_free那种思路,把fastbins的某一个bin的指针指向got表。所以一开始还觉得挺简单的,但很快我就想起了被寻找合适位置冒充chunk的size域支配的恐惧。
unlink
我发现基本上所有的堆溢出都可以构造出unlink的利用。只要有类似nodelist的指针。
- 构造
fake_chunk,注意size大于0x80。 delete触发unlink,将heaparray指向atoi的got表。- 将
atoi@got的内容改写成为system@plt。 -
发送
/bin/sh\x00仍旧
glibc2.27跑不了。
-
unsorted bin attack- 看了大佬的
wp才只知道有这个攻击 glibc2.27跑不了。
- 看了大佬的

这里有个判断,如果magic是一个大于0x1305的数字就会执行l33t这个函数。
使用unsorted_bin_attack更改,执行。
- 分配3个chunk——第三个是用来隔开
top_chunk。 - delete(1)
- 利用堆溢出更改
chunk_1的bk域为magic的地址。 - 再次分配一个大小相同的
chunk。
exp
unlink
1 | |
UnsortedBinAttack
1 | |
问题
到底是为什么glibc2.27没法跑?