_IO_wide_data是针对宽字符的虚函数表,这里先不关心,重点关注的是对_IO_FILE_plus结构体末尾虚函数表的定义,可以看到三者都被定义为了全局的_IO_file_jumps: #define libio_vtable __attribute__ ((section ("__libc_IO_vtables")))#define JUMP_INIT(NAME, VALUE) VALUE#define JUMP_INIT_DUMMY JUMP_...
# defineDEF_STDFILE(NAME,FD,CHAIN,FLAGS)\static_IO_lock_t _IO_stdfile_##FD##_lock=_IO_lock_initializer;\staticstruct _IO_wide_data _IO_wide_data_##FD\={._wide_vtable=&_IO_wfile_jumps};\ struct _IO_FILE_plusNAME\={FILEBUF_LITERAL(CHAIN,FLAGS,FD,&_IO_wide_data_##FD),\&_...
struct_IO_FILE{int_flags;// 文件状态标志(高位是 _IO_MAGIC,其余是标志位)char*_IO_read_ptr;// 读缓冲区当前读取位置char*_IO_read_end;// 读缓冲区结束位置char*_IO_read_base;// 读缓冲区基地址char*_IO_write_base;// 写缓冲区基地址char*_IO_write_ptr;// 写缓冲区当前写入位置char*_IO_...
IOFILE的利用,通常需要伪造IOFILE结构体,随后通过一些方式触发IO流,使得程序调用我们劫持后的IO函数,从而达成getshell或者orw。所以IOFILE exploit实际上是整个利用环节的最后一步,要达成伪造IOFILE结构体、触发IO链,往往需要借助一些辅助手法。 在高版本下,最为常用的是largebin attack...
struct _IO_FILE_plus { _IO_FILE file; IO_jump_t *vtable; } 也就是说我们的FILE结构体其实本质上是_IO_FILE结构体。并且vatable指针指向了某些函数指针。我们看到vatable指针的数据类型是IO_jump_t,其实在该类型中有很多函数指针,其他的一些IO操作就使用到了这些函数指针 ...
经过了前面对于fopen等源码的介绍,知道了IO FILE结构体里面有个很重要的数据结构--vtable,IO函数的很多功能都是通过它去实现的。接下来主要描述如何通过劫持vtable去实现控制函数执行流以及通过FSOP来进行利用。 vtable劫持 本文是基于libc 2.23及之前的libc上可实施的,libc2.24之后加入了vtable check机制,无法再构造vtabl...
实际上我们最终描述文件流文件的数据结构是_IO_FILE_plus,其中有_IO_FILE结构体和常量_IO_jump_t(内容不可被修改),而根据成员的名称,我们大概可以推测出不同成员的作用——file成员应该包含的是该文件的一些关键数据;而vtable,也就是virtual table,虚表,即各种操作函数的指针。
就我个人感觉,我觉得在学习了IO_FILE结构体利用(以及ret2dlresolve这类高阶技巧)后,我对于Pwn的理解发生了质变。从之前死板地一招一式地学习漏洞利用技巧,慢慢进入了那个“天地万物为我所用”的境界。 不懂我的意思?你早晚会明白的(doge) 鉴于IO_FILE结构体利用技巧很多,本篇博客长期更新。
看到链表的操作,应该就大致猜到了FSOP的主要原理了。即伪造通过_IO_list_all中的节点来实现对文件链表的控制以实现利用目的。来说通常一般的英文直接利用任意写的漏洞修改_IO_list_all直接指向柯林斯控的地址。 具体来说该如何利用呢glibc的中有一个函数?_IO_flush_all_lockp,该函数的功能是刷新所有FILE结构体的...
简介 CTF 中 glibc堆利用及 IO_FILE 总结 前言 本文主要着眼于glibc下的一些漏洞及利用技巧和IO调用链,由浅入深,分为 “基础堆利用漏洞及基本IO攻击” 与 “高版本glibc下的利用” 两部分来进行讲解,前者主要包括了一些glibc相关的基础知识,以及低版本glibc(2.27及以前)下常见的漏洞利用方式,后者主要涉及到一些...