type
status
date
slug
summary
tags
category
icon
password

FILE 结构

FILE 结构体的利用是一种通用的控制流劫持技术。攻击者可以覆盖堆上的 FILE 指针使其指向一个伪造的结构,利用结构中一个叫做 vtable 的指针,来执行任意代码。
我们知道 FILE 结构被一系列流操作函数(fopen()fread()fclose()等)所使用,大多数的 FILE 结构体保存在堆上(stdin、stdout、stderr除外,位于libc数据段),其指针动态创建并由 fopen() 返回。在 glibc(2.23) 中,这个结构体是 _IO_FILE_plout,包含了一个 _IO_FILE 结构体和一个指向 _IO_jump_t 结构体的指针:
 
vtable 指向的函数跳转表其实是一种兼容 C++ 虚函数的实现。当程序对某个流进行操作时,会调用该流对应的跳转表中的某个函数。
 
进程中的 FILE 结构会通过 _chain 域构成一个链表,链表头部用全局变量 _IO_list_all 表示。
另外 _IO_wide_data 结构也是后面需要的:
 

fopen

下面我们来看几个函数的实现。
 
 
 

fread

 
 
 
所以 _IO_XSGETN 宏最终会调用 vtable 中的函数,即:
 

fwrite

 
 
_IO_XSPUTN 最终将调用下面的函数:
 

fclose

 
pwn出题暑期more题解
Loading...