IO_FILE基础知识小结
IO_FILE知识
[toc]
IO_FILE基础知识供查阅
_IO_FILE结构体和对应起始处的偏移
1 |
|
_IO_wide_data结构体
1 |
|
IO_FILE利用链总结
printf利用链 – glibc2.23
这条利用链如下:
1 |
|
这条利用链的需要满足的条件有三点,第一个是进入buffered_vfprintf
函数,如下所示:
1 |
|
因此,_flags
需要含有2。
第二个条件是buffered_vfprintf
函数中存在_IO_flockfile
宏限制:
1 |
|
若_flags
不含有0x8000
,那么会调用_IO_flockfile
函数对文件加锁。因此_flags
需要含有0x8000
。
第三个条件调用函数指针时:
1 |
|
因此需要_IO_write_ptr > _IO_write_base
即可。
总结条件如下:
_flags
需要包含0x8000
和0x2
,即起码需要为0xfbad8002
的形式。(偏移为0x0
)_IO_write_ptr > _IO_write_base
,偏移分别为0x28
和0x20
。
C语言中默认的缓冲模式
- 对于
stdin
和stdout
,默认是行缓冲的,这意味着部分行不会显示,直到打印了换行符、调用了fflush()
,或程序退出。(本人测试实际上是全缓冲) - 对于
stderr
,默认是无缓冲的,这意味着遇到错误会立即输出。 - 对于文件流,例如使用
fopen
打开的文件,通常是全缓冲的。这意味着只有缓冲区满的时候或者显式调用fflush()
函数时才会写入底层文件。
IO_FILE基础知识小结
http://example.com/2023/11/09/system/IO_FILE/IO_FILE基础知识/