House of lore
House of lore是一种利用small bin的利用方法。
前面我们通过修改unsorted bin与large bin的bk(bk_nextsize)位来造成对”任意“地址的更改。unsorted bin由于修改后,如果无法妥善处理bk指向的chunk的size位、bk位,会造成unsorted bin无法再使用,largebin由于是通过fd_nextsize来便利的,所以下次放入影响会小,而下次取出,假如可取出比修改的chunk小的chunk,还可以继续使用。以上是我对之前unsorted bin与large bin attack思考。
这里为什么会回忆起这两个利用的原因是House of lore 的利用通过的就是修改small bin的bk位,而与上面利用方法不同的是,这次是通过取出,从而修改任意地址的内存。
贴一下利用点的源码,做了删减,只展示相关代码。
victim = last(bin)
bck = victim->bk;
// 检查 bck->fd 是不是 victim,防止伪造
if (__glibc_unlikely(bck->fd != victim)) {
errstr = "malloc(): smallbin double linked list corrupted";
goto errout;
}
// 设置 victim 对应的 inuse 位
set_inuse_bit_at_offset(victim, nb);
// 修改 small bin 链表,将 small bin 的最后一个 chunk 取出来
bin->bk = bck;
bck->fd = bin;
假设我们修改最后一个small chunk的bk位,使其对向fake chunk,那么我们有可能通过两次malloc获得此fake chunk。
不过利用上也有很大难点。由于需要绕过bck->fd!=victim 的检测,我们还需要妥善处理fake chunk的fd位,甚至还有bk位,bk->fd位,以便第二次malloc同样绕过。
看起来利用条件还是很苛刻的。
House of Rabbit
通过利用malloc_consolidate函数,实现overlapping的效果或对”任意“位置的读写。
第一种情况,修改size位,实现overlapping
示例:
unsigned long* chunk1=malloc(0x40); //0x602000
unsigned long* chunk2=malloc(0x40); //0x602050
malloc(0x10);
free(chunk1);
free(chunk2);
chunk1[-1]=0xa1; //modify chunk1 size to be 0xa1
malloc(0x1000); //allocate a large chunk, trigger malloc consolidate
这时会使chunk1变成一个大chunk,从而实现overlapping。利用点在于malloc_conslidate缺少对size位的检测。
第二种情况,修改fd位,实现对”任意“位置的读写
示例:
unsigned long* chunk1=malloc(0x40); //0x602000
unsigned long* chunk2=malloc(0x100);//0x602050
chunk2[1]=0x31; //fake chunk size 0x30
chunk2[7]=0x21 //fake chunk's next chunk
chunk2[11]=0x21 //fake chunk's next chunk's next chuck
free(chunk1);
chuck1[0]=0x602060;// modify the fd of chunk1
malloc(5000);// malloc a big chunk to trigger malloc consolidate
对于此利用,有一点需要注意
虽然malloc consolidate会把fastbin中的项放至unsorted bin,但由于后续遍历unsorted bin,其会被放置在相应大小的bin,例如small bin。
不过个人感觉可利用场景不太广泛,拥有修改size的能力话,正常extend就可以实现overlapping。如果是修改fd,正如示例写的那样,需要设置fake chunk’s next chunk与fake chunk‘s next chunk’s next chunk位,因为malloc consolidate 还会对物理相邻地址前后进行合并,以防出现一些意想不到的错误。特殊情况特殊分析,期待未来能见到相关利用的题。