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

黑客与极客 / 2018年04月01日 10:40

互联网+

*本文原创作者:hellowuzekai,属于FreeBuf原创奖励计划,禁止转载

0×00 前面的话

本篇文章是系列的最后一篇,主要分析一下House系列的几个典型漏洞,关于堆利用的后续学习,大家可以关注 shellphish 团队的 how2heap 项目,有精力的可以结合源码详细了解堆的机制并从中找出利用的点。

本篇文章目录:

0x01 House of spirit 0x02 House of lore 0x03 House of force 0x04 结语 0×01 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[9] = 0x1234; // 0x40/sizeof(unsigned long long) = 8

然后我们把 fake_chunks[2] 的地址作为参数调用free

free(&fake_chunk[2]);// size的下一位为malloc返回的地址

此时再进行malloc就可以得到该处的chunk

p = malloc(0x30) // 根据 chunk size 计算公式 小于 0x38 即可 (0x38+0x10-0x08)(0x10对齐) 0×02 House of lore

在前面的 House of spirit 中,我们尝试在栈上伪造了一个 chunk,那么接下来在 House of lore 中,我们将尝试伪造一条 smallbin链表,注意看,这里会用到我们在第一篇中讲过的 malloc分配流程的内容。

首先我们需要创建两个chunk,第一个用于进入smallbin中,第二个用来防止free后被top chunk合并

victim = malloc(100) // size 位于 smallbin 范围内 malloc(1000) //防止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的链表

intptr_t* stack_buffer_1[4] = {0}; intptr_t* stack_buffer_2[3] = {0}; intptr_t *victim_chunk = victim-2; stack_buffer_1[0] = 0; stack_buffer_1[1] = 0; stack_buffer_1[2] = victim_chunk; stack_buffer_1[3] = (intptr_t*)stack_buffer_2; stack_buffer_2[2] = (intptr_t*)stack_buffer_1; victim[1] = (intptr_t)stack_buffer_1;

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

void *p3 = malloc(100);

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

0×03 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中写入数据就可以改变这里的值。

malloc(big_size); q = malloc(100); *q = "hello world"; 0×04 结语

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

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

*本文原创作者:hellowuzekai,属于FreeBuf原创奖励计划,禁止转载返回搜狐,查看更多

责任编辑:

1.环球科技网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.环球科技网的原创文章,请转载时务必注明文章作者和"来源:环球科技网",不尊重原创的行为环球科技网或将追究责任;3.作者投稿可能会经环球科技网编辑修改或补充。