前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dance In Heap(四):一些堆利用的方法(下)

Dance In Heap(四):一些堆利用的方法(下)

作者头像
FB客服
发布2018-02-26 17:30:30
7320
发布2018-02-26 17:30:30
举报
文章被收录于专栏:FreeBuf

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位。

我们假设栈上有一个数组可以填充数据

代码语言:javascript
复制
unsigned long long fake_chunks[10];

我们开始构造要free的chunk的size

代码语言:javascript
复制
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 中。

代码语言:javascript
复制
free(victim);

我们先将其free掉,现在它位于unsortedbin中

代码语言:javascript
复制
malloc(1200);

接下来,我们再次申请一个size位于largebin中,并且在unsortedbin中没有与其匹配的chunk,所以我们需要一个大值。

设想一下,接下来会发生什么?

系统依次找完 fastbin、smallbin、unsortedbin后发现找不到这个size的chunk,接下来会把unsortedbin中的chunk加入到smallbin或者largebin中,这时,我们的victim就成功进入smallbin中了。

现在我们假设可以控制 victim的fd、bk指针,我们就可以在栈上伪造出一个smallbin的链表

那么我们再次malloc时,就可以从smallbin的链表末尾取chunk了

代码语言:javascript
复制
void *p3 = malloc(100);

而当我们在栈上创造出 chunk 后,就可以向chunk中写入来覆盖返回地址控制eip,甚至绕过 canary检查。

0x03 House of force

在 House of force 中,我们这样设想,如果我们能够将top chunk的size覆盖为一个巨大的值,是否就可以实现malloc从堆直接到.bss段、到栈?

我们首先创建一个 chunk,紧跟着这个chunk的就是top chunk

代码语言:javascript
复制
p = malloc(0x100-8);

我们设法溢出到top chunk

代码语言:javascript
复制
*(p+0xf8) = -1;

那么现在top chunk 的size 就是 0xffffffffffffffff,现在我们可以计算一下从top chunk的起始地址到我们要覆盖的地址之间的距离,然后malloc一个巨大的chunk填充这一段距离,然后再次malloc一个小chunk,向小chunk中写入数据就可以改变这里的值。

0x04 结语

Dance In Heap 系列教程到这里就要结束了,这个系列算是把我最近一段时间的学习做了一个简单的总结,当然,想写的要远比实际写上去的多,堆利用的方法有很多,我只是挑了几个相对基础的利用方式,结合堆的一些机制较为详细的讲解一下,仅供入门参考,能够理解完这些,对一些比较复杂的漏洞也能够去试着了解。这里面许多漏洞是结合 how2heap 项目中的实例讲解的,有时间的话大家可以去 how2heap 看看。

这篇教程写的太匆忙,里面如果有错误纰漏,欢迎大家指出,一同进步,谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 House of spirit
  • 0x02 House of lore
  • 0x03 House of force
  • 0x04 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档