IO_FILE_leak是一种利用IO_FILE来达到leak效果的手法

利用方式:

针对_IO_2_1_stdout_结构体

_flags改为0xfbad1800

_IO_read_ptr = 0

_IO_read_end = 0

_IO_read_base = 0

_IO_write_base末字节改为0x58

payload = p64(0xfbad1800)+p64(0)*3+b"\\x58"

当程序调用_IO_2_1_stdout的时候就会输出_IO_write_base到_IO_write_ptr之间的内容


另外一种利用手法

如用下面payload,则会泄露_IO_2_1_stdin_(对于puts函数→不同函数输出不同)

payload = p64(0xfbad3887)+p64(0)*3+p8(0)

原理

对于输出函数来说,比如puts

其调用流为

_IO_puts→_IO_sputn→_IO_XSPUTN(vtable)→_IO_OVERFLOW(当缓冲区还有东西的时候)→_IO_do_write→_IO_new_do_write

而当_IO_write_end > _IO_write_ptr时,会调用memcpy拷贝数据到缓冲区,之后判断是否有剩余,也就是拷贝了就会调用_IO_overflow

缓冲区机制:输出数据会先放到缓冲区,然后缓冲区再发送给用户,比如往缓冲区推了0x50个数据,但是只write了0x40个数据,这个时候缓冲区就会有剩余,在下一次输出的时候,将会输出完剩余的内容,而不是这次要输出的内容。