glibc堆第一讲fastbin double free

admin 2022年7月23日02:18:58评论147 views字数 1009阅读3分21秒阅读模式





本讲开始将会介绍glibc2.23-2.35各个版本的漏洞以及利用手段,以及所有的house of系列



libc

2.23-2.35


      首先是libc2.23,在2.23之前没有检测手段的时候基本上fastbin double free可以随意使用,在libc2.23-2.35之后加入了double free检测机制,使用起来没有之前这么方便了,但是依然可以使用。

我们先来看看具体效果

glibc堆第一讲fastbin double free

首先申请两个fastbin大小的堆块然后我们释放同一个堆块两次,然后我们通过gcc -g liyou.c -o liyou编译代码,执行程序

glibc堆第一讲fastbin double free

运行后触发double报错,程序核心转储。

我们使用gdb调试一下看看具体发生了什么

glibc堆第一讲fastbin double free

我们执行到第二个free后跟进代码

glibc堆第一讲fastbin double free

在这里进入了_int_free检测

glibc堆第一讲fastbin double free

程序最终崩溃

我们看看源码检测的触发点

/* 确保bin的顶部不是我们要添加的记录(即double free)。 */

   if (__builtin_expect (old == p, 0))      {        errstr = "double free or corruption (fasttop)";        goto errout; }

然后有了这个检测我们就需要去绕过

Fastbin Double Free 能够成功利用主要有两部分的原因

  1. fastbin 的堆块被释放后 next_chunk 的 pre_inuse 位不会被清空

  2. 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 就不再会被检测到。

glibc堆第一讲fastbin double free

因为 chunk1 被再次释放因此其 fd 值不再为 0 而是指向 chunk2,这时如果我们可以控制 chunk1 的内容,便可以写入其 fd 指针从而实现在我们想要的任意地址分配 fastbin 块。


原文始发于微信公众号(由由学习吧):glibc堆第一讲fastbin double free

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月23日02:18:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   glibc堆第一讲fastbin double freehttps://cn-sec.com/archives/1193332.html

发表评论

匿名网友 填写信息