House of Roman

介绍

House of Roman 这个技巧说简单点其实就是 fastbin attack 和 Unsortbin attack 结合的一个小 trick。

概括

该技术用于 bypass ALSR,利用12-bit 的爆破来达到获取shell的目的。且仅仅只需要一个 UAF 漏洞以及能创建任意大小的 chunk 的情况下就能完成利用。

原理以及展示

作者提供给了我们一个 demo 用于展示,整个利用过程大概可以分为三步骤。

  1. 将 FD 指向 malloc_hook

  2. 修正 0x71 的 Freelist

  3. 往 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

分配 3chunk ,在 B + 0x78 处设置 p64(0x61) , 作用是 fake size ,用于后面 的 fastbin attack



释放掉 B , 然后分配同样大小再次分配到 B , 此时 B+0x10B+0x18 中有 main_arean 的地址。分配 3fastbin ,利用 off by one 修改 B->size = 0x71

生成两个 fastbin ,然后利用 uaf ,部分地址写,把 B 链入到 fastbin

调试看看此时 fastbin 的状态

0x555555757020 就是 chunk B

然后通过修改 B->fd 的低 2 字节, 使得 B->fd= malloc_hook - 0x23

然后分配 30x70chunk ,就可以拿到 malloc_hook 所在的那个 chunk .

然后 freeE ,进入 fastbin ,利用 uaf 设置 E->fd = 0 , 修复了 fastbin

然后是 unsorted bin 攻击,使得 malloc_hook 的值为 main_arena+88

利用 修改 malloc_hook 的低三个字节 ,使得 malloc_hookone_gadget 的地址

然后 free 两次同一个 chunk ,触发 malloc_printerrgetshell

https://gist.github.com/romanking98/9aab2804832c0fb46615f025e8ffb0bc

https://github.com/romanking98/House-Of-Roman

https://xz.aliyun.com/t/2316

Last updated