VM类型题目整理
逆向中的VM类型题目是一种基于虚拟机的代码保护技术,它将可执行代码转换为字节码指令系统的代码,一种是自定义的虚拟机,另一种是模拟tea等常见算法,来达到不被轻易逆向的目的,实现原理是将程序的代码转换自定义的操作码(opcode),然后在程序执行时再通过解释这些操作码,选择对应的函数执行,从而实现程序原有的功能
下面用&和~两种运算表示其他基础运算
直接还原opcode
给了opcode和算法,直接打印出具体代码之后再分析
1 | opcode = [0x01, 0x01, 0x21, 0xF1, 0xC3, 0xB2, 0xE5, 0xD4, 0xA1, 0x53, |
2023浙江省省赛决赛vm
去除花指令后得到main
发现是类似矩阵运算的加密,用z3得到fake flag
1 | from z3 import * |
main前面加密得到encrypt
交叉引用找a1
Str 字符串指示了这个文件是 DLL 文件,解密算法是简单循环异或
由于 DLL 文件头固定,可以先推出key,这也是文件加密类题目的常见解法
1 | data = open('encrypt', 'rb').read()[:100] |
得到gaLf_ek@f_AsI_s1hT{galf},从上面加密也可以看出从倒数第二个开始往前循环
然后解密得到DllMain.dll
1 | data = open('encrypt', 'rb').read() |
用vm实现tea
1 | int __cdecl sub_100012C0(int input, int *key) |
先照抄代码模拟出加密流程
1 |
|
后面是魔改tea
1 |
|
有时候只能打印出伪汇编,需要再转化成高级语言,参考upsw1ng师傅写的文章:https://mp.weixin.qq.com/s/t1MeYCCrBgl9U-vZiF9RZQ
这个时候也可以编译出bin文件,最后IDA反编译bin文件得到伪代码
z3约束
与直接还原相比用z3可以不还原算法
1 | import z3 |
2023NCTFezVM
先脱壳,发现有很多分支,照抄之后用z3解,相比上面只不过多了一些opcode和对应的操作
1 | #!/usr/bin/env python3 |
符号执行爆破
适用于结果是一位位比较密文和加密明文的题目
HSCCTF2024ezvm
跟进vm的加密函数,这个函数变成了一个完整的switch case语句
利用插件,先设置好两个断点,分别用于进行符号化和爆破flag
下面是第一个断点,用来获取输入
第二个断点,用来爆破flag
ctrl+g跳到相应位置
修改eip
一位位爆破,最终得到flag
单字节加密
一些单字节加密题目基于VM,VM 程序通常有一个指令分发器,在分发指令时需要一个类似于 EIP的累加器来确保指令正确执行在单字节验证的过程中,如果出现一个字节不匹配的情况,程序会立即退出。这里存在一个相关关系:当前字节验证正确时,EIP 会向下移动,累加器也会相应增加。因此,使用先插入代码,在程序退出时检查累加器的变化,以此判断当前位是否验证成功
frida插桩爆破
1 | var number = 22; |
2023NCTFezVM
hook的两个位置分别为opcode分发和putchar的位置
尝试的脚本,发现可以hook
调用exit函数在获取发送过来的number之后结束程序,可以得到更快的爆破速度
1 | var number = 0 |
自动化脚本,实际测试发现可能不止一条路,要找到正确的路需要不断往flag字符串里面添加正确的字符才能尽量使得后续字符正确
1 | import subprocess |
pintools爆破
动态二进制插桩,在不修改源代码的情况下,对二进制可执行文件进行运行时插桩,以便分析统计指令数量、分支次数等特征,与frida插桩爆破相比好处是误差较小,自动化程度较高
2025强网拟态初赛hyperjump
典型的VM,switch-case 结构
用Pintools进行侧信道爆破,遍历指令最多的字符就是该位置正确的字符
1 | #!/usr/bin/env python3 |
参考链接:
https://bbs.kanxue.com/thread-267670.htm
https://blog.csdn.net/Hotspurs/article/details/106039643
- 标题: VM类型题目整理
- 作者: j1ya
- 创建于 : 2025-12-17 10:47:04
- 更新于 : 2026-01-09 10:49:58
- 链接: https://redefine.ohevan.com/2025/12/17/VM类型题目整理/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。

