Skip to content

unsorted bin attack

复制本地路径 | 在线编辑

这个方法是很多攻击的一个环节。glibc2.29 之后该方法失效。

  1. 攻击效果:可以达到任意地址写一个 libc 地址(即unsorted_chunks(av))
  2. 攻击前提:可以控制 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->top
  • av->bins[...]

后续可以进行一些其他的攻击操作

偏移写

这是一个很常见,但是初学者很容易忽略的地方。我们可以向任意地址写入某个 libc 地址,不一定需要写入对齐地址,比如在 house of storm 攻击中,我们就用这种方式修改了某个 chunk 地址的 size 内容,而我们修改的地址是 fake_chunk+3,如下图所示:

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

Comments