Leak

   更改`_IO_2_1_stdout_.flag`为`0xfbad1800`,更改`_IO_2_1_stdout_._IO_write_base`为希望输出内容的指针,然后调用任意libc输出函数,就会输出`_IO_2_1_stdout_._IO_write_base` 到 `_IO_2_1_stdout_._IO_write_end`之间的所有内容,具体原理可以参照fwrite一章(还没写

Arbitrary Write

    修改`_IO_2_1_stdin_._IO_buf_base` & `_IO_2_1_stdin_._IO_buf_end` ,libc中的读入函数会把内容写进该处,具体原理可以参照[fread](<https://cnwangjihe.notion.site/fread-afb2d261e2a54fd8ba2e2b3ea09acff1>)

Control Execution Flow

  1. (glibc<2.23) 修改任意IO_FILE的vtable指向的虚表内的函数指针指向目标函数。

  2. (glibc==2.23) 在该版本下,libc中的vtable不可写,但可以修改IO_FILE的vtable指针,使他指向一块可控的内存,伪造vtable,具体操作同上。

  3. (2.23<glibc<=2.27) 在该版本下,vtable在一般情况下被限定在libc中一段不可写的内存中,此时可以把vtable改到IO_str_jumps上,因为他的overflow/finish函数存在从IO_FILE里取函数指针的行为,而这个位置我们可以篡改伪造,从而控制执行流。

  4. (2.27<glibc<=2.29) 在该版本下,IO_str_jumps中的overflow/finish不再从IO_FILE里取函数指针了,但是我们可以发现_IO_wfile_jumps里仍存在类似行为。

  5. ~~(2.29<glibc<2.34) 没啥好办法了...,可能的利用可以参考house of pig,~~

  6. (2.27<glibc) (并不是说高于2.27才能用,但通常来说低版本有更容易的打法)。

    高版本的版本答案是house of apple或house of cat

    [原创]House of cat新型glibc中IO利用手法解析 && 第六届强网杯House of cat详解-Pwn-看雪-安全社区|安全招聘|kanxue.com

    house of apple

各种其他方法可以参考一篇非常详细的总结:

[原创] CTF 中 glibc堆利用 及 IO_FILE 总结-Pwn-看雪-安全社区|安全招聘|kanxue.com