VMpwn-虚拟机逃逸
参考资料:https://xz.aliyun.com/news/15722
https://zikh26.github.io/posts/ccd7886.html#ciscn-2019-qual-virtual
在学习 VMpwn 之前,建议学一学虚拟机逆向,这两个关联是很大的。VMpwn 一般代指在程序中实现运算指令来模拟程序的运行(汇编类)或者在程序中自定义运算指令的程序(编译类)。
[OGeek2019 Final]OVM
首先看一下题目主体吧:
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
1 | ssize_t __fastcall execute(int a1) |
这段代码从 opcode 中提取了三部分信息,分别是 v4、v3 和 v2,它们通常对应于虚拟机指令集的目标寄存器、第二操作数寄存器、和第一操作数寄存器。这些位的提取通常遵循特定的指令编码规范。
1 | | 高 8 位 操作码 | 次高 4 位 目标寄存器 | 次低 4 位 源寄存器1 | 最低 4 位 源寄存器2/立即数 | |
字段解释
- 操作码(高 8 位):
- 使用 HIBYTE(opcode) 提取,即 (opcode >> 8) & 0xFF。
- 决定指令的类型,例如 ADD、SHL、LOAD 等。
- 目标寄存器(次高 4 位,v4):
- 提取 (opcode & 0xF0000u) >> 16。
- 表示操作的结果将存储在哪个寄存器中。
- 源寄存器1(次低 4 位,v3):
- 提取 (opcode & 0xF00) >> 8。
- 表示第一个操作数来源的寄存器。
- 源寄存器2或立即数(最低 4 位,v2 ):
- 提取 opcode & 0xF。
- 表示第二个操作数来源的寄存器,或直接是一个 4 位的立即数。
1 | mov reg, op 0x10 : reg[dest] = op |
1 | from pwn import * |
更新: 2026-03-24 19:35:52
原文: https://www.yuque.com/idcm/wnemg9/wwlob0m3dp8ycx7u