glibc2.23-glibc2.29的malloc.c的变化

本文详细记录了 glibc 从 2.23 到 2.29 版本在 `malloc.c` 中堆分配和回收策略的变更,特别是 `_int_malloc`、`_int_free`、`malloc_consolidate` 和 `unlink` 函数的改进,以及针对 double free 和其他安全漏洞的检查增强。重点讨论了 fastbin、smallbin、unsorted bin 和 Large bin 分配时的校验,并提到了从 2.26 版本引入的 Tcache 机制及其安全性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在pwn堆利用中 往往需要根据glibc的版本对exp进行一个改进
本人根据自身的需要对glibc2.23-glibc2.29在malloc.c在堆分配和回收策略上的变化进行一个记录
最主要的是记录报错信息

Glibc2.23

_int_malloc

从fastbin中分配fast chunk的时候

  • malloc的时候 会对fastbin->fd指向的chunk 验证一遍它是否在对应的fast bin中 伪造的时候需要注意伪造的chunk所挂入的fastbin的队列
if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
            {
   
              errstr = "malloc(): memory corruption (fast)";
            errout:
              malloc_printerr (check_action, errstr, chunk2mem (victim), av);
              return NULL;
            }

从smallbin中分配small chunk的时候

  • 会验证smallbin中最后一个chunk的bk指针对应的fd指针是否合理 伪造chunk的时候溢出victim的bk指针,伪造fake chunk的fd指针即可
if (__glibc_unlikely (bck->fd != victim))
                {
   
                  errstr = "malloc(): smallbin double linked list corrupted";
                  goto errout;
                }

从unsorted bin中分配chunk的时候

  • 分配的时候会依次检索unsorted bin中块的大小是否在2 * SIZE_SZ 和 av->system_mem之间 如果不是报错
if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
              || __builtin_expect (victim->size > av->system_mem, 0))
            malloc_printerr (check_action, "malloc(): memory corruption",
                             chunk2mem (victim), av);
  • 当unsorted bin为空的时候,若最后剩下一个size范围在Large Bin中的large chunk 且分割后的大小能大于MINSIZE 那么会分分割这一块在挂入unsorted bin前会检测unsorted bin最后挂入的块即unsorted bin->fd的bk指针是否指向unsorted bin
 if (__glibc_unlikely (fwd->bk != bck))
                    {
   
                      errstr = "malloc(): corrupted unsorted chunks";
                      goto errout;
                    }

从Large bin中分配chunk的时候

  • Large bin中分割出chunk放入unsorted bin中时 会再次检测最后一个放入unsorted bin中chunk的bk指针是否指向unsorted bin
if (__glibc_unlikely (fwd->bk != bck))
                    {
   
                      errstr = "malloc(): corrupted unsorted chunks 2";
                      goto errout;
                    }

_int_free

free的ptr的检验

  • 检测释放的指针指向的地方是否符合条件 并且指针指向的地址是否对齐
 if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)
      || __builtin_expect (misaligned_chunk (p), 0))
    {
   
      errstr = "free(): invalid pointer";
    errout:
      if (!have_lock && locked)
        (void) mutex_unlock (&av->mutex);
      malloc_printerr (check_action, errstr, chunk2mem (p), av);
      return;
    }

free任何chunk时候都会进行的校验

  • 会检测该chunk的size是否在该系统支持的最小chunk尺寸 并且chunk尺寸是否对齐
if (__glibc_unlikely (size < MINSIZE || !aligned_OK (size)))
    {
   
      errstr = "free(): invalid size";
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值