io_file
houseoforange_hitcon_2016
https://blog.csdn.net/yongbaoii/article/details/114649586?utm_source=app&app_version=4.18.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
topchunk的size修改条件
- topchunk size > MINSIZE(0x10)
- top chunk inuse位为1
- 修改之后的 size 必须要对齐到内存页(页大小一般为0x1000)
大佬 blog:
Pwn_IO_FILE - SkYe Wiki (mrskye.cn)
堆中global_max_fast相关利用 - 先知社区 (aliyun.com)
例题:justpwnit
fastbin[0]有时候距离main_arena的偏移为8有时候为16,所以公式不能直接套(老版本glibc的main_arena 结构中没有第二个 qword,have_fast_bin。老版本中的0x20 fastbin 在arena + 8, 新版本的在arena + 0x10。)
_free_buffer距vtable的偏移是0x10
参考blog:https://www.anquanke.com/post/id/258512
_IO_flush_all_lockp
调用函数的时机包括:
- libc执行abort函数时。
- 程序执行exit函数时。
- 程序从main函数返回时。
fsop
IO_FILE中glibc2.24,利用_IO_str_jumpsz中的_IO_str_finish
我们可以将vtable的地址覆盖成_IO_str_jumps-8
的地址,这样会使得_IO_str_finish
函数成为了伪造的vtable地址的_IO_OVERFLOW
函数(因为_IO_str_finish
偏移为_IO_str_jumps
中0x10,而_IO_OVERFLOW
为0x18)。这个vtable(地址为_IO_str_jumps-8
)可以绕过检查,因为它在vtable的地址段中。
stdin
标准输入缓冲区进行任意地址写
stdout
标准输入缓冲区进行任意地址读写
任意写
任意读
flag &=~ 8
注:会有printf输出时,会多一个条件
利用stdout 来泄露地址
参考blog:
IO FILE 之任意读写 « 平凡路上 (ray-cp.github.io)
Pwn_IO_FILE - SkYe Wiki (mrskye.cn)