House of Roman 这个技巧说简单点其实就是 fastbin attack 和 Unsortbin attack 结合的一个小 trick。
该技术用于 bypass ALSR,利用12-bit 的爆破来达到获取shell的目的。且仅仅只需要一个 UAF 漏洞以及能创建任意大小的 chunk 的情况下就能完成利用。
作者提供给了我们一个 demo 用于展示,整个利用过程大概可以分为三步骤。
往 malloc_hook 写入 one gadget
先对 demo 进行一个大致的分析:
开启的保护情况:
Copy [ * ] ' /media/psf/Home/Desktop/MyCTF/House-Of-Roman/new_chall '
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: PIE enabled 样题中有三个主要功能,Malloc ,Write,以及 Free。
在 Free 功能中存在 指针未置零而造成的悬挂指针。
首先伪造一个 chunk ,chunk的大小为0x61。紧接着我们利用 partial overwrite 将 FD 指向伪造的chunk(当然,这里我们也可以用 UAF 完成)。
伪造 chunk size
这里,我们 free 掉 chunk 1,这个时候我们能获得一个 unsortbin
接着,我们重分配 0xd1 这块 chunk,以及修改其 size 为0x71
我们紧接着需要修正这0x71 FD freelist ,将其伪造成已经释放的块
这个时候我们的 FD 已经在 malloc hook 附近,为之后的爆破做准备。
我们只需要通过 释放一块0x71大小的 chunk 就能完成 fix。
利用 unsortebin 的攻击技巧,并使用编辑功能将 onegadet 写入 。
分配 3 个 chunk ,在 B + 0x78 处设置 p64(0x61) , 作用是 fake size ,用于后面 的 fastbin attack
释放掉 B , 然后分配同样大小再次分配到 B , 此时 B+0x10 和 B+0x18 中有 main_arean 的地址。分配 3 个 fastbin ,利用 off by one 修改 B->size = 0x71
生成两个 fastbin ,然后利用 uaf ,部分地址写,把 B 链入到 fastbin
调试看看此时 fastbin 的状态
0x555555757020 就是 chunk B
然后通过修改 B->fd 的低 2 字节, 使得 B->fd= malloc_hook - 0x23
然后分配 3 个 0x70 的 chunk ,就可以拿到 malloc_hook 所在的那个 chunk .
然后 free 掉 E ,进入 fastbin ,利用 uaf 设置 E->fd = 0 , 修复了 fastbin
然后是 unsorted bin 攻击,使得 malloc_hook 的值为 main_arena+88
利用 修改 malloc_hook 的低三个字节 ,使得 malloc_hook 为 one_gadget 的地址
然后 free 两次同一个 chunk ,触发 malloc_printerr , getshell
https://gist.github.com/romanking98/9aab2804832c0fb46615f025e8ffb0bc
https://github.com/romanking98/House-Of-Roman
https://xz.aliyun.com/t/2316