漏洞样式
- 漏洞要求: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 过程简述
- 使用unsortedbin attack,largebin attack,tcache dup、House Of Botcake等任意地址写技术将_IO_list_all改写为攻击者可控内存地址(记为fakeIOList)。
- 在fakeIOList上布置内存布局,使得以类型Struct _IO_File 解析fakeIOList
- a. fp->_mode <= 0
- b. fp->_IO_write_ptr > fp->_IO_write_base
- vtable 指向可控内存区域,修改 vtable->__overflow 为目标函数(system或者one_gadget)
- [可选的]若vtable->__overflow指向system。可将fp->_flags 写成b"/bin/sh\0"。因为最终调用的代码是:
_IO_OVERFLOW (fp, EOF)
即fp->vtable->__overflow(fp)
3. 注意
参考链接(IO FILE 之劫持vtable及FSOP)中的以下两个技巧的学习:
- 通过mmap 0x200000的超大chunk,该chunk会恰好分配在libc的上方,这样可以leak libc地址。
- 当top_chunk size不够分配内存时,main_arena会sbrk新的page;若旧top_chunk的末尾地址与sbrk新分配内存的开始地址不邻接,则会把旧top_chunk free掉。我们这样就不经过free获得了一个unsortedbin chunk。