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