本讲开始将会介绍glibc2.23-2.35各个版本的漏洞以及利用手段,以及所有的house of系列
libc
2.23-2.35
首先是libc2.23,在2.23之前没有检测手段的时候基本上fastbin double free可以随意使用,在libc2.23-2.35之后加入了double free检测机制,使用起来没有之前这么方便了,但是依然可以使用。
我们先来看看具体效果
首先申请两个fastbin大小的堆块然后我们释放同一个堆块两次,然后我们通过gcc -g liyou.c -o liyou编译代码,执行程序
运行后触发double报错,程序核心转储。
我们使用gdb调试一下看看具体发生了什么
我们执行到第二个free后跟进代码
在这里进入了_int_free检测
程序最终崩溃
我们看看源码检测的触发点
/* 确保bin的顶部不是我们要添加的记录(即double free)。 */
if (__builtin_expect (old == p, 0)) { errstr = "double free or corruption (fasttop)"; goto errout; }
然后有了这个检测我们就需要去绕过
Fastbin Double Free 能够成功利用主要有两部分的原因
-
fastbin 的堆块被释放后 next_chunk 的 pre_inuse 位不会被清空
-
fastbin 在执行 free 的时候仅验证了 main_arena 直接指向的块,即链表指针头部的块。对于链表后面的块,并没有进行验证。
所以我们这样构造即可
#include<stdio.h>
int main(void)
{
void *chunk1,*chunk2,*chunk3;
chunk1=malloc(0x40);
chunk2=malloc(0x40);
free(chunk1);
free(chunk2);
free(chunk1);
return 0;
}
我们在 chunk1 释放后,再释放 chunk2 ,这样 main_arena 就指向 chunk2 而不是 chunk1 了,此时我们再去释放 chunk1 就不再会被检测到。
因为 chunk1 被再次释放因此其 fd 值不再为 0 而是指向 chunk2,这时如果我们可以控制 chunk1 的内容,便可以写入其 fd 指针从而实现在我们想要的任意地址分配 fastbin 块。
原文始发于微信公众号(由由学习吧):glibc堆第一讲fastbin double free
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论