Fastbin-attack之house-of-spirit
house of spirit是一种组合型漏洞利用,目标位置处伪造fastbin chunk,并将其释放,从而达到分配
指定地址
的chunk的目的
绕过检测
以libc-2.23.so为例子,直接看一下malloc.c的源码吧。
fake chunk的ismmap不能是1,因为是1的话会拿出来单独处理,并且写入的fake_chunk要对齐
要满足fastbin,要对齐
next_chunk大小不能小于2 * SIZE_SZ同时也不能大于av->system_men
fastbin 链表头部不能是该 fake chunk,即不能构成 double free 的情况
例子
来自how2heap上的例子进行说明(删除了一些,不影响代码
1 | //gcc -g z1r01.c -o z1r01 |
首先,malloc(1)创建了一个chunk,接着定义了long long的指针a,和fake_chunks[10]的数组,接着让fake_chunks[1]的数据变成0x40,也就是fake的size,将[9]改为0x1234,将[2]的地址给了指针a,释放a指针,最后创建了0x30大小的chunk。
gdb 一下吧,在第13行下个断点吧。b 13
0x7fffffffdd88 - 0x8为fake_chunk的起始地址
第17行下个断点
红色框内已经被改变了,fake_chunk的size变成了0x40,上面的绕过检测已经符合了
- fake chunk 的 ISMMAP 位不能为 1
- fake chunk 地址需要对齐
- fake chunk 的 size 大小需要满足对应的 fastbin 的需求,同时也得对齐
0x1234也满足了一个条件 ,做为next_chunk的size位,next_chunk大小不能小于2 * SIZE_SZ同时也不能大于av->system_men
下个22行的断点
因为a=&fake_chunk[2],a也就是指向了fake_chunk的data部分,此时释放a,也就是释放了fake_chunk,又因为fake_chunk的size为0x40所以在fastbins中0x40里出现了fake_chunk的地址,下一次申请malloc时,就会将fake_chunk的地址拿出来使用,也就是任意写地址
运行到最后可以看到fastbin已经被取出,使用hose-of-spirit这种漏洞利用,可以先伪造chunk,写好free,再利用释放,重启,覆盖free写入system从而getshell