House Of Spirit
核心:
在目标位置处伪造fastbin chunk,并将其释放,从而达到分配指定地址的chunk的目的
特征:
fastbin double free所释放的chunk是本身程序自己malloc产生的,但是house of spirit是去释放指定地址的chunk。那么这个chunk我们可以通过伪造的方式构建,他可以是任意可写地址。在释放时,需要经过一些检查,去判断该释放的chunk是否为程序自身创建的。那么需要绕过这些检查:
fake chunk 的 ISMMAP 位不能为 1,因为 free 时,如果是 mmap 的 chunk,会单独处理
IS_MAPPED,记录当前 chunk 是否是由 mmap 分配的,这个标志位位于size低二比特位
fake chunk 地址需要对齐, MALLOC_ALIGN_MASK
因为fake_chunk可以在任意可写位置构造,这里对齐指的是地址上的对齐而不仅仅是内存对齐。
比如32位程序的话fake_chunk的prev_size所在地址就应该位0xXXXX0或0xXXXX4。
64位的话地址就应该在0xXXXX0或0xXXXX8。
fake chunk 的 size 大小需要满足对应的 fastbin 的需求,同时也得对齐
fake_chunk如果想挂进fastbin的话构造的大小就不能大于0x80,关于对齐和上面一样,并且在确定prev_size的位置后size所在位置要满足堆块结构的摆放位置
fake chunk 的 next chunk 的大小不能小于 2 * SIZE_SZ,同时也不能大于av->system_mem
fake_chunk 的大小,大小必须是 2 * SIZE_SZ 的整数倍。如果申请的内存大小不是 2 * SIZE_SZ 的整数倍,会被转换满足大小的最小的 2 * SIZE_SZ 的倍数。
32 位系统中,SIZE_SZ 是 4;64 位系统中,SIZE_SZ 是 8。
最大不能超过av->system_mem,即128kb。
next_chunk的大小一般我们会设置成为一个超过fastbin最大的范围的一个数,但要小于128kb,这样做的目的是在chunk连续释放的时候,能够保证伪造的chunk在释放后能够挂在fastbin中main_arena的前面,这样以来我们再一次申请伪造chunk大小的块时可以直接重启伪造chunk。
fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,即不能构成 double free 的情况
这个检查就是fake_chunk前一个释放块不能是fake_chunk本身,如果是的话_int_free函数就会检查出来并且中断。