House of some
前言:
- 在22年,roderick01师傅发现了
hosue of apple
手法,宽字节跳表攻击几乎成为了每位pwn手的必备技能.house of apple2
更是以简单的模板,极高的效率成为了传播范围,利用效率最高的IO攻击手法 - 之所以
house of apple2
有效是因为glibc
没有对wide_data
结构体中的跳表指针进行范围的检查,但是我们通过_IO_wfile_overflow
调用位于wide_data(0x68)
处的任意函数指针(system,one_gadget,setcontext,swapcontext
)实现getshell
或orw
- 总有一天,这个漏洞会被修复,好在在此前,Csome师傅发明了一种”新”的利用手法,避开了所有对跳表指针的合法检查
原理
1.任意地址读
这几乎是每位师傅开始学习IO利用时学的第一个手法,而且在各种比赛中也被用于leak libc,我们回顾一下这个手法
利用链
1 | _IO_wfile_overflow |
IO结构体伪造
1 | fake_file_write = flat({ |
最经典的任意地址读
任意地址写
说实话我在学house of some前几乎没用过这个手法(
相信各位师傅对这个手法也不是很熟悉吧(bushi)
这里我们引入一个新的IO跳表指针:IO_new_file
1 |
|
观察这个跳表我们可以发现
_flags
设置为0
即可(与apple2相同)vtable
设置为_IO_wfile_jumps
地址,使得调用_IO_wfile_overflow
即可_wide_data->_IO_write_base
设置为0
,即满足*(_wide_data + 0x18) = 0
(与apple2相同)_wide_data->_IO_write_ptr
设置为大于_wide_data->_IO_write_base
,即满足*(_wide_data + 0x20) > *(_wide_data + 0x18)
_wide_data->_IO_buf_base
设置为0
,即满足*(_wide_data + 0x30) = 0
(与apple2相同)_wide_data->_wide_vtable
设置为任意一个包含_IO_new_file_underflow
,其中原生的vtable就有,设置成_IO_file_jumps-0x48
即可_vtable_offset
设置为0
_IO_buf_base
与_IO_buf_end
设置为你需要写入的地址范围_chain
设置为你下一个触发的fake file地址_IO_write_ptr <= _IO_write_base
即可_fileno
设置为0
,表示read(0, buf, size)
_mode
设置为2
,满足fp->_mode > 0
即可
总的来说IO结构体伪造如下
1 | fake_file_read = flat({ |
最终会调用read(fp->_fileno,fp->_IO_buf_base,fp->_IO_buf_end - fp->_IO_buf_base)
这三个参数我们都可以控制
综合利用
这两个功能单独拿出来确实不够看,但是放在一起就非常厉害了:任意地址读写!
在很多师傅心中,IO利用似乎只有一次,经过一次IO流冲刷后进程就该exit_了,貌似我们只能在任意读,写中选一个利用
但是别忘了chain_
这个成员——angelboy提出的FSOP原来的样子,利用chain_
把一个一个fake file
串起来,通过多次的fake file
调用_IO_OVERFLOW
实现多个功能的调用
现在我们来看_IO_flush_all
1 | int _IO_flush_all (void) |
在for循环中,沿着链表对每个结构体进行检查,冲刷
最终利用手法
那么此时我们的思路就很明确了
- 我们使用创建一个
write_chunk
和read_chunk
,实现任意地址读,将ptr
设置为environ
,读出stack地址,并使用read_chunk
写入一个新的read_chunk
,并将这两个已经写入的chunk
和未写入的chunk
使用chain_
按照冲刷顺序连在一起 - 创建的新
read_chunk
将栈地址设置为ptr,
实现对read_syscall
返回地址的覆盖 - 此时三枚结构体冲刷完毕后栈上的
ROP
可以控制执行流
将两个普普通通的IO手法穿在一起,组成一个威力巨大的house of手法
例题
其实除了明确diff了宽字节跳表检查的题目,我们可以在任意版本的libc中使用这个手法
我随便找了道题,大家可以试试:附件分流
有个uaf,手法很多,主要是练习这个手法吧
1 | from pwn import * |
感谢Csome师傅,真是个漂亮到极点的手法啊