针对_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个数据,这个时候缓冲区就会有剩余,在下一次输出的时候,将会输出完剩余的内容,而不是这次要输出的内容。