HeapAttack: House_of_Orange

漏洞样式

  • 漏洞要求:libc-leak, 任意地址写(_IO_list_all劫持), 大块chunk控制(伪造_IO_FILE结构)
  • libc版本:glibc-2.3及以下

2. 利用方法

2.1 攻击效果

  • GetShell:
    通过劫持_IO_list_all.vtable中某函数指针,篡改为system或one_gadget, 并伪造_IO_FILE结构从而使程序在调用 _IO_flush_all_lockp 函数后能够最终调用到system或one_gadet。_IO_flush_all_lockp

2.2 过程简述

    1. 使用unsortedbin attack,largebin attack,tcache dup、House Of Botcake等任意地址写技术将_IO_list_all改写为攻击者可控内存地址(记为fakeIOList)。
    1. 在fakeIOList上布置内存布局,使得以类型Struct _IO_File 解析fakeIOList
    • a. fp->_mode <= 0
    • b. fp->_IO_write_ptr > fp->_IO_write_base
    1. vtable 指向可控内存区域,修改 vtable->__overflow 为目标函数(system或者one_gadget)
    1. [可选的]若vtable->__overflow指向system。可将fp->_flags 写成b"/bin/sh\0"。因为最终调用的代码是:

    _IO_OVERFLOW (fp, EOF)

    fp->vtable->__overflow(fp)

3. 注意

参考链接(IO FILE 之劫持vtable及FSOP)中的以下两个技巧的学习:

  1. 通过mmap 0x200000的超大chunk,该chunk会恰好分配在libc的上方,这样可以leak libc地址。
  2. 当top_chunk size不够分配内存时,main_arena会sbrk新的page;若旧top_chunk的末尾地址与sbrk新分配内存的开始地址不邻接,则会把旧top_chunk free掉。我们这样就不经过free获得了一个unsortedbin chunk。

参考

  1. IO FILE 之劫持vtable及FSOP
  2. IO FILE 之vtable check 以及绕过
  3. 从零开始的Linux堆利用(七)——House of Orange