House of Roman
介绍
House of Roman 这个技巧说简单点其实就是 fastbin attack 和 Unsortbin attack 结合的一个小 trick。
概括
该技术用于 bypass ALSR,利用12-bit 的爆破来达到获取shell的目的。且仅仅只需要一个 UAF 漏洞以及能创建任意大小的 chunk 的情况下就能完成利用。
原理以及展示
作者提供给了我们一个 demo 用于展示,整个利用过程大概可以分为三步骤。
将 FD 指向 malloc_hook
修正 0x71 的 Freelist
往 malloc_hook 写入 one gadget
先对 demo 进行一个大致的分析:
开启的保护情况:
[*] '/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 写入 。
分析 exp
分配 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
link
https://gist.github.com/romanking98/9aab2804832c0fb46615f025e8ffb0bc
https://github.com/romanking98/House-Of-Roman
https://xz.aliyun.com/t/2316
Last updated