abuse file struct 阅读记录

搞file struct

angleboy大佬的博客阅读记录,下次看的时候不至于懵笔

fread比read更高层,read是最接近kernel的函数

_IO_FILE 大致分成三个部分

  1. flags
  2. stream buffer pointers
  3. _fileno:file discripter, reuturn by sys_open

_IO_FILE_plus, stdin, stderr, stdout,fopen的返回值都属于该结构
包括一个_IO_FILE结构体和_IO_jump_t*(指向虚表结构体的指针),任何的文件操作都是通过虚表
指针

_IO_list_all为链表头部,新打开的文件得到的filestruct放到头节点后面,后面依次是stderr, stdout, stdin

fopen步骤:

  1. malloc分配内存
  2. 初始化file struct
  3. 链接file struct
  4. 打开文件

fread步骤:

  1. 如果stream buffer为空则vtable->doallocate
  2. 读取数据到stream buffer(_IO_buf_base, _IO_buf_end)函数_IO_file_underflow
  3. 拷贝stream buffer内容到目标缓存区(_IO_read_ptr, _IO_read_end)函数_IO_file_xsgetn

fwrite工作流程:

  1. 如果stream buffer为空则vtable->doallocate
  2. 拷贝目标缓存区的stream bufffer,函数_IO_file_xsputn
  3. stream buffer写入文件

fclose工作流程:

  1. unlink file 结构体
  2. _IO_new_file_close_it(内部调用_IO_do_flush)释放stream buffer
  3. 关闭文件
  4. 释放结构体

_lock
1. _IO_lock_t*
2. 避免多线程race condition
3. 通常需要建立这样一个结构体

除了更改fopen获得的file struct外还可以搞stdin, stdout, stderr

FSOP

file-stream oriented programing

  1. 控制file struct链方式: _chain和_IO_list_all
  2. 搞事函数:_IO_flush_all_lockp(该函数不在虚表中),当glibc发生错误时会调用该函数,会遍历所有file struct链,调用_IO_OVERFLOW(vtable中)

vtable虚表验证(在house of orange中还没有出现),很难绕过

利用stream buffer和file descriptor

fwrite制造

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值