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
没法跑?