House of Roman
前言:感觉没有找到非常合适的例子,这里就简单说一下原理和利用手法吧。
什么是 House of Ruman?
House of Roman 是一种非常经典且具有挑战性的高级堆利用手法。它的核心是:在没有任何信息泄露的情况下,通过概率爆破,通常是 1/16 的成功率,实现相对地址覆盖,最终获取远程代码执行。
这项技术由安全研究员 Roman 提出,主要针对缺少 puts、printf 等打印输出功能,导致攻击者无法获取 Libc 基址的极端情况。
House of Roman 的原理:
House of Roman 的本质是组合拳。由于没有地址泄露,我们无法得知 ASLR 也就是地址空间布局随机化加载的 Libc 绝对地址。但是,堆块在特定状态下(如被放入 Unsorted Bin 时),其 fd 和 bk 指针会指向 Libc 内部的 main_arena + 固定偏移。
而 House of Roman 巧妙地利用了这一点:
- ASLR 的弱点:ASLR 虽然随机化了基址,但由于内存页对齐(4KB),地址的最低 12 位(即后 3 个十六进制字符)是固定不变的。
- 局部覆盖(Partial Overwrite):我们不覆写完整的 8 字节指针,只利用 Use-After-Free (UAF) 覆写指针的最低 2 个字节。这需要猜测半个字节(4 bits),即 16 种可能,所以成功率为 1/16。
House of Ruman 的利用步骤:
典型的 House of Roman 需要结合** Fastbin Dup 和 Unsorted Bin Attack**,分为以下四个核心步骤:
1. 将 Fastbin 劫持到 __malloc_hook 附近
首先,我们需要在 __malloc_hook 附近伪造一个 Fastbin chunk。
- 分配一个 chunk 并释放进 Unsorted Bin,使其 fd 指针带上 main_arena 的地址(属于 Libc)。
- 利用 UAF 漏洞,只覆盖 fd 指针的最后两个字节,使其指向 __malloc_hook - 0x23 的位置(这个偏移通常有一个值为 0x7f 的伪造 size 字段,可绕过 fastbin 的安全检查)。
2. 利用 Unsorted Bin Attack 写入 Libc 地址
由于第一步我们只是做好了 Fastbin 的链表,但 __malloc_hook 本身还是空的。我们需要往里面填一个 Libc 相关的地址。
- 将一个 chunk 释放到 Unsorted Bin。
- 利用 UAF,将其 bk 指针局部覆盖为 __malloc_hook 的地址。
- 再次分配该 chunk,触发 Unsorted Bin Attack。此时,__malloc_hook 的内容会被覆写为 main_arena+88 的地址。
3. 覆盖 __malloc_hook 为 One Gadget
现在,__malloc_hook 里已经有了一个 Libc 地址(main_arena+88)。
- 我们将第一步伪造在 __malloc_hook - 0x23 处的 Fastbin chunk 分配出来。
- 通过编辑这个 chunk,我们直接修改 __malloc_hook 里的内容。
- 同样使用局部覆盖:将 main_arena+88 的末尾字节修改为 one_gadget 的偏移。因为它们都在 Libc 内,高位地址完全相同,只需覆盖低位即可。
4. 触发 RCE
调用 malloc 函数,程序会跳转执行 __malloc_hook 指向的代码,即 one_gadget,直接弹 shell。
小结:
大概是这个思路,直接拿一道去深入理解一下吧,正好复习一下最近学的 _IO_2_1_stdout 利用
npuctf_2020_bad_guy
de1ctf_2019_weapon
更新: 2026-04-04 21:40:22
原文: https://www.yuque.com/idcm/wnemg9/xdi0ktwyxf0irn73