0x0 解题思路
首先发现uaf漏洞但是只能show
和free
一次,而且free
掉的chunk
只能被top_chunk
合并。所以考虑利用溢出到top chunk
修改top chunk
的size然后再次malloc
泄露出libc,利用fastbin attack
劫持malloc_hook
用onegadget
获取shell
0x01 流程
- 溢出到
top_chunk
的size,修改其为一个较小的值 malloc
一个大于刚才size的值,这时这个chunk
会被添加到unsort_bin
中,fd
、bk
指针被置为libc里的地址- 再次
malloc
一个chunk
- 利用show泄露出libc的地址
- uaf劫持
malloc_hook
- 获取shell
0x02 新学到的知识
Unsorted Bin Attack
初始状态时 unsorted bin 的 fd 和 bk 均指向 unsorted bin 本身。House Of Orange
概述
House of Orange 的利用比较特殊,首先需要目标漏洞是堆上的漏洞但是特殊之处在于题目中不存在 free 函数或其他释放堆块的函数。我们知道一般想要利用堆漏洞,需要对堆块进行 malloc 和 free 操作,但是在 House of Orange 利用中无法使用 free 函数,因此 House of Orange 核心就是通过漏洞利用获得 free 的效果。
原理
如我们前面所述,House of Orange 的核心在于在没有 free 函数的情况下得到一个释放的堆块 (unsorted bin)。 这种操作的原理简单来说是当前堆的 top chunk 尺寸不足以满足申请分配的大小的时候,原来的 top chunk 会被释放并被置入 unsorted bin 中,通过这一点可以在没有 free 函数情况下获取到 unsorted bins。
进行chunk的分配时的顺序:
- fastbin
- small bins
- unsorted bins
- large bins
- top chunk
如果以上都不能满足申请的需求,则需要执行 sysmalloc 来向系统申请更多的空间。但是对于堆来说有 mmap 和 brk 两种分配方式,我们需要让堆以 brk 的形式拓展,之后原有的 top chunk 会被置于 unsorted bin 中。
伪造的 top chunk size 的要求:
- 伪造的size必须对齐内存页
- size 要大于 MINSIZE(0x10)
- size 要小于之后申请的 chunk size + MINSIZE(0x10)
- size 的 prev inuse 位必须为 1
malloc_hook劫持
何谓钩子函数,当一个函数挂载了钩子函数后,你执行这个函数时,实际执行的是钩子函数
通过泄露libc可以找到hook的地址
Fastbin Attack To stack
必须满足fake chunk的size在fastbin的范围
0x03 脚本
1 | from pwn import * |
0x04 一些有待解决的迷惑问题
recvuntil 和 sendline总是容易出问题