-
-
[原创]KCTF2025 第三题邪影显现 手工题解
-
发表于: 2025-8-18 21:31 3617
-
题目打包了好多种密码学/大数运算库进来做相同的事情:inverse(pow(s, e, n), n) + C
这几组运算只有 e 不同,求出每一组的 e 就可以写脚本解了
似乎是笔者给的提示词有问题,MCP 一个劲加注释但不去重命名函数,在分析这种静态了许多函数的题目上吃了大亏,总之就是越走越偏, AI 虽然坚信这是 RSA ,但试图用各种方法求 e (然而这是一组 e )。
GPT-5 在之前的挑战里就经常被 flag/serial 校验吸引住,这次也不例外,它能完美分析出最后一个 exp 一定是 37,但对于前面的运算就无能为力了。
从解题时间看应该没有其他选手用 GPT 一把梭出 flag,但或许如果对于这种静态 + 大函数的场景能让 MCP 先去识别关键函数再做分析 或许还有一战之力。
目标字符串十分直白: "KCTF2025" + md5(name)
调一下发现是标准md5,那就看程序是怎么从输入解密出目标字符串的了。
笔者做这题时候才发现自己的 finger 挂了,然后笔者也没有去搜这些第三方大数库的符号文件(如果有几千个函数大概就去搜/自己编译了,不过也有可能狠狠大改 MCP去做识别,)
笔者手动检查了开头 serial 处理的几个函数到转成栈上变量的部分,又去最后校验的地方反着找了两轮,发现函数其实都只有mod inverse mul
三种,而 mul 都是展开的 exp,在干的事情也是一样的,于是便直接在那几个栈上变量 += 1 的地方下断(在不同大数库之间转换数据的地方,也是每轮结束的地方),然后小爆一下系数:exps = [3, 7, 11, 17, 19, 23, 29, 31, 37]
作者很好心没在中间插别的操作,没上反调,没偷偷改第三方库逻辑,于是拿到的就是真实算法了,给每轮正常 RSA 解密就可以做 keygen 了。
N 十分的小,在线查一下或者 yafu 或者什么别的都可以立刻跑出来yafu-x64.exe factor(0x56f67550f16a00390dcf0b2715708e61c5b3f23101862fc1)
from Crypto.Util.number import *from hashlib import md5p = 46942075831425428541187578011q = 45424490472579293708671645907n = p * qphi = (p - 1) * (q - 1)C = 1 << (23 * 8)exps = [3, 7, 11, 17, 19, 23, 29, 31, 37]# For logic verification# s = 0x20DB698F803FB15F6DFFBADD0E125ABEBE96494B0CCCA620# for e in exps:# s = inverse(pow(s, e, n), n) + C## assert s == int("4B43544632303235" + md5(b"EA35B2C3F2B5FCE4").hexdigest(), 16)s = int("4B43544632303235" + md5(b"KCTF").hexdigest(), 16)for e in reversed(exps): s = pow(inverse((s - C) % n, n), inverse(e, phi), n)print(hex(s)[2:].upper())from Crypto.Util.number import *from hashlib import md5p = 46942075831425428541187578011q = 45424490472579293708671645907n = p * qphi = (p - 1) * (q - 1)C = 1 << (23 * 8)exps = [3, 7, 11, 17, 19, 23, 29, 31, 37]