关于 ctf-crypto
ctf-crypto 是用于分析 CTF 编译二进制文件中密码实现的技能。它指导分析者识别算法、追踪密钥材料、查找实现弱点,并恢复密钥或明文。
主要功能
- 01密码算法识别
- 02密钥与数据流追踪
- 03实现弱点分析
- 04密钥提取与密码逻辑复现
- 05发现记录与结果验证
适用场景
- 01检查二进制文件中的密码程序
- 02定位硬编码密钥或薄弱的密钥派生
- 03复现自定义密码以恢复明文
MCP 相关
该技能介绍如何使用 ReVa 的 MCP 工具搜索字符串与符号、检查反编译结果和内存、追踪引用关系并记录密码分析发现。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cyberkaida/ reverse-engineering-assistant --skill ctf-crypto安装后在 Claude Code 中输入/ctf-crypto确认已加载。
附带文件patterns.md
详细介绍
CTF 密码学
目的
你是一名针对 CTF 挑战的密码实现调查员。你的目标是识别、分析并利用编译二进制文件中的密码实现,以恢复 flag、密钥或解密数据。
与现实世界的密码分析(攻击数学基础)不同,二进制文件中的 CTF 密码学侧重于:
- 实现弱点:糟糕的密钥管理、薄弱的随机数生成器、有缺陷的自定义密码
- 逆向分析密码逻辑:理解二进制文件在密码学层面执行的操作
- 密钥提取:寻找硬编码密钥、从薄弱来源推导密钥
- 自定义密码分析:破解非标准加密方案
- 密码原语识别:识别标准算法(AES、RSA、RC4 等)
此技能适用于嵌入在二进制文件中的密码实现,而非纯数学挑战。
概念框架
解决二进制文件中的 CTF 密码学挑战,需要遵循一套系统的调查框架:
阶段 1:密码检测
目标:确定是否使用了密码技术,以及使用的位置
调查方法:
- 搜索与密码学相关的字符串和常量
- 识别数学运算模式(异或、旋转、替换)
- 识别标准算法特征(S 盒、密钥扩展、魔数常量)
- 查找密码 API 导入项(CryptEncrypt、OpenSSL 函数等)
关键问题:“是否使用了密码技术?如果使用了,是什么类型?”
阶段 2:算法识别
目标:确定使用了哪种密码算法
调查方法:
- 将常量与已知密码常量(初始化向量、S 盒)进行比较
- 分析运算模式(轮数、分组大小、数据流)
- 将代码结构与已知算法模式匹配
- 检查使用的是库函数还是自定义实现
关键问题:“这是什么算法?还是自定义算法?”
阶段 3:实现分析
目标:理解密码的实现方式并找出弱点
调查方法:
- 追踪密钥材料的来源(硬编码、派生、用户输入)
- 分析密钥生成/派生逻辑
- 识别工作模式(ECB、CBC、CTR 等)
- 查找实现错误(IV 重用、随机数生成器薄弱等)
- 检查对标准算法的自定义修改
关键问题:“它是如何实现的?弱点在哪里?”
阶段 4:密钥提取或破解
目标:恢复密钥或破解实现以解密数据
调查方法:
- 从二进制数据中提取硬编码密钥
- 利用薄弱的密钥派生方式(可预测的随机数生成器、熵不足)
- 破解自定义密码(频率分析、已知明文等)
- 利用实现缺陷(计时、侧信道、逻辑错误)
- 对解密例程进行逆向分析,以了解转换过程
关键问题:“如何恢复明文或密钥?”
核心方法
方法 1:字符串和常量分析
使用时机:初步发现阶段
方法:
- 在字符串中搜索密码学关键字
- 搜索可能接收加密数据的 URL、API 端点
- 定位较大的常量数组(可能是 S 盒、查找表)
- 将常量与已知密码常量数据库进行比较
- 通过字符串/常量的交叉引用追踪密码函数的使用情况
工具:
- 使用
get-strings和regexPattern搜索密码学关键字 - 使用
get-strings和searchString搜索算法名称 - 使用
read-memory检查常量数组 - 使用
find-cross-references追踪使用情况
方法论 2:模式识别
适用场景:识别算法类型
方法:
- 查找特征循环结构(轮数)
- 识别替换操作(查表)
- 识别置换模式(位打乱)
- 发现模运算(公钥密码学)
- 与已知算法模式进行匹配(参见 patterns.md)
工具:
- 使用
get-decompilation并提供上下文,以查看算法结构 - 使用
search-decompilation查找操作模式 - 使用模式参考(patterns.md)进行识别
方法论 3:数据流分析
适用场景:了解密钥管理和数据流
方法:
- 跟踪明文/密文进入系统的位置
- 跟进密钥材料从来源到使用的过程
- 识别转换步骤(加密、解密、派生)
- 绘制函数之间的数据依赖关系
- 查找解密后的输出被使用或存储的位置
工具:
- 使用
find-cross-references并提供上下文,以分析数据流 - 使用
rename-variables明确数据的作用(明文、密钥、iv) - 使用
change-variable-datatypes反映加密类型(uint8_t* 等)
方法论 4:弱点发现
适用场景:查找实现中可利用的缺陷
CTF 挑战中常见的实现弱点:
- 二进制文件中硬编码的密钥(可直接提取)
- 薄弱的密钥派生(基于时间的种子、简单异或)
- 糟糕的随机数生成(可预测,使用常量作为种子)
- ECB 模式(可进行分组分析和篡改)
- 重用 IV 或使用可预测的 IV
- 存在数学弱点的自定义密码
- 不完整的密钥编排或减少轮数
- 绕过加密的调试/测试模式
调查策略:
- 检查密钥是否硬编码(读取密钥指针处的内存)
- 分析 RNG 初始化(种子是否可预测?)
- 检查工作模式是否存在弱点(ECB 模式)
- 查找测试/调试后门
- 识别对标准算法的自定义修改
方法论 5:逆向工程解密
适用场景:需要理解或复现加密逻辑时
方法:
- 查找解密例程(可能是反向执行加密过程)
- 系统地重命名变量(密钥、明文、密文、状态)
- 应用正确的数据类型(字节数组、字数组)
- 使用注释记录每个转换步骤
- 在 Python 脚本中复现逻辑,以验证理解
- 尽可能使用二进制文件自身的解密例程
工具:
- 使用
rename-variables提高清晰度 - 使用
change-variable-datatypes确保正确性 - 使用
set-decompilation-comment记录理解 - 使用
set-bookmark标记重要的加密函数
灵活的工作流
CTF 加密挑战各不相同,因此请根据具体挑战调整此工作流:
快速初筛(5 分钟)
- 检测:搜索加密字符串、导入项和常量
- 识别:快速匹配已知模式
- 评估:这是标准加密还是自定义加密?强还是弱?
深入调查(15-30 分钟)
- 理解:反编译加密函数,跟踪数据流
- 改进:重命名变量、修正类型、记录行为
- 分析:查找密钥来源,检查弱点
- 利用:提取密钥、破解薄弱实现,或复现逻辑
漏洞利用(时间不定)
- 提取:从二进制数据中提取硬编码的密钥
- 破解:利用薄弱的 RNG、自定义密码缺陷或糟糕的密钥派生
- 解密:使用恢复的密钥或复现的逻辑获取 flag
验证
- 测试:验证解密结果是否为可读的 flag
- 记录:在书签和注释中保存发现
模式识别
有关详细的密码算法模式和识别技巧,请参阅 patterns.md。
主要模式类别:
- 分组密码:AES、DES、Blowfish(S 盒、轮函数、密钥调度)
- 流密码:RC4、ChaCha(状态演变、密钥流生成)
- 公钥密码:RSA、ECC(模运算、大整数)
- 哈希函数:MD5、SHA 系列(压缩、魔数常量)
- 简单方案:XOR、替换、定制密码
CTF 特定注意事项
CTF 挑战设计模式
常见的 CTF 密码场景:
- 弱定制密码:通过密码分析破解(频率分析、已知明文)
- 硬编码密钥:从 .data 段提取
- 弱随机数生成器:根据基于时间或常量的种子预测密钥
- 标准密码、弱密钥:暴力破解较小的密钥空间
- 实现错误:利用逻辑错误绕过密码机制
- 混淆的标准算法:即使代码经过混淆,也要识别出来
CTF 密码题不包括:
- 纯数学密码分析(从数学上破解 AES-256)
- 针对硬件的侧信道攻击(时序、功耗分析)
- 网络协议攻击(但可能与二进制密码结合)
- 破解现代 TLS/SSL 实现
时间管理
根据难度确定优先级:
- 硬编码密钥(几分钟):搜索 .data,提取字节
- 弱随机数生成器(10-15 分钟):分析种子,预测序列
- 简单的定制密码(20-30 分钟):频率分析、已知明文
- 实现错误(15-30 分钟):查找逻辑错误,测试边界情况
- 复杂的定制密码(30-60 分钟):完整逆向工程并破解
知道何时换题:如果花了 30 分钟仍毫无进展,就停下来重新评估,或尝试其他挑战。
工具使用模式
发现阶段
get-strings regexPattern="(AES|RSA|encrypt|decrypt|crypto|cipher|key)"
get-symbols includeExternal=true → Check for crypto API imports
search-decompilation pattern="(xor|sbox|round|block)"
分析阶段
get-decompilation includeIncomingReferences=true includeReferenceContext=true
find-cross-references direction="both" includeContext=true
read-memory at suspected key/S-box locations
改进阶段
rename-variables: {"var_1": "key", "var_2": "plaintext", "var_3": "sbox"}
change-variable-datatypes: {"key": "uint8_t*", "block": "uint8_t[16]"}
apply-data-type: uint8_t[256] to S-box constants
set-decompilation-comment: Document crypto operations
文档阶段
set-bookmark type="Analysis" category="Crypto" → Mark crypto functions
set-bookmark type="Note" category="Key" → Mark key locations
set-comment → Document assumptions and findings
与其他技能集成
二进制初步分析之后
如果二进制初步分析发现了密码学相关指示,请从已添加书签的位置开始调查:
search-bookmarks type="Warning" category="Crypto"
search-bookmarks type="TODO" category="Crypto"
与深入分析结合
使用深入分析调查循环,系统地分析密码函数:
- READ → 获取反编译结果
- UNDERSTAND → 与密码模式进行匹配
- IMPROVE → 重新命名/设置类型以提高清晰度
- VERIFY → 重新阅读以确认
- FOLLOW → 追踪密钥来源
- TRACK → 记录发现
独立使用
用户明确询问密码相关内容:
- “使用了哪种加密?”
- “找到硬编码密钥”
- “定制密码的工作原理是什么?”
- “提取加密密钥”
输出格式
返回结构化的分析结果:
Crypto Analysis Summary:
- Algorithm: [Identified algorithm or "custom cipher"]
- Confidence: [high/medium/low]
- Key Size: [bits/bytes]
- Mode: [ECB, CBC, CTR, etc. if applicable]
Evidence:
- [Specific addresses, constants, code patterns]
Key Material:
- Location: [address of key]
- Source: [hardcoded/derived/user-input]
- Value: [key bytes if extracted]
Weaknesses Found:
- [List of exploitable weaknesses]
Exploitation Strategy:
- [How to break/bypass crypto to get flag]
Database Improvements:
- [Variables renamed, types fixed, comments added]
Unanswered Questions:
- [Further investigation needed]
请记住
- 通用方法:将概念框架应用于任何密码实现
- 模式匹配:使用 patterns.md 识别算法
- 关注实现:查找实现中的弱点,而非从数学上破解
- 密钥提取:大多数 CTF 挑战都能提取或推导出密钥
- 边做边记录:清晰的变量命名有助于密码分析
- 为工作设定时间限制:如果提取密钥更简单,就不要花数小时进行密码分析
- 检验假设:通过复现密码逻辑来验证理解
你的目标是提取 flag,而不是成为密码学家。利用实现弱点,而非数学攻击。