unsorted bin attack&&FSOP利用技巧
unsorted bin attack&&FSOP利用技巧
FSOP(File Stream Oriented Programming)的核心思想就是劫持_IO_list_all
的值来伪造链表和其中的_IO_FILE
项,但是单纯的伪造只是构造了数据,还需要某种方法进行触发。FSOP 选择的触发方法是**调用_IO_flush_all_lockp
**,这个函数会刷新_IO_list_all
链表中所有项的文件流,相当于对每个 FILE 调用 fflush,也对应着会调用_IO_FILE_plus.vtable
中的_IO_overflow
。
unsorted bin attack
unsorted bin attack可以实现在任意地址写入一个main_arena相关的地址,可以看下面部分源码分析漏洞原理。
1 |
|
这是unsorted bin取出执行的操作,最后一句就是把取出bin的bk指针指向地址的fd指针赋值位unsorted_chunks,说着可能有点绕,看下图。
利用poc做个测试
1 |
|
测试结果如下,目标地址的值成功被main_arena相关地址覆盖
FSOP
FSOP 的核心思想就是劫持_IO_list_all 的值来伪造链表和其中的_IO_FILE 项,但是单纯的伪造只是构造了数据还需要某种方法进行触发。FSOP 选择的触发方法是调用_IO_flush_all_lockp,这个函数会刷新_IO_list_all 链表中所有项的文件流,相当于对每个 FILE 调用 fflush,也对应着会调用_IO_FILE_plus.vtable 中的_IO_overflow。
前面unsorted bin attack可将_IO_list_all
指针的值修改为main_arena+88
。但这还不够,因为我们很难控制main_arena中的数据,并不能在mode、_IO_write_ptr
和_IO_write_base
的对应偏移处构造出合适的值。
所以将目光转向_IO_FILE
的链表特性。_IO_flush_all_lockp
函数会通过fp = fp->_chain
不断的寻找下一个_IO_FILE
。
巧妙的是,_IO_FILE
结构中的_chain
字段对应偏移是0x68,而在main_arena+88
对应偏移为0x68的地址正好是大小为0x60的small bin的bk,所有我们可以利用其他漏洞修改unsorted bin的size位0x61,所以在将其链入small bin[0x60]之后,就可以实现如下图所示的攻击链。
因为 vtable 中的函数调用时会把对应的 _IO_FILE_plus
指针作为第一个参数传递,因此这里我们把 “sh” 写入 _IO_FILE_plus
头部。
例题
题目关键点分析
题目中的malloc相关操作,都会向0x80对齐,无法利用fast bin。
仅仅存在UAF漏洞
利用思路:
- 利用UAF去泄露堆地址和栈地址
- 利用edit中的realloc修改unsorted bin的size为0x61bk指针为IO_list_all - 0x10,并布置伪造的IO结构体
- 利用unsorted bin attack修改IO_list_all为main_arean+88
对于2.23的FSOP
修改unsorted bin
的size
为0x61
, 然后从unsorted bin chunk
的头部开始,布局如下:[/bin/sh\x00, 0x61 0, _IO_list_all - 0x10, 0, 1, 0xa8 * "\x00", fake_vtable_addr]
,然后fake_vtable
填的内容如下:[0, 0, 0, system_addr]
exp
1 |
|