Home avatar

Wings

Pwn FIEL 利用之伪造 vtable

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.