首页 > 其他分享 >PWN系列-初探IO

PWN系列-初探IO

时间:2024-05-23 13:08:29浏览次数:13  
标签:__ 文件 FILE char 缓冲区 IO 初探 PWN

PWN系列-初探IO

记录一下自己理解的IO,文章的代码均是glibc-2.23版本下的代码。

由于笔者才疏学浅,学识有限,文章中难免会有疏漏和错误之处,恳请各位师傅批评指正,多多包涵。

什么是IO

IO中的I其实就是in,O其实就是out,一个输入,一个输出。

IO长什么样子

_IO_FILE_plus

首先先来认识一下_IO_FILE_plus结构体

struct _IO_FILE_plus
{
  _IO_FILE file;  /* 基础的文件结构体 */
  const struct _IO_jump_t *vtable;  /* 虚表指针 */
};

总结起来,_IO_FILE_plus 结构体通过包含 _IO_FILE 结构体和一个虚表指针。

_IO_FILE

_IO_FILE结构体定义:

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;                 /* 文件描述符 */
#if 0
  int _blksize;                /* 块大小 */
#else
  int _flags2;                 /* 额外标志 */
#endif
  _IO_off_t _old_offset;       /* 旧的偏移量 */
#if defined _G_IO_IO_FILE_VERSION && _G_IO_IO_FILE_VERSION == 0x20001
  unsigned short _cur_column;  /* 当前列号 */
  signed char _vtable_offset;  /* 虚表偏移量 */
  char _shortbuf[1];           /* 短缓冲区 */
#endif
  _IO_lock_t *_lock;           /* 锁 */
#if defined _LIBC_REENTRANT
  _IO_lock_t *_lock_owner;     /* 锁的拥有者 */
  unsigned int _lock_count;    /* 锁计数 */
#endif
  _IO_off64_t _offset;         /* 偏移量 */
  void *__pad1;                /* 填充1 */
  void *__pad2;                /* 填充2 */
  void *__pad3;                /* 填充3 */
  void *__pad4;                /* 填充4 */
  size_t __pad5;               /* 填充5 */
  int _mode;                   /* 模式 */
  char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
                               /* 未使用的填充空间 */
};

此结构体定义了标准C库中用于文件操作的内部数据结构。以下是每个成员变量的简要说明:

  • _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: 当前的文件偏移量。
  • __pad1, __pad2, __pad3, __pad4: 用于填充的指针,确保结构体对齐。
  • __pad5: 用于填充的大小。
  • _mode: 文件模式。
  • _unused2: 未使用的填充空间,用于确保结构体的大小和对齐。

_IO_jump_t

struct _IO_jump_t 定义如下:

struct _IO_jump_t
{
  size_t __dummy; 
  size_t __dummy2;
  _IO_finish_t __finish;
  _IO_overflow_t __overflow;
  _IO_underflow_t __underflow;
  _IO_underflow_t __uflow;
  _IO_pbackfail_t __pbackfail;
  _IO_xsputn_t __xsputn;
  _IO_xsgetn_t __xsgetn;
  _IO_seekoff_t __seekoff;
  _IO_seekpos_t __seekpos;
  _IO_setbuf_t __setbuf;
  _IO_sync_t __sync;
  _IO_doallocate_t __doallocate;
  _IO_read_t __read;
  _IO_write_t __write;
  _IO_seek_t __seek;
  _IO_close_t __close;
  _IO_stat_t __stat;
  _IO_showmanyc_t __showmanyc;
  _IO_imbue_t __imbue;
};

这些字段是指向不同函数类型的指针,用于实现多态性和灵活的文件操作。以下是这些函数指针的大致功能说明:

  • __finish: 完成流的操作。
  • __overflow: 处理输出缓冲区溢出的操作。
  • __underflow: 处理输入缓冲区空的操作。
  • __uflow: 处理输入缓冲区下溢的操作。
  • __pbackfail: 处理向输入缓冲区放回字符失败的操作。
  • __xsputn: 写入多个字符的操作。
  • __xsgetn: 读取多个字符的操作。
  • __seekoff: 相对偏移位置的文件定位操作。
  • __seekpos: 绝对位置的文件定位操作。
  • __setbuf: 设置缓冲区的操作。
  • __sync: 同步文件缓冲区的操作。
  • __doallocate: 分配缓冲区的操作。
  • __read: 读取数据的操作。
  • __write: 写入数据的操作。
  • __seek: 文件定位的操作。
  • __close: 关闭文件的操作。
  • __stat: 获取文件状态的操作。
  • __showmanyc: 显示字符数的操作。
  • __imbue: 设置区域设置信息的操作。

_IO_list_all

_IO_list_all 是一个全局变量,在 GNU C 库(glibc)中用于管理所有打开的文件流。它是一个指向 _IO_FILE 结构体链表的指针。通过这个链表,glibc 可以跟踪和操作所有当前打开的文件流。

链表结构

_IO_list_all 是一个指向 _IO_FILE 结构体的指针,而 _IO_FILE 结构体本身包含一个 _chain 指针,指向下一个文件流。因此,所有打开的文件流形成了一个链表。这个链表的头部是 _IO_list_all

作用

  • 管理文件流: 通过维护这个链表,glibc 能够方便地管理所有打开的文件流。每当有新的文件流创建时,会将其添加到链表中;当文件流关闭时,会将其从链表中移除。
  • 文件操作: 许多内部文件操作函数,例如刷新所有文件流、关闭所有文件流等,都需要遍历这个链表,以对每个文件流执行相应的操作。

IO的利用思路

IO利用的大致思路都是构造fake_io结构体,布置一些数据和函数,通过程序正常的执行流程走到IO操作来劫持程序流来getshell。

image-20240523122431321

这就是我目前所认识的IO,IO涉及到很多攻击手法,我应该会另写一篇文章来进行记录各种板子。

这篇文章中的图片来源两位师傅的博客,但是我一下子找不到这两位师傅的博客地址了,故没有在文章末尾添加参考文章,先冒昧的直接拿来了,望见谅。

标签:__,文件,FILE,char,缓冲区,IO,初探,PWN
From: https://www.cnblogs.com/xiaochange/p/18208179

相关文章

  • 【解决方案】VMware Fusion启动报错:无法将“Ethernet0”连接到虚拟网络“:dev:vmnet8
    ✨报错提示✨解决方案使用ifconfig-a查找后的确没有该虚拟网卡参考下文问题排查过程M1安装VMwareFusion13后无法连接虚拟网络/dev/vmnet8问题解决-知乎(zhihu.com)最终解决方案如下:卸载VMwareFusion关闭Clash/ClashPro增强模式重新安装VMwareFusion✨参考及......
  • SpringBoot整合minio服务(超详细)
    一、使用docker部署minio1、拉取镜像dockerpullminio/minio2、创建目录mkdir-p/home/minio/configmkdir-p/home/minio/data3、创建Minio容器并运行dockerrun-p9000:9000-p9090:9090\--net=host\--nameminio\-d--restart=always\-e"MINIO_A......
  • SpringBoot设置Session失效时间
    springboot的yml文件中设置session的过期时间#Session超时时间设置,单位是秒,默认是30分钟servlet:session:timeout:3600s当过期时间是大于1分钟的时候是没有什么问题的,但是如果设置过期时间小于1分钟,就会失效。servlet:session:timeout:10......
  • VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 标准版和厂商定制版
    VMwareESXi8.0U2cmacOSUnlocker&OEMBIOS标准版和厂商定制版ESXi8.0U2标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)OEM定制版、Huawei(华为)定制版请访问原文链接:https://sysin.org......
  • VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动
    VMwareESXi8.0U2cmacOSUnlocker&OEMBIOS集成网卡驱动和NVMe驱动(集成驱动版)发布ESXi8.0U2集成驱动版,在个人电脑上运行企业级工作负载请访问原文链接:https://sysin.org/blog/vmware-esxi-8-u2-sysin/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org202......
  • 解决postgres数据库remaining connection slots are reserved for non-replication su
    来源:【小工具】-解决postgres数据库remainingconnectionslotsarereservedfornon-replicationsuperuserconnectio-CSDN博客psycopg2.OperationalError:FATAL:remainingconnectionslotsarereservedfornon-replicationsuperuserconnection报错信息Traceback......
  • union存取低高位
    联合体类型,变量成员共用同一内存,同一时刻只能保存一个成员的数据。以1个4字节数据,传递r\g\b为例#include<stdint.h>#include<iostream>intmain(){uint32_tmyV;//用于模拟值传递//写{union{struct{......
  • FSMO(Flexible Single Master Operation)
    首先,ActiveDirectory是集中式存储库(centralrepository),其中存储企业中的所有对象及其各自的属性。它是一个分层(hierarchical)多主(Multi-master)模型的数据库。无论域控制器(DC)联网与否,都可以在企业中任意给定的DC上处理对数据库的更改。这当中,[多主]意味着可......
  • Vue搭建移动端h5项目(已开源,附带git地址)Vant+Vue Router+Vuex+axios封装+案例交互+部分
    一、项目介绍以及项目地址             项目介绍:vue2搭建。项目通过amfe-flexible与postcss-pxtorem实现移动端适配;通过Vantui作为项目的组件库;通过Vuex管理数据状态,进行模块化管理;通过VueRouter配置项目路由,进行模块化管理;封装axios进行数据的请求,以及一些页......
  • Semantic Kernel入门系列:利用Handlebars创建Prompts functions
    引言本章我们将学习通过HandlebarsPromptsTemplate来创建Promptsfunctions。什么是Handlebars?Handlebars是一个流行的JavaScript模板引擎,它允许你通过在HTML中使用简单的占位符来创建动态的HTML。它使用模板和输入对象来生成HTML或其他文本格式。Handlebars模板看......