roadmap
逆向选手对密码学的掌握核心在于三个词:识别(Identify)、提取(Extract)、还原(Reproduce/Decrypt)。
具体来说,你需要掌握到以下几个层级:
第一层级:简单变换与编码 (必须熟练手写脚本)
这部分通常出现在签到题、复杂的去混淆过程或自定义的简单加密中(就像你刚才做的题目)。
-
你需要掌握:
-
常见编码: Base64/32/58/85、Hex 编码、URL 编码。一眼就能认出编码表的特征(如 Base64 的
A-Za-z0-9+/)。 -
简单位运算: 异或(XOR)是最常见的。你需要熟悉
A ^ B ^ B = A的性质。 -
古典密码变体: 凯撒(移位)、维吉尼亚(多表替换)、栅栏密码。
-
自定义简单的数学变换: 如
(x + 5) ^ 0x33这种组合操作。
-
-
程度要求:
-
看到汇编中的
shr,shl,xor,add,sub组合,能脑补出 C 语言逻辑。 -
能快速用 Python 编写逆向脚本(Z3 求解器或直接逆推)。不要在这些简单的逻辑上卡太久。
-
第二层级:现代对称加密算法 (必须能识别特征)
在逆向中,如果题目直接调用了 AES 或 RC4,你绝对不要去尝试一行行逆向它的汇编代码,那是在浪费时间。你需要做的是认出它。
-
你需要掌握:
-
RC4: 特征极强。看到两个
for循环初始化一个 256 字节的数组(S-Box),然后对该数组进行交换操作。 -
AES: 看到复杂的矩阵运算,或者看到特定的 S-Box 常量(如
0x63, 0x7c, 0x77, 0x7b...开头的数组)。 -
TEA / XTEA / XXTEA: 微型加密算法。特征是会有特定的 Delta 常量
0x9E3779B9。 -
DES / 3DES: 也是通过查找 S-Box 常量或特定的置换表来识别。
-
-
程度要求:
-
识别: 使用插件(如 IDA 的 FindCrypt 或 Signsrch)或肉眼识别常量。
-
提取: 能够从内存或代码中提取出 Key(密钥) 和 IV(初始向量)。
-
调用库: 提取出密钥后,直接使用 Python 的
PyCryptodome库进行解密,而不是自己写解密算法。
-
第三层级:非对称加密与哈希 (知道如何利用工具)
这通常涉及到大数运算。
-
你需要掌握:
-
Hash 函数 (MD5, SHA-1, SHA-256): 同样通过初始化常数识别(例如 MD5 的
0x67452301)。- 逆向策略: Hash 不可逆。如果程序校验 Hash,通常意味着你需要通过爆破(如果输入范围小)或者去 cmd5 网站查询,或者使用“长度扩展攻击”(如果是特定题型)。
-
RSA: 看到大数模幂运算
c = m^e mod n。- 逆向策略: 识别出这是 RSA,从程序中提取出
N(模数) 和E(公钥指数)。不需要自己算,把参数丢给RsaCtfTool或用 Python 脚本解。
- 逆向策略: 识别出这是 RSA,从程序中提取出
-
-
程度要求:
-
不需要理解背后的数论证明。
-
只需要知道:输入是什么?密钥在哪里?输出是什么? 然后找现成的解密脚本或工具。
-
第四层级:神器 Z3 Solver (必须学会)
对于逆向选手来说,很多时候我们不需要手动推导逆运算(特别是当加密逻辑充斥着位运算、溢出截断或复杂的混合运算时)。
-
你需要掌握:
- 微软的 Z3 Theorem Prover (Python
z3-solver库)。
- 微软的 Z3 Theorem Prover (Python
-
程度要求:
-
能够将汇编代码逻辑“翻译”成 Z3 的约束条件。
-
让计算机帮你“解方程”得到 Flag。这是逆向选手的杀手锏。
-
总结:你的技能树点法
-
眼力 (Pattern Recognition): 看到常量
0x9E3779B9知道是 TEA,看到256次循环赋值知道是 RC4,看到/和%知道是取模或编码。 -
工具使用 (Tooling):
-
IDA/Ghidra 插件: FindCrypt(找算法常量)。
-
CyberChef: 网页版瑞士军刀,快速测试 Base64、XOR、Hex 等。
-
Python 库:
pwntools,pycryptodome,z3-solver。
-
-
代码还原能力: 就像你刚才做的,把汇编/伪代码手动转为 Python 逆向脚本。
建议:
刚开始不需要深究 AES 内部具体的数学原理(那是 Crypto 选手的事),你只需要:认出它是 AES -> 找到 Key -> 调库解密。只有当你遇到“魔改版 AES”(修改了 S-Box 或轮数)时,才需要深入算法细节。