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

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Open a folder or workspace... (File -> Open Folder)

问题:vscode Open with Live Server 时 显示Open a folder or workspace... (File -> Open Folder)报错 解决:不可以单独打开文件1.html ; 需要在文件夹里打开 像这样

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

JavaEE-文件操作与IO

目录 1,两种路径 二,两种文件 三,文件的操作/File类: 1)文件系统操作 File类 2)文件内容操作(读文件,写文件) (1)打开文件 (2)关闭文件 (3)读文件/InputStream (4)写文件/OutputStream (5)读文件/reader (6)写文件/writer (7)Scanner 四,练习: 1,两种路径 1)绝对路径

bash: arm-linux-gcc: No such file or directory

ubuntu出故障重装了系统,一直用着的gcc使用不了,提示bash: arm-linux-gcc: No such file or directorywhich找到的命令所在的目录 在google上翻了一阵发现此类问题的帖子不多,后来在Freescale的的LTIB环境配置文档中发现有这么一段:     # Packages required for 64-bit Ubuntu

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod