欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]ctf pwn中的unsorted bin利用及chunk shrink——0ctf2018 heapstorm2 writeup

[原创]ctf pwn中的unsorted bin利用及chunk shrink——0ctf2018 heapstorm2 writeup

题目链接

https://github.com/eternalsakura/ctf_pwn/tree/master/0ctf2018/heapstorm2

前置知识

  • mallopt
    int mallopt(int param,int value) param的取值分别为M_MXFAST,value是以字节为单位。
    M_MXFAST:定义使用fastbins的内存请求大小的上限,小于该阈值的小块内存请求将不会使用fastbins获得内存,其缺省值为64。下面我们来将M_MXFAST设置为0,禁止使用fastbins
    源码
102     #ifndef M_MXFAST

103    # define M_MXFAST  1    /* maximum request size for "fastbins" */

104    #endif

5137    int __libc_mallopt (int param_number, int value)

5138    {

5139      mstate av = &main_arena;

5140      int res = 1;

5141    

5142      if (__malloc_initialized < 0)

5143        ptmalloc_init ();

5144      __libc_lock_lock (av->mutex);

5145    

5146      LIBC_PROBE (memory_mallopt, 2, param_number, value);

5147    

5148      /* We must consolidate main arena before changing max_fast

5149         (see definition of set_max_fast).  */

5150      malloc_consolidate (av);

5151    

5152      switch (param_number)

5153        {

5154        case M_MXFAST:

5155          if (value >= 0 && value <= MAX_FAST_SIZE)

5156            {

5157              LIBC_PROBE (memory_mallopt_mxfast, 2, value, get_max_fast ());

5158              set_max_fast (value);

5159            }

5160          else

5161            res = 0;

5162          break;

5163    

5164        case M_TRIM_THRESHOLD:

5165          do_set_trim_threshold (value);

5166          break;

5167    

5168        case M_TOP_PAD:

5169          do_set_top_pad (value);

5170          break;

5171    

5172        case M_MMAP_THRESHOLD:

5173          res = do_set_mmap_threshold (value);

5174          break;

5175    

5176        case M_MMAP_MAX:

5177          do_set_mmaps_max (value);

5178          break;

5179    

5180        case M_CHECK_ACTION:

5181          do_set_mallopt_check (value);

5182          break;

5183    

5184        case M_PERTURB:

5185          do_set_perturb_byte (value);

5186          break;

5187    

5188        case M_ARENA_TEST:

5189          if (value > 0)

5190            do_set_arena_test (value);

5191          break;

5192    

5193        case M_ARENA_MAX:

5194          if (value > 0)

5195            do_set_arena_max (value);

5196          break;

5197        }

5198      __libc_lock_unlock (av->mutex);

5199      return res;

5200    }

  • 利用linux的/dev/urandom文件产生较好的随机数
    https://blog.csdn.net/stpeace/article/details/45829161

          int randNum = 0;  
    
          int fd = open("/dev/urandom", O_RDONLY);  
    
          if(-1 == fd)  
    
          {  
    
                  printf("error\n");  
    
                  return 1;  
    
          }  
    
          read(fd, (char *)&randNum, sizeof(int));  
    
          close(fd);
    
    

分析

checksec

parallels@ubuntu:~/ctf/0ctf2018/heapstorm2$ checksec heapstorm2

[*] '/home/parallels/ctf/0ctf2018/heapstorm2/heapstorm2'

    Arch:     amd64-64-little

    RELRO:    Full RELRO

    Stack:    Canary found

    NX:       NX enabled

    PIE:      PIE enabled

程序分析

关闭fastbin的分配

对存放堆指针和size的地方进行随机化

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功