在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
相关推荐
最后会遍历_IO_list_all 存放的每一个 IO_FILE 结构体,如果满足条件的话,会调用每个结构体中 vtable->_overflow 函数指针指向的函数。 使用 largebin attack 可以劫持_IO_list_all 变量,将其替换为伪造的 IO_...
在本题中,攻击者通过精心设计的内存操作,将_IO_FILE结构的指针篡改为攻击者控制的地址,从而达到执行任意代码的目的。 3. **攻击步骤** - 首先,分配一个大块内存[p1],再分配一个稍小的内存[p2],以防止内存...
此攻击方法适用于glibc 2.31及其后的版本,利用了其中的大型bin攻击(largebin attack)、FILE结构以及tcache stashing unlink攻击的组合。在某些特定情况下,即程序仅使用calloc分配内存而没有使用malloc,House of...
2. **内存管理**:GLib的内存管理功能包括动态内存分配函数(g_malloc, g_free等)和智能指针(GPtrArray, GBoxed, GObject等),这些工具确保了程序在内存使用上的安全性和效率。 3. **线程支持**:GLib提供了线程...
在puts函数执行过程中,它会通过_glibc的I/O函数进行工作,例如,通过`_IO_file_xsputn`函数处理字符串的长度和输出。如果puts的参数是一个空字符串或者长度为零,那么根据`_IO_OVERFLOW`标志位的判定,可能不会触发...
4. **文件操作(File Handling)**:通过`fopen`、`fclose`、`fread`、`fwrite`等函数,可以实现对磁盘文件的读写操作。同时,学会错误处理和流的概念也很重要。 5. **进程控制(Process Control)**:Linux提供了...
在 glibc 2.0.6 及其更早的 glibc 库中,mkstemp 函数创建的文件的访问权限是 0666,而在 glibc 2.0.7 及其更晚的库中,mkstemp 函数创建的文件的访问权限是 0600。 tmpfile 函数是另一个处理临时文件的函数,该...
`tmpfile`函数的返回值是一个指向文件的指针,失败时返回NULL。 ```c FILE *tmpfile(void); ``` 然而,对于`mktemp`、`tmpnam`和`tempnam`这些函数,由于它们在安全性和健壮性方面的不足,通常不推荐在现代编程中...
这个函数接受一个选项结构数组,每个结构包含选项名、对应的单字符别名(如果有的话)以及一个指针,用于接收选项的值。它使得命令行接口更加易读且用户友好。 `getopt_long_only`则是`getopt_long`的一个变种,它...
Shell还提供了诸如lseek这类命令来改变文件指针位置,以及使用ioctl这类命令来对文件描述符进行控制。 内存管理方面,涉及到VFS(虚拟文件系统)的概念。VFS是文件系统的抽象层,允许不同的文件系统结构通过统一的...
- **指针**:支持循环引用和自引用数据结构。 6. **IEEE支持**: - **无穷大(Infinity)** - **缺失数据(NaN)** #### 四、文件输入输出 IDL提供了强大的文件读写功能,支持各种科学数据格式: - **科学数据...
- **file_operations结构**:提供驱动程序的接口,如`open`、`release`、`read`、`write`和`ioctl`等,用于设备的打开、关闭、读写和命令发送。 以上就是嵌入式Linux开发的关键点,涵盖驱动的类型、内核模块的使用...
理解这两种语言的基本语法、数据类型、控制结构、指针操作以及内存管理是开发的基础。 在Linux中,程序通常通过系统调用来与内核交互,例如打开文件、创建进程、进行网络通信等。系统调用是程序与操作系统之间的一...