1. VM 基础架构与执行流程
- Dispatch Loop
- 识别 opcode 分发方式(
switch…case
、跳表、函数指针数组等)。
- 了解如何在反汇编中快速定位主循环和各个指令处理函数。
- 寄存器与栈模型
- 虚拟寄存器(如 R0–R7)、虚拟栈及其指针管理(SP、FP)。
- 区分虚拟寄存器和真实寄存器的作用,如何跟踪它们在内存中的实现。
- 内存模型
- 虚拟内存区划分:代码段、数据段、堆、栈等。
- 边界检查:LOAD/STORE 是否做了合法性验证(下标范围、页对齐)。
2. 指令语义逆向与行为验证
- 静态分析
- 用 IDA/Ghidra 识别每个 opcode 的 case 分支或函数,理清参数传递和副作用。
- 标注
ip
(指令指针)增量、跳转计算方式。
- 动态观测
- 构造最小可执行字节码,结合日志或 gdb 插桩,观察寄存器、内存的变化。
- 快速编写 Python 驱动脚本,对 VM 进行批量指令测试。
3. 常见漏洞类型与利用思路
- 越界/缺乏边界检查
LOAD addr → value
/STORE addr, value
:若缺少 0 ≤ addr < VM_MEM_SIZE
,即可实现任意读写。
- 类型混淆
- 当整数和地址类型无严格区分时,可把“常量”当指针跳转或写入。
- 控制流劫持
CALL target
/RET
指令不做有效校验,可构造伪造调用帧或逼 ip
指向任意地址。
- 虚拟堆/栈漏洞
- 虚拟堆的分配与释放实现(如 freelist、tcache 模拟)存在 double-free、use-after-free 或 off-by-one 越界,能在 VM 空间内任意分配或重用 chunk。
- 信息泄露
- 某些指令可能会把内存内容打印或返回给外部,泄露真实内存地址或 libc 基址,辅助后续 ret2libc/ROP。
4. 利用技术与常用套路
- 任意地址读写 → GOT/函数指针覆盖
- 直接把 GOT 表或虚拟机中保存真实函数指针的表改写为
system
、mprotect
等。
- 构造虚拟 ROP 链
- 在 VM 内存中布局一系列伪造“返回地址”或跳转指令,实现类似 ROP 的控制流。
- 沙箱绕过
- 如果 VM 对某些 syscall 或字符串执行做了拦截,需借助混淆指令或多步写入绕过检测。
- 结合真实漏洞利用
- 当 VM 漏洞触发真实内存写入时,可立刻切换到标准 pwn 技术(堆、栈、格式化字符串等)完成表达式链。
5. 工具与方法论
- 脚本驱动
- 用 Python/pwntools 快速发送一系列字节码,观察 VM 行为。
- 自动化符号执行
- 对分支较多的 VM,可用 angr/Unicorn 做自动化路径探索,定位边界检查缺失。
- 差分测试
- 构造合法 vs. 畸形指令流,自动化对比寄存器或输出差异,快速识别异常处理分支。
- 日志与断点
- 在关键 opcode 处理入口打断点,输出
ip
、寄存器、栈/内存快照,抓取漏洞触发点。
- Title: vmpwn
- Author: luyanpei
- Created at
: 2025-05-09 00:07:05
-
Updated at
: 2025-05-09 19:39:50
-
Link: https://redefine.ohevan.com/2025/05/09/vmpwn/
-
License:
All Rights Reserved © luyanpei