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

时间:2022-04-28
本文章向大家介绍Dance In Heap(四):一些堆利用的方法(下),主要内容包括0x01 House of spirit、0x02 House of lore、0x03 House of force、0x04 结语、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

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

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