how2heap-2.23-04-unsorted_bin_leak

#include<stdio.h>
#include<malloc.h>

int main()
{
   
        char* a = malloc(0x88);
        char* b = malloc(0x8);

        free(a);
        long* c = malloc(0x88);
        printf("%lx , %lx\n",c[0],c[1]);
        return 0;
}

unsorted bin leak原理:将chunk从unsorted bin申请回来时,chunk中保存的与unsorted bin相关的地址没有被清除,可以通过该地址获取libc的基地址

main_arean->bins初始化数据的含义

之前的文章过,画了个图介绍过,how2heap-2.23-03-fastbin_dup_consolidate,现在粘贴过来
在这里插入图片描述

将chunk释放到unsorted bin中

  • char* a = malloc(0x88); 申请一个大于fastbin范围的chunk a
  • char* b = malloc(0x8); 预防chunk a被释放后与top chunk合并
  • free(a); 将chunk a释放到 unsorted bin中

可以看到unsorted bin中保存了chunk a的地址,chunk a的fd,bk也保存了unsorted bin的地址(实际是top的地址)
在这里插入图片描述


从unsorted bin中申请回chunk

long* c = malloc(0x88);将chunk a重新申请回来,unsorted bin恢复为chunk a放进去之前的数据,而chunk a fd,bk中保存的unsorted bin的地址(实际是top的地址)并没有被清除
读取chunk c的c[0],c[1]就能获取unsorted bin的地址(实际是top的地址)
在这里插入图片描述

获取main_arean的地址

可以计算出top到main_arean的距离是8 * 11 = 88(在64位系统下:4字节的mutex + 4字节的flags + 8*10的fastbinY数组),从而得到main_aren的地址

获取main_arean在libc中的偏移

通过 __malloc_trim 函数得出

int
__malloc_trim (size_t s)
{
   
  int result = 0;

  if (__malloc_initialized < 0)
    ptmalloc_init ();

  mstate ar_ptr = &main_arena;	// <<<<<<<<<<<<<<<<<
  do
    {
   
      (void) mutex_lock (&ar_ptr->mutex);
      result |= mtrim (ar_ptr, s);
      (void) mutex_unlock (&ar_ptr->mutex);

      ar_ptr = ar_ptr->next;
    }
  while (ar_ptr != &main_arena);

  return result;
}

在这里插入图片描述


通过__malloc_hook得出
在这里插入图片描述

main_arena_offset = ELF("libc.so.6").symbols["__malloc_hook"] + 0x10

之后便能计算出libc的基地址

相关推荐

  1. how2heap-2.23-15-house_of_einherjar

    2024-01-05 13:06:01       67 阅读
  2. How to install R in ubuntu 22.04

    2024-01-05 13:06:01       52 阅读
  3. How to install PyAlink on Ubuntu 22.04

    2024-01-05 13:06:01       37 阅读
  4. How to install Miniconda on ubuntu 22.04

    2024-01-05 13:06:01       37 阅读
  5. How to use pandoc in Ubuntu 22.04

    2024-01-05 13:06:01       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-05 13:06:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-05 13:06:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-05 13:06:01       87 阅读
  4. Python语言-面向对象

    2024-01-05 13:06:01       96 阅读

热门阅读

  1. vos3000外呼系统如何修改服务器的时区

    2024-01-05 13:06:01       47 阅读
  2. C++:类和对象(2)

    2024-01-05 13:06:01       49 阅读
  3. SQLAlchemy快速入门

    2024-01-05 13:06:01       60 阅读
  4. 批量写入数据到Elasticsearch

    2024-01-05 13:06:01       55 阅读
  5. Gateway相关问题及答案(2024)

    2024-01-05 13:06:01       40 阅读
  6. Qt undefined reference to `vtable for xxx‘

    2024-01-05 13:06:01       52 阅读
  7. linux 环境下安装ffmpeg。

    2024-01-05 13:06:01       69 阅读
  8. HTTP与API接口详解

    2024-01-05 13:06:01       55 阅读
  9. 【react.js + hooks】useUrl 监听路由参数

    2024-01-05 13:06:01       51 阅读