house of storm
很有趣的攻击,结合了 unsorted bin attack 和 large bin attack 的一个手段。由于 unsorted bin attack 只能在 2.29 以下版本使用,所以这个攻击也是只能在 2.29 以下使用。
unsortebin attack 和 largebin attack 回顾
先回顾两种基础攻击方式,这里就直接说结论,具体细节看其他文章。
-
unsorted bin attack:
- 可以向任意 target 写入某个 libc 地址(即unsorted_chunks(av));
unsorted_chunks(av)->bk同时也被赋值为了target - 0x10
-
large bin attack:
- 可以向任意 target 写入某个 libc 地址(是 largebin 中的某个索引地址)
只要知道这两种攻击的效果,下面的 house of storm 就不难了。
算法原理
准备 unsorted 和 largebin
如下所示,没啥好说的。一开始 free 之后两个块都在 unsorted 中,然后申请一个块使得另一个放入到了 largebin 中,最后再释放掉这个块,会放入 unsorted 中。
unsorted_bin=malloc(0x418);
malloc(0X18);
large_bin=malloc(0x408);
malloc(0x18);
free(large_bin);
free(unsorted_bin);
unsorted_bin=malloc(0x418);
free(unsorted_bin);
unsorted bin 攻击
下面就是一个最正常的 unsorted bin 攻击:
unsorted_bin[0]=0;
// 即 unsorted_bin->bk = target_addr
unsorted_bin[1]=(unsigned long)target_addr;
//则 target_addr->fd = unsorted_chunks(av),不过似乎没有发挥使用
//重点是:unsorted_chunks(av)->bk = target_addr
假设这个块脱链之后(后面会让他脱链),会修改了 unsorted_chunks(av) 中的 bk,此时系统会认为 malloc 中的 unsorted 链表里面还有一个块,即 target_addr。
large bin 攻击
但这个时候直接 malloc 还不行,因为只有 malloc 对应大小的块,系统才会返回给我们。所以这里用最正常的 large bin attack 修改 size:
large_bin[0]=0;
large_bin[1]=(unsigned long)target_addr+8;
large_bin[2]=0;
large_bin[3]=(unsigned long)target_addr-0x18-5;
// 此时 (target_addr-0x18-5)->fd_nextsize = victim(a heap_addr)
// 即 target_addr + 3 = victim
假设某个块放入到 largebin 中时,会把 target_addr + 3 修改成 victim 这个 libc 地址,为啥要 +3,可以看下面的图,相当于偏移写:


上面的是小端写,仔细体会。很有趣,最终相当于是利用了 libc 地址中的高位字节,修改了 size 是 0x56。
控制 target
所以如果我们申请一个 0x50 大小的块,而上面两种攻击成功做好了铺垫,让系统认为此时 unsorted 链表正好有一个对应的块,所以就会返回给我们,此时控制了 target_addr。
这里我们只需要一条语句 malloc(0x48) 就行了,执行前系统是 unsorted bin 和 large bin 各有一块,并且里面块的内容已经修改完毕了,就等着触发了。执行 malloc 之后:
- 首先会遍历 unsorted bin,所以触发了
unsorted_bin的脱链,所以触发了 unsorted bin 攻击 - 脱链之后
unsorted_bin会放入到 large bin 中,所以触发了 large bin 的插入,所以触发了 large bin 攻击 - 两种攻击都完毕后,系统会认为 unsorted 链表还有一个块,地址是 target,大小是 0x50,而我们又恰好要这个大小的块,所以返回。
参考
- https://www.cnblogs.com/tolele/p/16728502.html :以上内容都是参考本篇文章