Pwn Ptmalloc2 House of Einherjar
英灵战士的家!
英灵战士的家!
学! 狠狠地学!
fopen 返回的是一个 FILE 指针, 而 FILE 附近有 vtable , 如果我们可以修改 vtable, 那么在调用到对应的 vtable 中的函数时, 就能够控制程序流了.
伪造 vtable 的攻击方法大致分为两类. 一种是找到对应位置修改它, 另一种是直接伪造 FILE 结构, 并使一个 FILE 指针指向伪造的这个结构.
更详细的 FILE 结构见 这里
直接修改的需要知道 FILE 的位置在哪. 对于 stdin, stdout, stderr 来说, 它们在 libc 的数据段. 如果程序有取消缓存区, 那么在程序的 bss 节上能够找到指向它们的指针. 对于其他的程序使用 fopen 打开的文件, FILE 结构在堆上 (使用 malloc 分配).
需要注意的是, 由于 IO_FILE_plus 结构中的 vtable 是 const 修饰的, 默认的在 libc 只读数据段, 所以 vtable 中的函数指针不能直接更改. 于是, 只能考虑修改 vtable 这个指针, 使其指向一块我们能够控制的内存, 在块内存上伪造 vtable.
本来想直接写利用的, 后来做了个题, 发现我理解的有一些偏差. 趁着最近状态好, 一鼓作气还是把前置知识写了吧.
如未特殊说明, 均假定 libc 2.27, 64 位.
malloc 的时候, 如果从 smallbin 中取了一块, 那么会尽力把剩余的块放到对应的 tcache 中.
起因是这样的, 最近不是在学堆嘛, 得翻各种 glibc 源码. 但是 elixir 的索引做得很差, 点一下相当于全文搜索, 那我要你这索引干嘛. 后来找到了 woboq, 官方实例有 glibc, 试了一下还挺方便. 简单搜索了一下, 并没有找到别人搭建好的各种 glibc 版本的代码浏览器, 于是程序员思维: 自己动手!