IO_FILE——leak 任意读

2024-08-31 14:08
文章标签 file io 任意 leak

本文主要是介绍IO_FILE——leak 任意读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475
在堆题没有show函数时,我们可以用 IO_FILE 进行leak,本文就记录一下如何实现这一手法。

拿一个输出函数 puts 来说,它在源码里的表现形式为 _IO_puts 。

\_IO\_puts (const char *str)
{int result = EOF;\_IO\_size\_t len = strlen (str);\_IO\_acquire\_lock (\_IO\_stdout);if ((\_IO\_vtable\_offset (\_IO\_stdout) != 0|| \_IO\_fwide (\_IO\_stdout, -1) == -1)&& \_IO\_sputn (\_IO\_stdout, str, len) == len&& \_IO\_putc\_unlocked ('\n', \_IO\_stdout) != EOF)result = MIN (INT\_MAX, len + 1);\_IO\_release\_lock (\_IO\_stdout);return result;
}

我们可以看到 _IO_puts 又调用了一个叫 _IO_sputn 的函数。

#define \_IO\_sputn(\_\_fp, \_\_s, \_\_n) \_IO\_XSPUTN (\_\_fp, \_\_s, \_\_n)

它是一个宏,它的作用就是调用 _IO_2_1_stdout_ 里 vtable 所指向的 _IO_XSPUTN,也就是 _IO_new_file_xsputn

\_IO\_size\_t
\_IO\_new\_file\_xsputn (\_IO\_FILE *f, const void *data, \_IO\_size\_t n)
{const char *s = (const char *) data;\_IO\_size\_t to\_do = n;int must\_flush = 0;\_IO\_size\_t count = 0;............else if (f->\_IO\_write\_end > f->\_IO\_write\_ptr)count = f->\_IO\_write\_end - f->\_IO\_write\_ptr; /* Space available. *//* Then fill the buffer. */if (count > 0){
............if (\_IO\_OVERFLOW (f, EOF) == EOF)

当 f->_IO_write_end > f->_IO_write_ptr 时,会调用 memcpy 拷贝数据至缓冲区。之后还会判断目标输出数据是否还有剩余。如果还有剩余就要调用 _IO_OVERFLOW 函数,刷新缓冲区。这个函数在 vtable 中为 _IO_overflow ,也就是 _IO_new_file_overflow 。

int
\_IO\_new\_file\_overflow (\_IO\_FILE *f, int ch)
{if (f->\_flags & \_IO\_NO\_WRITES) /* SET ERROR */{f->\_flags |= \_IO\_ERR\_SEEN;\_\_set\_errno (EBADF);return EOF;}/* If currently reading or no buffer allocated. */if ((f->\_flags & \_IO\_CURRENTLY\_PUTTING) == 0 || f->\_IO\_write\_base == NULL){/* Allocate a buffer if needed. */if (f->\_IO\_write\_base == NULL){\_IO\_doallocbuf (f);\_IO\_setg (f, f->\_IO\_buf\_base, f->\_IO\_buf\_base, f->\_IO\_buf\_base);}/* Otherwise must be currently reading.If \_IO\_read\_ptr (and hence also \_IO\_read\_end) is at the buffer end,logically slide the buffer forwards one block (by setting theread pointers to all point at the beginning of the block). Thismakes room for subsequent output.Otherwise, set the read pointers to \_IO\_read\_end (leaving thatalone, so it can continue to correspond to the external position). */if (\_\_glibc\_unlikely (\_IO\_in\_backup (f))){size\_t nbackup = f->\_IO\_read\_end - f->\_IO\_read\_ptr;\_IO\_free\_backup\_area (f);f->\_IO\_read\_base -= MIN (nbackup,f->\_IO\_read\_base - f->\_IO\_buf\_base);f->\_IO\_read\_ptr = f->\_IO\_read\_base;}if (f->\_IO\_read\_ptr == f->\_IO\_buf\_end)f->\_IO\_read\_end = f->\_IO\_read\_ptr = f->\_IO\_buf\_base;f->\_IO\_write\_ptr = f->\_IO\_read\_ptr;f->\_IO\_write\_base = f->\_IO\_write\_ptr;f->\_IO\_write\_end = f->\_IO\_buf\_end;f->\_IO\_read\_base = f->\_IO\_read\_ptr = f->\_IO\_read\_end;f->\_flags |= \_IO\_CURRENTLY\_PUTTING;if (f->\_mode <= 0 && f->\_flags & (\_IO\_LINE\_BUF | \_IO\_UNBUFFERED))f->\_IO\_write\_end = f->\_IO\_write\_ptr;}if (ch == EOF)return \_IO\_do\_write (f, f->\_IO\_wr

这篇关于IO_FILE——leak 任意读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124122

相关文章

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode