House_Of_Orange

参考:
House of Orange - CTF Wiki (ctf-wiki.org)
介绍
house of orange 在于我们没有free的时候,一样可以达到free的效果,将一个chunk放进unsorted bin中,然后达到泄露libc的效果
操作的原理简单来说是当前堆的 top chunk 尺寸不足以满足申请分配的大小的时候,原来的 top chunk 会被释放并被置入 unsorted bin 中,通过这一点可以在没有 free 函数情况下获取到 unsorted bins。
- 正常情况下malloc的执行过程
malloc调用位于libc.so中的__int_malloc函数,该函数中以此检查fastbin,small bins,unsorted bin,large bin,若这些都不满足,则在top chunk中找
- top chunk也不满足
此时会执行sysmalloc分配chunk
1 | else { |
但是堆分配有mmap和brk分配方式,我们要用brk的分配方式拓展chunk,这样,之前的top chunk就会放到unsorted bin中,这也就达到了house of orange的利用
一些check
- malloc的大小要小于mmp_.mmap_threshold(默认128k)
- sysmalloc函数对top chunk size的check
1 | assert((old_top == initial_top(av) && old_size == 0) || |
简单来说,top chunk的size要大于等于MINSIZE,top chunk的结束地址必须是页对其的,top chunk相邻的前一个chunk必须处于inuse状态。
总结一下check
伪造的size必须页对其
size要大于MINSIZE(0x10)
size要小于之后申请的chunk size + MINSIZE
size的prev inuse位必须是1
然后top chunk就会执行_int_free进入unsorted bin中
例题
2024ciscn orange_cat_diary
文章:http://downbeat.top/2025/03/07/2024ciscn-PWN%E5%A4%8D%E7%8E%B0/
CTFHUB house_of_einherjar
文章:http://downbeat.top/2025/03/10/House-of-Einherjar/
house_of_orange-hitcon2016
题目链接:https://buuoj.cn/challenges#houseoforange_hitcon_2016
参考:https://www.cnblogs.com/LynneHuan/p/14696780.html
https://www.xi4oyu.top/6a6ded9c/
考点:House of orange + FSOP
直接来看主要部分吧
- add
只有三次机会,malloc最大的size=0x1000
1 | int add() |
v3 是一个malloc的结构体,v4是一个calloc的结构体可以抽象为:
1 | struct v3{ |
也就是说每次add其实我们是创建了三个chunk的,其size分别是0x20,input_size+0x10,0x20(calloc1,8)
- show
正常的输出
1 | int sub_EE6() |
- edit
更改chunk的size由我们自己输入,但是只有两次机会
1 | int sub_107C() |
漏洞分析
- 从上面不难看出,我们没有free函数,可以打house of orange,利用edit里面的堆溢出,来修改top chunk的size,从而构造出一个unsorted bin出来,泄露libc
- 但是由于add函数只能使用三次,我们不能像前面的题目一样打
Arbitrary alloc
,次数不够,所以要打IO - 由于是libc2.23还可以泄露堆地址,可以打FSOP
泄露libc
1 | add(0x20) # 第一次add |
FSOP
在构造fake_file和fake_vtable的时候,我们要在一个可写的地址写入构造的FILE,因此我们可以利用edit泄露出堆的地址(largebin_chunk),然后就可以往里面构造fake_FILE结构
下面来分析一下:
泄露堆地址
1 | edit(0x10,b'a'*15) # 泄露出heap的基地址 |
构造fake_FILE
来看看文章先:
FILE的基本结构:https://www.yuque.com/yuqueyonghupiiwso/gixo00/bekmilyu3sn6sh3e?singleDoc#O5d7V
FSOP: http://downbeat.top/2024/12/05/%E5%88%A9%E7%94%A8-IO-FILE%E7%BB%93%E6%9E%84/#2-FSOP
此处选择调用_IO_OVERFLOW
1 | malloc_printerr->_libc_message->_GI_abort->_IO_flush_all_lockp->_IO_OVERFLOW |
- 在这之前先来了解一下_IO_list_all:
这是一个指向FILE结构的全局指针,指向FILE结构,我们修改该全局指针指向一个我们构造的fake_FILE结构就可以实现我们想要实现的东西了,这里要用到unsortedbin attack。
先简单提一下:
- 如果
main_arena + 88
作为文件流地址,那么它的chain
指针对应的是smallbin[0x60]
。 - 如果申请的大小在
largebin
的范围内,那么在解链unsorted bin
的时候,会先把unsorted bin chunk
放在large bin
中,就会在fd_nextsize
和bk_nextsize
上留下堆地址
注意一下+0x68处指向我们构造的fake_FILE结构的地址
1 | struct _IO_FILE_plus |
1 | _IO_FILE_plus_size = { |
- 再来看看重要的指针vtable
1 | // 简化版本,来自wiki |
- 通过1,2的介绍,我们可以知道我们需要构造fake_IO_list_all,还需要将+0xd8即vtable指向一个我们自己构造的vtable,将+0x20即OVERFLOW的地方修改为system函数,而参数’/bin/sh\x00’则来自于我们伪造的fake_FILE结构处
1 | fp = (_IO_FILE *) _IO_list_all; // 覆盖为伪造的链表,链表头覆盖为b'/bin/sh\x00' |
但是有check:
1 | fp->_mode <= 0 |
- 直接分析脚本吧:
1 | payload = cyclic(0x400) + p64(0) + p64(0x21) + p32(0x21) + p32(1) + p64(0) # 溢出到unsortedbin |
- size改为0x61,bk改为IO_list_all-0x10:
修改bk指针:起初bk指针是指向自己本身的,然后修改为_IO_list_all-0x10,那么会导致_IO_list_all指向该unsortedbin的开头,也就是说,我们将_IO_list_all指针指向了unsortedbin。
修改size是因为:IO_list_all+0x68指向的是下一个_IO_FILE_plus,其是一个0x60大小的small_chunk,要是我们覆盖unsortedbin中的chunk_size为0x60,那么_chain将会填成该chunk的地址,就把这个chunk当作_IO_FILE_plus结构了,然后我们再将对应的地址改为对应的数值,+0xd8的vtable指向我们构造的vtable即可。
可以先按照如下payload动调看看:
1 | payload = cyclic(0x400) + p64(0) + p64(0x21) + p32(0x21) + p32(1) + p64(0) |
可以发现+0x68的地址指向unsortedbin的开头,也就是说我们将unsortedbin当作了一个_IO_FILE_plus结构,然后我们就可以布置fake_FILE结构了,继续解释fake_FILE:
1 | payload = cyclic(0x400) + p64(0) + p64(0x21) + p32(0x21) + p32(1) + p64(0) |
- 参考:
1 | 'amd64':{ |
0x0:对应的地址就是unsortedbin的开头,同时要满足FSOP的条件
1 | fp->mode <= 0 |
所以payload的设置就满足了这样的条件,最后vtable对应下一个fake_vtable,在指向的地址布置vtable即可,同时要在第四个overflow的地方布置system即可。
1 | void * funcs[] = { |
- 最后直接调用一次malloc会产生错误,调用abort会调用到_IO_OVERFLOW
由于bk指针被修改,会导致malloc出错。
EXP
1 | from pwn import * |
- 标题: House_Of_Orange
- 作者: D0wnBe@t
- 创建于 : 2024-10-08 18:35:05
- 更新于 : 2025-03-13 21:57:37
- 链接: http://downbeat.top/2024/10/08/House-Of-Orange/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。