largebin attack和house of storm如何结合形成一种高级攻击手段?
摘要:各版本glibc的保护手段(从2.23开始只关注重要变化) 这里先简单说一下各个glibc版本的变化,如果没说到的各位师傅可以补充 首先是2.24开了虚表保护,house of orange需要变化才能利用了 然后是2.26有tcache机
各版本glibc的保护手段(从2.23开始只关注重要变化)
这里先简单说一下各个glibc版本的变化,如果没说到的各位师傅可以补充
首先是2.24开了虚表保护,house of orange需要变化才能利用了
然后是2.26有tcache机制
2.27把abort函数中的fflush函数删了,完整的house of orange就此落幕
2.28在tcache里加了key字段防止tcache double free
2.29在unsortedbin里加了检测,unsortedbin落幕
2.30在largebin里加了检测,largebin attack只能写一个地址了
2.32加了safe linking机制,修改fd和bk指针需要有堆地址了
2.35则把hook函数移除了,之后堆的主要攻击就转向IO方向了。
Largebin attack
2.31前的攻击
顾名思义就是利用largebin来进行攻击,这里我贴一下源码(2.31之前),以下注释来自浅析Large_bins_attack在高低版本的利用
while((unsigned long)size < fwd->size){
fwd = fwd->fd_nextsize;
assert ((fwd->size & NON_MAIN_ARENA) == 0);
} //这里检测的是从unsorted_bins里提取出的堆块是否小于large_bins里最近被释放的堆块的大小,如果小于,就将fwd向前移,也就是与比它更小的堆块对比
if ((unsigned long) size == (unsigned long) fwd->size)
/* Always insert in the second position. */
fwd = fwd->fd;//相等的话,就往后排列
else
{
victim->fd_nextsize = fwd; //这里,victim是从unsorted_bin提取出来的堆块,fwd是最近被释放进large_bin的堆块,分别对应我们的p3,p2
victim->bk_nextsize = fwd->bk_nextsize; //在此前,p2->bk_nextsize已经被我们设置为了stack_var2-0x20的地址,所以p3的bk_nextsize指向它
fwd->bk_nextsize = victim; //p2->bk_nextsize指向p3
victim->bk_nextsize->fd_nextsize = victim; //p3->bk_nextsize = stack_var2 - 0x20,也就是说我们已经伪造了一个堆块,(stack_var2-0x20)->fd_nexitsize就是stack_var2的地址,将该地址赋值p3的头指针
}
bck = fwd->bk; //p2的bk我们设置成了stack_var1-0x10,所以bck成了我们stack_var1-0x10这个虚假的chunk
这个主要是什么意思呢,就是当unsortedbin的堆块要进入largebin中时,先检测其大小,我们利用的话一般要让进入largebin的堆块大于原有largebin中的堆块,这样就可以进下面这个else分支。
