MoriartyPuth-Labs/MalwareTech-VM1-Lab
GitHub: MoriartyPuth-Labs/MalwareTech-VM1-Lab
对 MalwareTech 实验室的自定义 8 位虚拟机进行纯静态逆向工程,重构指令集并通过 Python 模拟解密 Flag 的实验记录。
Stars: 0 | Forks: 0
# 🖥️ MalwareTech VM1
### 虚拟机逆向工程与静态分析
      
      
### `507 bytes` · `自定义 8 位 VM` · `XOR 解密` · `无需执行`
## 📌 关于
一个 507 字节的二进制文件 (`ram.bin`) 将 Flag 隐藏在一个手工编写的**自定义 8 位虚拟机**中。挑战在于:逆向该 VM 的架构,重构其指令集,并使用**纯静态分析**解密 Flag —— 该二进制文件完全不需要接触 CPU。
| | |
|---|---|
| 🖥️ **实验** | MalwareTech VM1 |
| 🔬 **类型** | 静态分析 — 自定义 VM 逆向 |
| ⚙️ **架构** | x86_64 |
| 🪟 **平台** | Windows 64 位 |
| ⚡ **难度** | 中等 |
| 📦 **下载** | [vm1.rar](https://labs.malwaretech.com/files/virtualization/vm1.rar) |
| 🔑 **压缩包密码** | `MalwareTechLabs` |
| 🎯 **目标文件** | `ram.bin` (507 字节) |
| 🏆 **Flag** | `FLAG{VIRTUAL-MACHINE-UNDERSTANDING}` |
## 🗺️ 分析流程
```
┌──────────┐ ┌─────────────┐ ┌──────────────────┐
│ ram.bin │───▶│ Hex Dump │───▶│ Memory Layout │
│ (507 B) │ │ Analysis │ │ Mapping │
└──────────┘ └─────────────┘ └────────┬─────────┘
│
▼
┌──────────────┐ ┌─────────────────┐ ┌────────────────┐
│ FLAG 🏆 │◀───│ Python Emulator │◀───│ ISA │
│ Decrypted │ │ solver.py │ │ Reconstruction │
└──────────────┘ └─────────────────┘ └────────────────┘
```
## 🔬 技术分析
### 1️⃣ 内存布局
原始的十六进制转储直接揭示了将数据与可执行字节码分隔开的清晰边界。
| 区域 | 偏移量 | 大小 | 内容 | |---|---|---|---| | 📦 **数据区** | `0x00` → `0xFE` | 255 字节 | 加密的 Flag 数据 + VM 状态 | | ⚙️ **字节码区** | `0xFF` → `0x1FB` | 252 字节 | VM 指令 (IP 从此处开始) | ### 2️⃣ 指令集架构 该 VM 在 3 字节固定宽度的指令上运行经典的**读取 → 解码 → 执行**循环: ``` Byte 0 Byte 1 Byte 2 ┌───────────────┬───────────────┬───────────────┐ │ OPCODE │ OPERAND 1 │ OPERAND 2 │ │ 1 byte │ 1 byte │ 1 byte │ └───────────────┴───────────────┴───────────────┘ ``` 通过手动字节码追踪恢复的完整 ISA: | 操作码 | 助记符 | 伪代码 | 描述 | |---|---|---|---| | `0x01` | **SET** | `RAM[op1] = op2` | 将立即数写入 RAM | | `0x02` | **LOAD** | `REG = RAM[op1]` | 将 RAM 的值加载到寄存器 | | `0x03` | **XOR** | `RAM[op1] ^= REG` | 将 RAM 地址的值与寄存器进行 XOR | | _其他_ | **HALT** | `break` | 终止执行 | ### 3️⃣ 读取-解码-执行循环 引擎每个周期前进 3 个字节,从字节码段中读取: ``` counter = 0 while running: # ── FETCH ────────────────────────────────── opcode = bytecode[counter + 0xFF] # instruction op1 = bytecode[counter + 0x100] # operand 1 op2 = bytecode[counter + 0x101] # operand 2 counter += 3 # advance IP # ── DECODE & EXECUTE ──────────────────────── decode_and_execute(opcode, op1, op2) ``` ### 4️⃣ 静态模拟器 — `solver.py` 无需执行。无需沙箱。无需动态分析。一个 Python 模拟器即可冷处理 `ram.bin`: ``` # ────────────────────────────────────────────── # MalwareTech VM1 — 静态模拟器 # solver.py # ────────────────────────────────────────────── ram = bytearray(open("ram.bin", "rb").read()) register = 0 counter = 0 BYTECODE_START = 0xFF while True: ip = BYTECODE_START + counter # Bounds check — stop if past end of file if ip + 2 >= len(ram): break opcode, op1, op2 = ram[ip], ram[ip + 1], ram[ip + 2] counter += 3 # ── Execute ────────────────────────────────── if opcode == 0x01: ram[op1] = op2 # SET elif opcode == 0x02: register = ram[op1] # LOAD elif opcode == 0x03: ram[op1] ^= register # XOR else: break # HALT # ── 从 data section 提取解密后的 flag ── flag = bytes(ram[0x00:0xFF]).split(b"\x00")[0].decode() print(f"[+] Flag: {flag}") ``` **脚本逐步执行的操作:** 1. 📂 将 `ram.bin` 加载到可变字节数组中 2. 📍 从偏移量 `0xFF` 开始执行 3. 🔁 模拟 `SET` → `LOAD` → `XOR` 循环 4. 🔑 XOR 密钥直接从数据段内部提取 5. 🏁 当遇到 `HALT` 操作码时,解密后的 Flag 已存储在 `RAM[0x00:0xFF]` 中 ## 🏆 Flag
```
╔══════════════════════════════════════════════════╗
║ ║
║ FLAG{VIRTUAL-MACHINE-UNDERSTANDING} ║
║ ║
╚══════════════════════════════════════════════════╝
```
## 🧰 工具与技术
| 工具 / 技术 | 作用 |
|---|---|
| 🔍 十六进制编辑器 | 二进制检查与内存边界识别 |
| 📐 手动反汇编 | 字节码模式分析与 ISA 映射 |
| 🐍 Python 3 | 静态 VM 模拟器 (`solver.py`) |
| 🧠 XOR 密码分析 | 从嵌入的数据区提取密钥 |
## ⚠️ 免责声明标签:8位虚拟机, DAST, MalwareTech Labs, Python3, Python模拟器, x86_64, XOR解密, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码虚拟化, 反混淆, 可配置连接, 密码学, 恶意软件分析, 手动系统调用, 指令集提取, 生成式AI安全, 程序分析, 脱壳, 自定义虚拟机, 虚拟机, 虚拟机保护, 虚拟机逆向, 逆向工程, 静态分析