这种利用方法类似于house of lore,总结一下,留个模板以后备用
0x01 前置知识
1.1 house of lore
攻击效果
分配任意指定位置的 chunk,从而修改任意地址的内存。(任意地址写)
攻击条件
能控制 Small Bin Chunk 的 bk 指针,并且控制指定位置 chunk 的 fd 指针。
攻击原理
1 | /* |
首先smallbin 如果 malloc的话,chunk是从链表尾部取的。如果free的话,chunk是添加到链表头部的(靠近bin的位置)。
现在small bin中有两个chunk
1 | fd |
现在我们将 chunk2的 bk修改掉,fd不变
然后让fake_chunk的fd指向chunk2…..
1 | if ( __glibc_unlikely( bck->fd != victim ) ) |
然后就可以把这个fake_chunk放到samll bin上了
1 | bin->bk = bck; |
有一说一,这个条件还挺苛刻的
0x02 Tcache Stashing Unlink Attack
1.1 攻击目标
- 向任意指定位置写入指定值。
- 向任意地址分配一个Chunk。
1.2 攻击前提
- 能控制 Small Bin Chunk 的 bk 指针。
- 程序可以越过Tache取Chunk。(使用calloc即可做到)
- 程序至少可以分配两种不同大小且大小为unsorted bin的Chunk
1.3 攻击原理
我们首先分析House of Lore Attack
中所忽视的Tcache相关代码。
1 |
|
其实发现一个很明显的地方,注意他把剩下的small_bin放入tcache的操作没有做任何的检查。
但是此处又有了矛盾的地方!
首先,在引入Tcache后,Tcache中的Chunk拥有绝对优先权,我们不能越过Tcache向SmallBin中填入Chunk,也不能越过Tcache从SmallBin中取出Chunk。(除非Tcache已经处于FULL状态)
然后,我们如果要在这里启动攻击,那么要求SmallBin
中至少有两个Chunk(否则无法进入While中的if语句块),同时要求Tcache处于非空状态。
那样就产生了矛盾,导致这个漏洞看似无法利用。
但是calloc
函数有一个很有趣的特性,它不会从Tcache
拿Chunk
,因此可以越过第一条矛盾“不能越过Tcache
从SmallBin
中取出Chunk
”。
然后是Unsorted Bin
的last remainder
基址,当申请的Chunk大于Unsorted Bin
中Chunk的大小且其为Unsorted Bin
中的唯一Chunk
时,该Chunk
不会进入Tcache
。
那么,再看这个图
1 | fd |
如果我们把chunk1的bk改掉,fd不变
fd不变就可以绕过第一个完整链的检查,并且可以通过解链操作向fake_chunk+0x10的位置写入一个很大的值
1 | bck->fd = bin; |
那么,当Tcache存在两个以上的空位时,程序会将我们的fake chunk置入Tcache。
0x03 例题 BUUOJ-2020 新春红包题-3
1 | from pwn import * |