CTF-PWN: 什么是_IO_FILE?
重要概念:fopen()返回的是一个结构体的指针
_IO_FILE
结构体在什么时候被创建?
_IO_FILE
结构体的实例是在程序使用标准 I/O 函数(如 fopen
、fclose
、fread
、fwrite
等)时创建和管理的。这个结构体实际上是 GNU C Library (glibc) 用于处理文件流的底层实现细节。当你在程序中打开一个文件或者创建一个流时,glibc 会在后台分配和初始化一个 _IO_FILE
结构体,并返回一个指向它的指针(即 FILE*
类型)。
下面是一些常见场景,说明 _IO_FILE
结构体是如何被创建和使用的:
-
使用
fopen
打开文件:
当你调用fopen
打开一个文件时,glibc 会分配一个_IO_FILE
结构体并进行初始化。例如:FILE *file = fopen("example.txt", "r");
在这个例子中,
fopen
函数会创建一个_IO_FILE
结构体实例来管理example.txt
文件的读操作,并返回一个指向该结构体的指针file
。 -
使用
fdopen
关联文件描述符和文件流:
如果你有一个现有的文件描述符,并希望将其与一个标准 I/O 流关联,可以使用fdopen
函数:int fd = open("example.txt", O_RDONLY); FILE *file = fdopen(fd, "r");
fdopen
会创建一个新的_IO_FILE
结构体实例,并将文件描述符fd
关联到这个结构体上。 -
标准输入输出:
标准输入(stdin)、标准输出(stdout)和标准错误(stderr)也是通过_IO_FILE
结构体来管理的。它们在程序启动时由运行时库自动初始化。fprintf(stdout, "Hello, World!\n");
_IO_FILE
结构体的创建过程
当函数如 fopen
被调用时,glibc 内部会进行以下步骤:
-
分配内存:
glibc 会调用内存分配函数(如malloc
)为_IO_FILE
结构体分配内存。 -
初始化结构体:
分配内存后,glibc 会初始化_IO_FILE
结构体的各个字段。例如,它会设置缓冲区指针、文件描述符、文件模式等。 -
返回指针:
初始化完成后,glibc 会返回一个指向这个_IO_FILE
结构体的指针,即FILE*
类型的指针。
_IO_FILE
在文件流操作中的生命周期
-
创建:
当你使用标准 I/O 函数(如fopen
、fdopen
)打开或创建一个文件流时,glibc 会创建一个_IO_FILE
结构体实例。 -
使用:
在文件流的生命周期内,所有对该文件流的读写操作(如fread
、fwrite
、fgets
、fputs
等)都会通过这个_IO_FILE
结构体来管理缓冲区、文件描述符和流的状态。 -
销毁:
当你调用fclose
关闭文件流时,glibc 会执行以下操作:- 刷新缓冲区中的数据(如果有需要)。
- 释放与文件流关联的资源(如缓冲区内存)。
- 关闭文件描述符。
- 最后,释放
_IO_FILE
结构体的内存。
示例代码
以下是一个简单的示例代码,展示了 _IO_FILE
结构体实例的创建和使用过程:
#include <stdio.h>int main() {// 打开文件,创建一个 _IO_FILE 结构体实例FILE *file = fopen("example.txt", "w");if (file == NULL) {perror("Failed to open file");return 1;}// 使用文件流进行写操作fprintf(file, "Hello, World!\n");// 关闭文件,销毁 _IO_FILE 结构体实例fclose(file);return 0;
}
在这个示例中,当调用 fopen
时,glibc 会创建并初始化一个 _IO_FILE
结构体实例。当调用 fclose
时,glibc 会销毁这个实例并释放相关资源。
_IO_FILE
结构体
在 Linux 系统中,_IO_FILE
结构体是 GNU C Library (glibc) 中实现标准 I/O (stdio) 的核心数据结构之一。它用于描述文件流(FILE*)的内部状态和缓冲区信息。理解 _IO_FILE
结构体对于某些高级的漏洞利用技术(如利用格式字符串漏洞或缓冲区溢出漏洞)非常重要。
以下是 _IO_FILE
结构体的一般布局(具体布局可能会随着 glibc 版本的不同而变化):
struct _IO_FILE {int _flags; // 文件流的状态标志char* _IO_read_ptr; // 缓冲区读取指针char* _IO_read_end; // 缓冲区读取结束指针char* _IO_read_base; // 缓冲区读取基地址char* _IO_write_base; // 缓冲区写入基地址char* _IO_write_ptr; // 缓冲区写入指针char* _IO_write_end; // 缓冲区写入结束指针char* _IO_buf_base; // 缓冲区基地址char* _IO_buf_end; // 缓冲区结束地址char *_IO_save_base; // 保存的缓冲区基地址char *_IO_backup_base; // 备份的缓冲区基地址char *_IO_save_end; // 保存的缓冲区结束地址struct _IO_marker *_markers; // 标记链表struct _IO_FILE *_chain; // 文件流链表int _fileno; // 文件描述符int _flags2; // 额外的标志__off_t _old_offset; // 旧的偏移量unsigned short _cur_column;// 当前列号signed char _vtable_offset;// 虚表偏移char _shortbuf[1]; // 短缓冲区_IO_lock_t *_lock; // 锁__off64_t _offset; // 偏移量void *__pad1; // 填充void *__pad2; // 填充void *__pad3; // 填充void *__pad4; // 填充size_t __pad5; // 填充int _mode; // 模式char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];// 未使用的填充
};
关键字段
- _flags: 用于描述文件流的状态标志,例如是否为读模式、写模式等。
- _IO_read_ptr, _IO_read_end, _IO_read_base: 分别指向当前读取的位置、读取的结束位置和读取缓冲区的基地址。
- _IO_write_base, _IO_write_ptr, _IO_write_end: 分别指向当前写入的位置、写入的结束位置和写入缓冲区的基地址。
- _IO_buf_base, _IO_buf_end: 分别指向缓冲区的基地址和结束地址。
- _IO_save_base, _IO_backup_base, _IO_save_end: 用于保存缓冲区状态的指针。
- _markers: 指向标记结构的链表,用于支持多种流操作。
- _chain: 指向下一个文件流的指针,形成一个文件流链表。
- _fileno: 文件描述符。
- _flags2: 额外的标志位。
- _old_offset: 用于记录偏移量。
- _cur_column: 当前列号,主要用于格式化输出。
- _vtable_offset: 虚表偏移,用于支持面向对象的操作。
- _shortbuf: 一个短缓冲区。
- _lock: 指向用于同步的锁。
- _offset: 文件流的位置偏移量。
- 填充字段: 用于对齐和扩展。
stdin
、stdout
和 stderr
指针
这些指针是程序的标准输入、标准输出和标准错误流(stdin
、stdout
和 stderr
)在内存中的地址。它们是全局变量,通常在程序启动时被初始化,以指向相应的 FILE
结构体。
解释每个指针
-
stdout
(标准输出)- 地址:
0x602020
- 指向的地址:
0x00007fe6e8e03620
- 地址:
-
stdin
(标准输入)- 地址:
0x602030
- 指向的地址:
0x00007fe6e8e028e0
- 地址:
-
stderr
(标准错误)- 地址:
0x602040
- 指向的地址:
0x00007fe6e8e03540
- 地址:
每个地址如 0x602020
是全局变量的地址,而对应的值(如 0x00007fe6e8e03620
)是这些全局变量指向的 FILE
结构体实例的地址。
内存布局和用途
-
stdout
:- 地址:
0x602020
- 指向的地址:
0x00007fe6e8e03620
- 用途:标准输出通常用于打印普通输出信息,默认连接到终端的显示设备。
- 地址:
-
stdin
:- 地址:
0x602030
- 指向的地址:
0x00007fe6e8e028e0
- 用途:标准输入用于读取输入数据,默认连接到终端的键盘输入。
- 地址:
-
stderr
:- 地址:
0x602040
- 指向的地址:
0x00007fe6e8e03540
- 用途:标准错误用于打印错误信息,默认也连接到终端的显示设备。
- 地址:
背后的机制
在程序启动时,C 标准库(如 glibc)会初始化这几个标准流。具体来说,它们会分配相应的 FILE
结构体,并将 stdin
、stdout
和 stderr
这些全局变量指向这些结构体。
以下是一个简化的示意图,展示了这些指针和 FILE
结构体的关系:
+----------------+ +----------------+
| 0x602020 | --------> | FILE for stdout|
| (stdout) | | 0x00007fe6e8e03620 |
+----------------+ +----------------++----------------+ +----------------+
| 0x602030 | --------> | FILE for stdin |
| (stdin) | | 0x00007fe6e8e028e0 |
+----------------+ +----------------++----------------+ +----------------+
| 0x602040 | --------> | FILE for stderr|
| (stderr) | | 0x00007fe6e8e03540 |
+----------------+ +----------------+
示例代码验证
下面是一些示例代码,可以用来验证这些指针的地址:
#include <stdio.h>int main() {printf("Address of stdout: %p\n", (void*)&stdout);printf("Address of stdin: %p\n", (void*)&stdin);printf("Address of stderr: %p\n", (void*)&stderr);printf("Pointer value of stdout: %p\n", (void*)stdout);printf("Pointer value of stdin: %p\n", (void*)stdin);printf("Pointer value of stderr: %p\n", (void*)stderr);return 0;
}
运行这段代码,你应该会看到标准流指针的地址和它们指向的 FILE
结构体的地址,这与你提供的内存地址应该是一致的。
总结
这些指针(stdout
、stdin
和 stderr
)是全局变量,指向标准 I/O 流的 FILE
结构体实例。这些实例在程序启动时由 C 标准库初始化,用于管理标准输入、输出和错误流。
相关文章:
CTF-PWN: 什么是_IO_FILE?
重要概念:fopen()返回的是一个结构体的指针 _IO_FILE 结构体在什么时候被创建? _IO_FILE 结构体的实例是在程序使用标准 I/O 函数(如 fopen、fclose、fread、fwrite 等)时创建和管理的。这个结构体实际上是 GNU C Library (glibc) 用于处理…...
前端八股文第二篇
11.事件循环 事件循环(Event Loop)是 JavaScript 运行时中的一种机制,用于处理异步操作和事件驱动的编程。在浏览器环境中,事件循环是指浏览器通过事件队列(Event Queue)来管理和调度异步任务的执行顺序。…...
springboot汽车保修服务管理系统-计算机毕业设计源码00052
摘 要 随着汽车数量的不断增加和汽车保修服务需求的日益增长,建立一套高效的汽车保修服务管理系统变得至关重要。基于Spring Boot框架的汽车保修服务管理系统旨在整合汽车保修流程,简化管理流程,提高服务质量和用户体验未来,我们将…...
分布式架构搭建博客网站
目录 运行环境基础配置需求准备工作配置静态ip修改主机名及host映射开启防火墙时间同步配置免密ssh登录 环境搭建Server-Web端安装LNMP环境软件Server-NFS-DNS端上传博客软件Server-NFS-DNS端设置NFS共享Server-Web设置挂载远程共享目录nginx设置在数据库中创建数据库和用户重启…...
python-opencv给图片或视频去水印
文章目录 引言inpaint函数的使用方法鼠标事件回调函数cv2.setMouseCallback介绍去水印步骤实现代码 引言 本文主要基于cv2.inpaint函数实现图片的水印去除。 inpaint函数基于图像修复算法,通过对缺陷区域周围像素的分析和插值,生成合适的像素值来填充缺…...
免费送源码:Java+ssm+Springboot Springboot手办定制销售系统 计算机毕业设计原创定制
Springboot手办定制销售系统 摘 要 随着人们生活水平的提高和互联网的发展,人们消费思想和消费方式的逐渐改变,使得消费者开始追求自身品味和个性。手办定制就是在这种条件下应运而生。手办定制是基于客户需求来定制产品,满足客户对其功能、结…...
卡夫卡的使用
关于消息队列的使用 一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveM…...
mac|maven项目在idea中连接redis
安装maven brew install maven idea-setting导入redis插件 idea新建maven项目 构建系统选择maven 项目右侧数据库图标导入redis 新建一个数据库,名称必须为数字,测试一下是否可以连接,连接成功后选择确定 pom.xml导入redis <depende…...
Python基础学习------第一天
print("hello world") 1.括号和引号,必须使用的是英文 被双引号包围起来的称为字符串。 python注释:单行注释:1.井号# 2.多行注释 :""" """ print输出多个内容是中间用逗号隔开就好…...
MySQL的SQL语句之触发器和存储过程的应用
触发器 Trigger 一.触发器 作用:当检测到某种数据表发生数据变化时,自动执行操作,保证数据的完整性。 1.创建一个触发器 如上图所示,查看这个create的帮助信息的时候,这个create trigger就是创建触发器的意思。 如…...
【MD5】密码加密之加盐算法
哈喽,哈喽,大家好~ 我是你们的老朋友:保护小周ღ 本期主要是给大家分析一下, 密码的如果加密存储的, 学习加盐算法的思想, 通过一个简单的案例, 即可快速学习. 一起来看看叭~ 适用于编程初学者,感兴趣的朋友们可以订阅&…...
服务器虚拟化
前言 服务器虚拟化是一种技术,它通过将一台物理服务器的软件环境分割成多个独立分区,使每个分区都能模拟出一台完整的虚拟服务器。这种技术利用虚拟化技术充分发挥服务器的硬件性能,提高运营效率,节约能源并降低经济成本。 通过…...
贪心算法理论基础和习题【算法学习day.17】
前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…...
爬虫ip技术未来发展趋势
各位朋友,大家好!有伙伴问爬虫技术未来会有更好的发展么,那今天小蝌蚪来跟大家聊聊爬虫技术未来的发展趋势分享一下行业咨询。 大家在日常工作和生活中,都希望事情能更省心、高效吧?未来的爬虫技术就朝着这个方向发展…...
推荐一款功能强大的文字处理工具:Atlantis Word Processor
Atlantis word proCEssor是一款功能强大的文字处理工具。该软件可以让用户放心的去设计文档,并且软件的界面能够按用户的意愿去自定义,比如工具栏、字体选择、排版、打印栏等等,当然还有更多的功能,比如你还可以吧软件界面中的任何…...
语言≠思维,大模型学不了推理:一篇Nature让AI社区炸锅了
转自:机器之心 大语言模型(LLM)为什么空间智能不足,GPT-4 为什么用语言以外的数据训练,就能变得更聪明?现在这些问题有 「标准答案」了。 近日,一篇麻省理工学院(MIT)等…...
Ubuntu 安装 npm
1. 升级apt sudo apt-get update 2. 安装nodejs sudo apt install nodejs 3. 安装npm sudo apt-get install npm 4. 查看版本 node -v npm -v 完成安装!...
Go:package
文章目录 标准库概述regexp包锁和sync包自定义包和可见性基本格式导入外部安装包包的初始化 自定义包使用godoc自定义包的目录结构 标准库概述 在之前的部分已经用了很多和标准库有关的内容,比如有fmt,os这种功能 unsafe: 包含了一些打破 Go 语言“类型…...
大数据之微服务注册、发现与熔断方案
大数据微服务注册、发现与熔断方案 介绍实现框架利用Spring Cloud实现微服务注册,发现,熔断实例? 一,介绍 大数据微服务注册、发现与熔断是微服务架构中的关键概念,它们各自在微服务架构中扮演着重要的角色。以下是对这…...
最新出炉!2024年邮件营销平台综合盘点
随着数字化营销的不断发展,邮件营销依然是企业与客户保持联系的重要渠道之一。2024年,邮件营销平台市场竞争激烈,各大平台纷纷推出新功能,以满足企业日益增长的需求。在众多平台中,Zoho Campaigns作为一款成熟的邮件营…...
Qgis 开发初级 《ToolBox》
Qgis 有个ToolBox 的,在Processing->ToolBox 菜单里面,界面如下。 理论上Qgis这里面的工具都是可以用脚本或者C 代码调用的。界面以Vector overlay 为例子简单介绍下使用方式。Vector overlay 的意思是矢量叠置分析,和arcgis软件类似的。点…...
Apache HttpClient 和 OkHttpClient 的使用
概述 Apache HttpClient Apache HttpClient是一个开源的HTTP客户端库,提供了丰富的HTTP通信功能。它支持HTTP/1.1和HTTPS协议,具有连接池管理、重试机制、代理设置等高级特性。HttpClient的API设计虽然相对繁琐,但提供了高度的可配置性和灵…...
文本列的性能优化?深入Oracle全文索引
一.什么是全文索引? 全文索引通过分析和处理文本,将文档中的单词分解为词条(tokens),然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录,而不必对所有文本逐字匹配。 二…...
GoogleChrome和Edge浏览器闪屏问题
GoogleChrome和Edge浏览器闪屏问题 文章目录 GoogleChrome和Edge浏览器闪屏问题 买了电脑半年, GoogleChrome和edge浏览器出现了一个令人头疼的问题–闪屏, 就是打开这两个浏览器之后, 就会出现电脑屏幕一闪一闪的, 过一会就看不见了, 跟黑夜里的闪电一样, 遇到这种情况我都会直…...
【设计模式系列】迭代器模式(七)
一、什么是迭代器模式 迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供一种方法来顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中,这样…...
Go性能基础
本篇内容是根据2020年2月份#117 Foundations of Go performance音频录制内容的整理与翻译 在这个多部分系列的第一部分中,Ian 和 Johnny 以及 Miriah Peterson 和 Bryan Boreham 一起揭开了 Go 程序性能的第一层重要内容。 过程中为符合中文惯用表达有适当删改, 版…...
银河麒麟v10安装Anaconda(python大蟒蛇)+pycharm安装
Anaconda中文是大蟒蛇,是一个用于科学计算的Python发行版,预装大量的模块包,不需要单独下载python进行安装 1安装环境 1.1系统版本 操作系统版本:银河麒麟桌面版操作系统v10(SP1) 版本号:2303 架构:x86…...
集群聊天服务器——逻辑梳理
网络聊天服务器项目,该项目分为4个模块: 首先是网络模块:我使用了muduo高性能网络库,解耦合网络与业务之间这两部分代码,可以更加专注与业务的功能开发其次是服务层模块:我使用了基于C11的技术比如绑定器和…...
10 最长回文子串、买卖股票的最好时机(一)、[NOIP2002 普及组] 过河卒24_10_30
这里写目录标题 cpp 101 最长回文子串1.1 题目1.2 思路1.3 程序实现 2 买卖股票的最好时机(一)2.1 题目2.2 思路2.3 程序实现2.4 程序实现 – 优化 3 [NOIP2002 普及组] 过河卒3.1题目3.2 思路3.3程序实现 – dp 4 题目链接 cpp 10 1 最长回文子串 1.1 题目 1.2 思路 读完了…...
Handler、Looper、message进阶知识
Android Handler、Looper、Message的进阶知识 在Android开发中,Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用,尤其是在高并发和UI性能优化中,可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…...
做百度手机网站快速排/广州seo外包
我有一个表,其中包含名为timestamp的列,该列以秒为单位存储记录的创建日期时间(使用strtotime()从Date()转换datetime值).我需要获取创建日期大于72小时的记录,以便删除这些记录.我的表包含以下列:userid(int)timestamp(storing created dates in seconds)eg:142788…...
武汉模板建站代理/如何推广网页
中文说明:专业增强版 文件名称:ProPlus2021Retail.img 下载地址:http://officecdn.microsoft.com/pr/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-cn/ProPlus2021Retail.img 中文说明:专业版 文件名称:Profession…...
机房管理软件/泰州seo网站推广
从应用平台来看,根据笔者多年的经验,可以把回声消除分为两大类:基于DSP等实时平台的回声消除技术和基于Windows等非实时平台的回声消除技术。两者的技术难度和重点是不一样的。三、基于DSP平台的回声消除技术回声消除技术传统的应用领域是各种…...
深圳网站开发antnw/南宁seo服务优化
首先来看,jquery里自带的,和json相关的函数:1.$.parseJSON : 用来解析JSON字符串,返回一个对象。什么叫“JSON字符串”?比如:var a{name:"aijquery",url:"www.aijquery.cn"};上面定义的变量a是…...
asp.net做网站源代码/站长统计app官方网站
来源:fhods Blog作者:fhod 小财说明:文章已发表于***手册07年10期,转载请注明出处!对明小子QQ密码特工软件的分析 ----小财今天无聊给一朋友讲解QQ盗取原理,从网上找了一个工具 “明小子QQ密码特工”结果发…...
博敏 网站开发/常见搜索引擎有哪些
前言 mysql肯定不是只有简简单单的CURD,当然CURD才是数据库的核心功能 但是在基础的功能之上,我们能做的就是如何去优化他,而索引就是优化查询的一个重要知识点 下面这一句索引无关 我觉得下面的图让我很快的理解的jion的使用以及定义 7种j…...