Back to skills
SKILL.md
Kctf2026 题4 车流困城
ASecurity看雪 KCTF2026 第四题 CrackMe 逆向方法:识别 Heaven's Gate、异常驱动 VM 指令、环境分支与魔改 AES,多项式整数根及自定义 Base64,重建 9226 字符 Serial。
- 271 stars
- 0 votes
- 0 copies
- 0 views
- Added September 23, 2026
Security analysis
100/100Pro scans all 2 files and shows the line behind each finding
npx -y skills add manyuegong33/r0crawl_skills --skill 'kctf2026-题4-车流困城' --agent claude-codeAre you the author of Kctf2026 题4 车流困城?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/manyuegong33-kctf2026-4)---
name: kctf2026-题4-车流困城
description: 看雪 KCTF2026 第四题 CrackMe 逆向方法:识别 Heaven's Gate、异常驱动 VM 指令、环境分支与魔改 AES,多项式整数根及自定义 Base64,重建 9226 字符 Serial。
---
# 题目摘要
## 文章补充的可验证常量
- 目标用户名:`KCTF`;合法 Serial 长度 9226 字节。
- Serial 格式:`lI|0O` + 9216 字节主体 + `Il1|!`。
- 主体 alphabet:`Il1|!ijJL\`oO0QDSs5$Zz2B8gq96nNmMWwUuVvRrPpCc({tT+7xXKkYyAa4Ee3FH`。
- 逆自定义 Base64:`v=(alphabet_index[ch]+51+27*i)&63`,标准 Base64 解出 6912 字节。
- 公开解法给出的最终 Serial SHA-256:`e34dc3a75754abf44a96d4902bac38b5dd0310fffb2974b27cc84b932ae5847b`。
- 明文十进制记录长度约 6897 字节,NUL 补齐到 6912;100 组十次多项式共 1000 个整数根。
目标是给定用户名 `KCTF` 构造通过校验的超长 Serial。程序为 32 位 PE,但核心算法藏在 64 位代码,通过异常处理模拟指令集,并根据父进程/PEB 状态选择真、假算法。
## 标准解法流程
1. **确认真实执行环境**
- 入口 `sub_4010E0` 保存寄存器后执行 `push 0x33; retf`(Heaven's Gate)切换 long mode。
- `in/out/int3` 等特权指令并非 I/O,而是 VEH(`Warning`)捕获后按 opcode 分派的自定义 VM 指令:`0xED` 反调试、`0xEE` 长度校验、`0xEF` 派生密钥、`0xEC` 计算混淆跳转。
- 程序枚举父进程并对名称做 djb2 哈希;仅 explorer/cmd/powershell 等白名单进入真算法。PEB `BeingDebugged` 字节在 AES 与格式校验阶段分别加 `0x1A`、`0x40`,两次叠加形成 `0x5A` 密钥。调试或 patch 任一步会落入假路径。
2. **恢复自定义编码(Serial 外层)**
- 合法 Serial 固定 9226 字符:5 字符头尾 + 9216 正文;正文字符表 64 个可打印字符。
- 对正文每位置 `i`,字符表下标 `a_i` 与真实 6-bit 值 `v_i`:`v_i=(a_i+51+27*i) mod 64`;编码反推 `a_i=(v_i-51-27*i) mod 64`。6912 字节密文对应 432 个 16 字节块。
3. **逆向魔改 AES 层**
- 通过输入差分确认 ECB(仅同一块输出变化)。状态按列存储,轮函数按行运算;使用逆列混合和右移行变换,不能直接套标准 AES 库。
- 异常上下文中轮询线程栈上的 `CONTEXT`/XMM 寄存器,在不暂停、不写内存的情况下采集相邻轮状态;差分恢复 GF(2^8) 多项式 `0x11B` 下的 S 盒、轮密钥及首轮异或值。
- 每轮线性层后额外 XOR `0x40` 常量,需在重实现中保留。
4. **求解多项式根并构造明文**
- 用户名经 31-base hash,再用 Murmur `fmix`;循环取 `state & 0x3fff`,去重得到 100 行。
- 每行 11 个压缩 BCD 系数,解密密钥:`base=(group*0x9E3779B9) XOR (coef_index*0x517CC1B7)`。解码后首字节为符号+7 位十进制位,后续半字节为十进制系数。
- 每组 10 次多项式的整数根即 10 个数字。常规组在整数范围因式分解并用 Horner 验证;第 84 组故意篡改一次项,枚举常数项因子后逐一代入筛选 10 个互异整数根。
- 根按组内升序,以 `-` 连接生成 1000 个十进制数。注意格式长度约束:在首个整数前补 6 个前导 `0`,总长度 6897,再以 NUL 补齐到 6912 字节。
5. **验证与交付**
- 按自定义 AES 正向加密 6912 字节,再执行位置相关 Base64 编码并添加固定头尾,得到 Serial。
- 先改单字符做差分,确认每个块和真路径;最后在原始未 patch 程序、白名单父进程、无调试器条件下验证 `Successful!`。
## 可复用检查清单
- [ ] 识别 32→64 位 Heaven's Gate,分别反汇编两套代码。
- [ ] 建立 opcode→VEH handler 的自定义 ISA 表,禁止简单 NOP 异常指令。
- [ ] 记录父进程、PEB、调试寄存器对算法状态的影响。
- [ ] 用输入差分判断 ECB/状态布局;从异常 `CONTEXT` 只读采样恢复密钥。
- [ ] 对整数根使用精确因式分解/Horner,处理篡改系数与排序。
- [ ] 严格满足明文长度、NUL 对齐及位置相关编码规则。
Files in this skill
- METHODLOGY.md
- SKILL.md
Attribution
Comments
Loading comments…