论坛首页 密码学讨论区 阅读主题

[原创] KCTF2025 - 第四题血色试炼 题解

388 浏览 0 回复
#1 楼主 2026-06-01 21:08:55
换表,小端序,padding特殊处理的 base64 + 修改了密钥派生函数的 AES-128 + 自定义 tweak 流密码异或
手工实现三个修改过的 base64 + AES + tweak 就可以解密,密文套了四层可能存在速通方法,因为实际的校验是:所以如果 hook 自定义的加密,然后调用三次应该就能得到期望的 serial,无需苦力逆向。
但笔者在逆玩第一个解密字符串的函数之后才意识到整个程序用的都是这一套算法,输.jpg搜字符串找到明文 base64 码表和 key:

跟进引用发现是一系列初始化函数,被初始化的全局变量再引用一次进到 TLSCallBack 里:

这里面还初始化了两组密钥,还有 AES 的标准 S 盒,逆 S 盒,置换表
函数的下方还有导出 ntdll 里 Zw 开头的函数并存在(大概是)map 里的操作,应该是隐藏了某些 API call

函数末尾取出加密字符串,解密后迫不及待地call了一次(调试看是 ZwQueryInformationProcess ):

这里如果发现被调试就修改异常状态崩掉程序,直接 patch 成 jmp 就可以过掉整个程序唯一一个生效的反调:
不过其实如果不调后面部分的话,不 patch 也可以,因为反调试是第一次解密后的,我们已经可以调完整的解密过程了 复原解密就是普通的苦力活(不过可以喂给 GPT 写出完全一致的实现)
于是挨个喂了 base64 解码,密钥派生,然后检查了一下 AES 的其他部分都是完全常规的(但 GPT 一起造出来了)
再手动封装一层用于异或的密钥流派生就可以完美还原加密逻辑了 (就是用另一组密钥依次加密 struct.pack("<I", 0x24D67345 + index) * 4 作为无限长的密钥流) 然后跟到 mian 里面注册的中断处理:

大概看一下逻辑就是上文说的然后再喊 GPT 直接根据代码把逆运算都写出来 (这里写 base64 的逆 GPT 总是直接写不对,笔者这里需要再喂加密的 C 伪代码才行。但笔者并没有试过直接用程序里的 base64 解密逻辑让 GPT 写)
除了 base64 别的都能一遍过,以下是完整脚本:输出:最近两题都干翻了丐版 MCP 自动逆向工作流,但从人工解题的过程来看,LLM 完全有能力根据伪代码完美复现源码实现,或许是笔者的 prompt 不对,或许应该考虑尝试对于比较复杂的任务要求 LLM 优先挨个分析关键函数(并写出源码实现验证),然后再进行大的逆向。直接要求 LLM 做过大任务的话 LLM 很可能只能理解部分事实,比如认为上一题就是一个 RSA (而不是很多个 RSA 套在一起),或者认为本题是 base64 + XTS-AES (而不是非标准实现)。 目前笔者观察到 GPT 的另一个限制是如果用户直接提供完整任务(给出样例 name + serial,并且告诉 AI 目标是生成 KCTF 的serial), GPT 会急于求出 KCTF 的密钥而省略大量逆向过程。
但如果只告诉 AI 第一个任务是 还原 name - serial 的比较逻辑 的话, AI 就能更好的工作。这一观察也和今年软工顶会 FSE'25 上的一篇文章相符:
【论文分享】突破误报瓶颈:LLM × 静态分析的新范式——BugLens所以想要机器人队自动上分或许还需要帮 LLM 把任务分成合理的小目标去做
(笔者依旧乐观地认为如果方法得当,LLM 不仅能自动还原算法实现,也能发现原程序已经有逆运算的可能并且直接 hook call自动生成密钥) import struct

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288163.htm

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号