首页
社区
课程
招聘
[原创]KCTF2025 第三题邪影显现 手工题解
发表于: 2025-8-18 21:31 3617

[原创]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 md5
 
p = 46942075831425428541187578011
q = 45424490472579293708671645907
n = p * q
phi = (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 md5
 
p = 46942075831425428541187578011
q = 45424490472579293708671645907
n = p * q
phi = (p - 1) * (q - 1)
C = 1 << (23 * 8)
exps = [3, 7, 11, 17, 19, 23, 29, 31, 37]
 

传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回