首页
社区
课程
招聘
[原创]Kanxue2026KCTF 第八题:亥子合辰·塔影迷楼 设计思路
发表于: 2026-8-5 21:52 13

[原创]Kanxue2026KCTF 第八题:亥子合辰·塔影迷楼 设计思路

htg 活跃值
7
2026-8-5 21:52
13

# 团队名称:心学

# 团长 QQ:355185640


# 参赛题目:CrackMe


# 题目答案(攻击脚本)


注册码:`kanxue@2o26o8!@#`


答案即为注册码本身,无 flag{} 包装;运行程序后输出 `Input:`,输入正确注册码输出 `correct`,输入错误输出 `fault` 并退出。


攻击脚本:[src/solve.py](src/solve.py)(纯 Python:先逆 20 轮 ARX/Feistel,再对隐藏场五次同余方程做 Cantor–Zassenhaus 分解,无第三方依赖)。


```text

python src/solve.py

[*] GF(170141183460469231731687303715884105689) 上 Q(x)-Q* 的根: 1 个

[*] 落在注册码编码区间 [0, 37157429083410091685945089785856) 的根: 1 个

[+] 注册码: kanxue@2o26o8!@#   (校验 OK)

```


交互示例:


```text

Input:kanxue@2o26o8!@#

correct


Input:XXXXXXXXXXXXXXXX

fault

```


# 详细的题目设计说明


## 一、核心创意:五次方程没有根式通解(V4 隐藏场加固版)


V4 落实“无根式解”的正确姿势(改进方案2-2):攻击者除“恢复并求解一个无公式的五次方程”之外无路可走,

且这个方程处于“秒解工具失效”的隐藏场形态:


- 场不落明文:五次系数、SBOX、MIX、轮密钥、目标加密密钥全部由区域 B 代码 hash H_B

  经 splitmix PRF 运行时派生到栈上(salt 构建期选定,唯一性验证通过);

- 反调试结果 det 直接污染场派生:det=0(正常环境)与构建期一致,否则整条链全部变化;

- 校验链 = 隐藏场五次同余 → 20 轮 ARX/Feistel ×2 → 折叠 T3 + 输入相关过滤器 T4:


      N = base94(serial)

      Q = N^5 + a4·N^4 + a3·N^3 + a2·N^2 + a1·N + a0  (mod p),p = 2^127 − 39

      state1 = Feistel20(Q, K1, SBOX, MIX, H_B)

      state2 = Feistel20(Q, K2, SBOX, MIX, H_B)

      ok = (state1==T1) && (state2==T2) && (H64(state1||state2)==T3)

           && (mix64(N,state1,state2)==T4) && (checksum24(serial)==CSUM)


- T1~T4 在 `.tgt` 中以派生密钥加密存放,比较前才解密展开;

- p 由归约算术(2^128 ≡ 78 (mod p))可见,属无法完全隐藏的实现细节(诚实说明)。


## 二、注册码与校验流程


1. 注册码长度固定为 16,字符集限定为 ASCII 33~126(共 94 个字符);

2. 按 base-94 唯一编码为整数 N ∈ [0, 94^16);

3. 核心校验(位于两段互锁 SMC 中,运行时解密执行):

   - serial 24-bit 校验和 == CSUM;

   - 区域 B 代码 hash → H_B;反调试 → det(det 污染场派生);

   - 由 (H_B^det, salt) 派生场:系数/SBOX/MIX/轮密钥/目标密钥;

   - 解密目标 T1~T4;20 轮 ARX/Feistel ×2;折叠 T3 + 输入相关 T4;

4. 全部通过输出 `correct`,否则输出 `fault`,随后退出。


## 三、唯一注册码的保证


- Feistel 可逆:目标值唯一前像 Q*;

- Q(x) = Q* 是 GF(p) 上五次方程,根 ≤ 5;编码区间 [0,94^16) 远小于 p;

- 构建期用 Cantor–Zassenhaus 分解验证:本组参数共 1 个根且在区间内(唯一性成立);

- 因此除给定注册码外,不存在第二个可接受注册码。


## 四、文件结构


| 文件 | 说明 |

| --- | --- |

| [src/crackme.cpp](src/crackme.cpp) | 主程序:区域 A 解密、原始系统调用 I/O、字符串异或、无用代码、自定义入口(无 CRT) |

| [src/smc.cpp](src/smc.cpp) | 两段互锁 SMC:区域 A(stage1)、区域 B(隐藏场派生 + 五次同余 + Feistel + 反调试 + 折叠/输入相关过滤 + 轻量 CFF) |

| [src/syscall.asm](src/syscall.asm) | 直接系统调用包装(ml64 x64) |

| [src/patch_smc.py](src/patch_smc.py) | 构建后处理:加密两段 SMC、派生隐藏场、盐搜索与唯一性验证、目标加密回填 |

| [src/chal_math.py](src/chal_math.py) | Python 侧共享数学实现(与 smc.cpp 一一对应,含隐藏场 PRF) |

| [src/gen_params.py](src/gen_params.py) | 参数骨架生成器(serial/n/csum) |

| [src/gf_poly.py](src/gf_poly.py) | GF(p) 多项式运算与 Cantor–Zassenhaus 求根(纯 Python) |

| [src/solve.py](src/solve.py) | 进攻方攻击脚本:逆 Feistel → 解隐藏场五次同余 → 还原注册码 |

| [src/build.bat](src/build.bat) | 一键构建脚本(汇编 → 编译 → 链接 → 隐藏场派生与加密回填) |

| [attachments/CrackMe.exe](attachments/CrackMe.exe) | 参赛附件(编译产物) |


参赛附件 SHA256:`B0DAE7A21B059805A35FC5490F84A607D00AFB28AD6B5B9F9EBC31574C382EA1`


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 2天前 被kanxue编辑 ,原因:
上传的附件:
收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回