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 许可协议,转载请注明出处。