-
-
[原创]KCTF2025 - 第二题初窥门径 题解(AI)
-
发表于: 2025-8-16 15:36 5305
-
把栈魔法的跳转 patch 成跳到另一个地方就能让 F5 吐出比较正常的逻辑

我:已知unsigned char dword_703020[] = {...};
分析这个crackme的函数:char __usercall sub_701280@
给了一个函数之后 GPT-5 已经猜到个八九不离十,并且这里已经发现多解的可能了:
GPT:
总结
sub_701280 实现了一个 迷宫行走验证器:
输入字符串 → 映射为 base36 数组(可能带 leetspeak 容错)。
每个字符变成 3D 坐标 (layer,row,column)。
整个输入必须从起点格子(值=11278)开始,到终点格子(值=8114)结束。
相邻字符必须对应相邻格子(曼哈顿距离=1)。
每步还会通过 sub_7011C0 进一步检查格子属性(额外约束)。
返回 1 → 输入是合法路径。
返回 0 → 输入非法。
接下来可以做的事
要完全解出正确的 key(flag),需要:
确认 byte_7020F8 … byte_7020FD 的真实内容(决定输入字符集)。
理解 sub_7011C0 返回的 (v20,v21) 是什么。
把 dword_703020 解读为一个 3D 迷宫地图(每个格子存着一个编号/属性)。
之后我提供了:
我:007020F8和char __cdecl sub_7011C0(int a1, int *a2, int *a3) {}
然后 GPT-5 的思路也完全正确:

最后推 GPT 一把:
输入就是未经任何处理传入这个函数的。按已知的东西先求解一次
然后就是一分钟的 Agent 操作,直接给出flag:
已思考 1m 27s
计算32位整数数组元素数量 (272, [11278, 4882, 32580, 19499, 2406, 7698, 4707, 6184, 12705, 21166], [24865, 14914, 21785, 12975, 8342, 6375, 16769, 8114, 0, 0])
查找经过相邻单元格的路径 ((0, 0, 0), (2, 8, 9))
实现素数判定与半素数检测 (True, 2, 4057)
验证有效的半素数 True
计算BFS路径与邻居有效性 (56, [(0, 0, 0), (0, 0, 1), (0, 1, 1), (1, 1, 1), (1, 1, 2)], [(2, 5, 8), (2, 6, 8), (2, 7, 8), (2, 8, 8), (2, 8, 9)])
映射路径到base36字符对 崩溃了
校验路径字符映射有效性 (112, '0001111d1e1f2f3f3e3d', '2w2x3x4x5x5w6w7w8w8x')
打印完整字符串
0001111d1e1f2f3f3e3d4d5d5e5f53637372717d7c8c8o8p8q8r8s7s6s6g6h6i6j6757565545353h3i3j2j1j1k1w2w2x3x4x5x5w6w7w8w8x