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
- 作者:wgiegie
- 链接:https://tangly1024.com/article/a508d5cb-7fa2-42b9-9722-51e1ccc5a3de
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。