Dance In Heap(四):一些堆利用的方法(下)
0x00 前面的话
本篇文章是系列的最后一篇,主要分析一下House系列的几个典型漏洞,关于堆利用的后续学习,大家可以关注 shellphish 团队的 how2heap 项目,有精力的可以结合源码详细了解堆的机制并从中找出利用的点。
本篇文章目录:
0x01 House of spirit 0x02 House of lore 0x03 House of force 0x04 结语
0x01 House of spirit
假设我们可以在栈上伪造出一个chunk结构,那么我们可不可以利用free来释放,再次malloc得到这个chunk呢?House of spirit就是这个思路,当我们在栈上伪造出 chunk,并绕过检查的话,那么就可以实现
首先我们需要伪造chunk,但是要记住,在free执行的时候,会有一步检查,检查下一个chunk的size是否大于2*sizeof(size_t),并且小于所有分配的空间,所以我们需要构造两个size位。
我们假设栈上有一个数组可以填充数据
unsigned long long fake_chunks[10];
我们开始构造要free的chunk的size
fake_chunks[1] = 0x40;
然后为了绕过检查,需要在这个chunk后面紧跟一个chunk,设置其size位
然后我们把 fake_chunks[2] 的地址作为参数调用free
此时再进行malloc就可以得到该处的chunk
0x02 House of lore
在前面的 House of spirit 中,我们尝试在栈上伪造了一个 chunk,那么接下来在 House of lore 中,我们将尝试伪造一条 smallbin链表,注意看,这里会用到我们在第一篇中讲过的 malloc分配流程的内容。
首先我们需要创建两个chunk,第一个用于进入smallbin中,第二个用来防止free后被top chunk合并
接下来我们要将这个 victim 送入 smallbin 中。
free(victim);
我们先将其free掉,现在它位于unsortedbin中
malloc(1200);
接下来,我们再次申请一个size位于largebin中,并且在unsortedbin中没有与其匹配的chunk,所以我们需要一个大值。
设想一下,接下来会发生什么?
系统依次找完 fastbin、smallbin、unsortedbin后发现找不到这个size的chunk,接下来会把unsortedbin中的chunk加入到smallbin或者largebin中,这时,我们的victim就成功进入smallbin中了。
现在我们假设可以控制 victim的fd、bk指针,我们就可以在栈上伪造出一个smallbin的链表
那么我们再次malloc时,就可以从smallbin的链表末尾取chunk了
void *p3 = malloc(100);
而当我们在栈上创造出 chunk 后,就可以向chunk中写入来覆盖返回地址控制eip,甚至绕过 canary检查。
0x03 House of force
在 House of force 中,我们这样设想,如果我们能够将top chunk的size覆盖为一个巨大的值,是否就可以实现malloc从堆直接到.bss段、到栈?
我们首先创建一个 chunk,紧跟着这个chunk的就是top chunk
p = malloc(0x100-8);
我们设法溢出到top chunk
*(p+0xf8) = -1;
那么现在top chunk 的size 就是 0xffffffffffffffff,现在我们可以计算一下从top chunk的起始地址到我们要覆盖的地址之间的距离,然后malloc一个巨大的chunk填充这一段距离,然后再次malloc一个小chunk,向小chunk中写入数据就可以改变这里的值。
0x04 结语
Dance In Heap 系列教程到这里就要结束了,这个系列算是把我最近一段时间的学习做了一个简单的总结,当然,想写的要远比实际写上去的多,堆利用的方法有很多,我只是挑了几个相对基础的利用方式,结合堆的一些机制较为详细的讲解一下,仅供入门参考,能够理解完这些,对一些比较复杂的漏洞也能够去试着了解。这里面许多漏洞是结合 how2heap 项目中的实例讲解的,有时间的话大家可以去 how2heap 看看。
这篇教程写的太匆忙,里面如果有错误纰漏,欢迎大家指出,一同进步,谢谢。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2020-09-20:如何判断一个数是质数?
- 金九银十Android面试复习题集:关于四大组件中的Activity你了解多少?
- HaseMap的循环姿势你真的懂了吗?
- 历经14天自定义3个注解解决项目的3个Swagger难题
- VUE开发–获取DOM对象和组件对象(十九)
- RASP攻防 —— RASP安全应用与局限性浅析
- JavaScript 交换值的奇思妙想
- Docker体验(一)
- (二)Hadoop集群配置安装
- 压缩视频
- (四)Java读写文件,合并成新的文件
- 【小白学金融】—— 用 STATA 计算 CAR 值
- 3行核心CSS代码的rate评分组件,秀到你怀疑人生
- 用 Rust 和 N-API 开发高性能 NodeJS 扩展
- 教你 Linux 免密登录配置