`

FILE指针结构,glibc

阅读更多

在glibc中,gdb core调试,显示FILE*指针内容(FILE写出现了core文件)

 

$1 = {_flags = 107276440, _IO_read_ptr = 0x3000000018 <Address 0x3000000018 out of bounds>, _IO_read_end = 0x2aea0006e9a0 "痍\006", 

  _IO_read_base = 0x2aea0006e8e0 "痍2045", _IO_write_base = 0x53305239 <Address 0x53305239 out of bounds>, 

  _IO_write_ptr = 0x35343032eaf0 <Address 0x35343032eaf0 out of bounds>, _IO_write_end = 0x2aea0006e9b0 "-", _IO_buf_base = 0x2aea0006e9f0 "[2014-03-24][23:41:45]", 

  _IO_buf_end = 0x2aea0006eaf0 "adfbc"..., _IO_save_base = 0x2 <Address 0x2 out of bounds>, _IO_backup_base = 0x2 <Address 0x2 out of bounds>, 

  _IO_save_end = 0x2aea000819c0 "\300\t\004", _markers = 0x0, _chain = 0x3, _fileno = 107625062, _flags2 = 56, _old_offset = 47184511166896, _cur_column = 59792, 

  _vtable_offset = 6 '\006', _shortbuf = "", _lock = 0x7fff599c0590, _offset = 5052268, __pad1 = 0x2aea0006e980, __pad2 = 0x2aea0006e9b0, __pad3 = 0x2aea0006ea18, 

  __pad4 = 0x2d26da68, __pad5 = 32, _mode = 453104, _unused2 = "\352*\000\000@\352\006\000\352*\000\000伴\006\000\352*\000"}

 

 

可以看到_IO_write_base 错误,因此该文件指针FILE已经被破坏。所以会出现segment fault错误。

通常_IO_write_base  与_IO_read_base都指向同一区域。

表示当前缓冲区的基地址。

 

0x2aea0006e9a0-0x2aea0006e8e0  = C0 = 192字节

 

下面这段程序打印地址:

 

#include <stdio.h>

#include <stdlib.h>

int main(int argc,char* argv[])

{

    FILE *fp = fopen("test.txt","w");

    char s[32]={0};

    for(int i=0;i<100;i++)

    {

        sprintf(s,"%d=now\n",i);

 

        fprintf(fp,"%s",s);

        fprintf(fp,"_IO_read_base=%x\n",fp->_IO_read_base);

        fprintf(fp,"_IO_write_base=%x\n",fp->_IO_write_base);

        fprintf(fp,"_IO_buf_base=%x\n",fp->_IO_buf_base);

    }

    fclose(fp);

return 0;

}

 

 程序输出:

94=now

_IO_read_base=2315d000

_IO_write_base=2315d000

_IO_buf_base=2315d000

95=now

_IO_read_base=2315d000

_IO_write_base=2315d000

_IO_buf_base=2315d000

96=now

_IO_read_base=2315d000

_IO_write_base=2315d000

_IO_buf_base=2315d000

97=now

_IO_read_base=2315d000

_IO_write_base=2315d000

_IO_buf_base=2315d000

98=now

_IO_read_base=2315d000

_IO_write_base=2315d000

_IO_buf_base=2315d000

99=now

_IO_read_base=2315d000

_IO_write_base=2315d000

_IO_buf_base=2315d000

分享到:
评论

相关推荐

    House of apple 一种新的glibc中IO攻击方法.doc

    最后会遍历_IO_list_all 存放的每一个 IO_FILE 结构体,如果满足条件的话,会调用每个结构体中 vtable-&gt;_overflow 函数指针指向的函数。 使用 largebin attack 可以劫持_IO_list_all 变量,将其替换为伪造的 IO_...

    强网杯2022 pwn 赛题解析.docx

    在本题中,攻击者通过精心设计的内存操作,将_IO_FILE结构的指针篡改为攻击者控制的地址,从而达到执行任意代码的目的。 3. **攻击步骤** - 首先,分配一个大块内存[p1],再分配一个稍小的内存[p2],以防止内存...

    【技术分享】house of pig一个新的堆利用详解 .pdf

    此攻击方法适用于glibc 2.31及其后的版本,利用了其中的大型bin攻击(largebin attack)、FILE结构以及tcache stashing unlink攻击的组合。在某些特定情况下,即程序仅使用calloc分配内存而没有使用malloc,House of...

    glib-2.0.7.tar.gz

    2. **内存管理**:GLib的内存管理功能包括动态内存分配函数(g_malloc, g_free等)和智能指针(GPtrArray, GBoxed, GObject等),这些工具确保了程序在内存使用上的安全性和效率。 3. **线程支持**:GLib提供了线程...

    【技术分享】从puts函数执行角度看_IO_FILE的使用 .pdf

    在puts函数执行过程中,它会通过_glibc的I/O函数进行工作,例如,通过`_IO_file_xsputn`函数处理字符串的长度和输出。如果puts的参数是一个空字符串或者长度为零,那么根据`_IO_OVERFLOW`标志位的判定,可能不会触发...

    Linux_C-.zip_gun

    4. **文件操作(File Handling)**:通过`fopen`、`fclose`、`fread`、`fwrite`等函数,可以实现对磁盘文件的读写操作。同时,学会错误处理和流的概念也很重要。 5. **进程控制(Process Control)**:Linux提供了...

    在linux系统下使用C语言操作临时文件

    在 glibc 2.0.6 及其更早的 glibc 库中,mkstemp 函数创建的文件的访问权限是 0666,而在 glibc 2.0.7 及其更晚的库中,mkstemp 函数创建的文件的访问权限是 0600。 tmpfile 函数是另一个处理临时文件的函数,该...

    Linux下对临时文件的操作之mkstemp.docx

    `tmpfile`函数的返回值是一个指向文件的指针,失败时返回NULL。 ```c FILE *tmpfile(void); ``` 然而,对于`mktemp`、`tmpnam`和`tempnam`这些函数,由于它们在安全性和健壮性方面的不足,通常不推荐在现代编程中...

    getopt windows实现

    这个函数接受一个选项结构数组,每个结构包含选项名、对应的单字符别名(如果有的话)以及一个指针,用于接收选项的值。它使得命令行接口更加易读且用户友好。 `getopt_long_only`则是`getopt_long`的一个变种,它...

    Linux系统编程相关.pdf

    Shell还提供了诸如lseek这类命令来改变文件指针位置,以及使用ioctl这类命令来对文件描述符进行控制。 内存管理方面,涉及到VFS(虚拟文件系统)的概念。VFS是文件系统的抽象层,允许不同的文件系统结构通过统一的...

    IDL函数总结(方便IDL函数的查询)

    - **指针**:支持循环引用和自引用数据结构。 6. **IEEE支持**: - **无穷大(Infinity)** - **缺失数据(NaN)** #### 四、文件输入输出 IDL提供了强大的文件读写功能,支持各种科学数据格式: - **科学数据...

    嵌入式linux开发的关键

    - **file_operations结构**:提供驱动程序的接口,如`open`、`release`、`read`、`write`和`ioctl`等,用于设备的打开、关闭、读写和命令发送。 以上就是嵌入式Linux开发的关键点,涵盖驱动的类型、内核模块的使用...

    GNU Linux应用程序开发

    理解这两种语言的基本语法、数据类型、控制结构、指针操作以及内存管理是开发的基础。 在Linux中,程序通常通过系统调用来与内核交互,例如打开文件、创建进程、进行网络通信等。系统调用是程序与操作系统之间的一...

Global site tag (gtag.js) - Google Analytics