unsorted bin attack
复制本地路径 | 在线编辑
这个方法是很多攻击的一个环节。glibc2.29 之后该方法失效。
- 攻击效果:可以达到任意地址写一个 libc 地址(即unsorted_chunks(av))
- 攻击前提:可以控制 bk 指针
攻击原理
/* remove from unsorted list */
if (__glibc_unlikely (bck->fd != victim))
malloc_printerr ("malloc(): corrupted unsorted chunks 3");
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av);
如上所示,这是 unsorted 脱链的过程,如果可以控制 bk 指针,则造成攻击。
攻击效果的扩展
在某个地址上写入 libc 地址,究竟有啥用,因为以前都是能直接控制到目标块的,现在只能写一个数,感觉有点鸡肋?
覆盖 global_max_fast
1️⃣ global_max_fast 是什么?
- 控制:最大多大的 chunk 可以进 fastbin
- 默认值:
global_max_fast = 0x80
2️⃣ 覆盖之后
fastbin 判断:
if (size <= global_max_fast)
放进 fastbin
现在:
size <= 0x7ffff7dd1b78 // 几乎永真
👉 所有 chunk 都能进 fastbin
3️⃣ 最终效果
- large chunk 进入 fastbin
- fastbin 没有 size check
-
你可以:
-
fastbin dup
- house of spirit
- fake chunk on stack / bss
📌 这就是为什么:
写一个 “main_arena 指针” 就已经是核弹
覆盖 __malloc_hook / __free_hook
在 hook 还存在的年代,可以覆盖有些 hook:
__malloc_hook = main_arena
然后对里面内容进行二次修正,即 partial overwrite,最终修改成 system 地址。
破坏 allocator 逻辑
这个就千奇百怪了,总之是覆盖 malloc 当中的一些数据结构逻辑,比如:
av->topav->bins[...]
后续可以进行一些其他的攻击操作
偏移写
这是一个很常见,但是初学者很容易忽略的地方。我们可以向任意地址写入某个 libc 地址,不一定需要写入对齐地址,比如在 house of storm 攻击中,我们就用这种方式修改了某个 chunk 地址的 size 内容,而我们修改的地址是 fake_chunk+3,如下图所示:

这里我们是偏移写,达到让 size 内容为 0x56,便于后续攻击,这里是小端写,具体内容:
