Skip to content

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 脚本解。
  • 程度要求:

    • 不需要理解背后的数论证明。

    • 只需要知道:输入是什么?密钥在哪里?输出是什么? 然后找现成的解密脚本或工具。


第四层级:神器 Z3 Solver (必须学会)

对于逆向选手来说,很多时候我们不需要手动推导逆运算(特别是当加密逻辑充斥着位运算、溢出截断或复杂的混合运算时)。

  • 你需要掌握:

    • 微软的 Z3 Theorem Prover (Python z3-solver 库)。
  • 程度要求:

    • 能够将汇编代码逻辑“翻译”成 Z3 的约束条件。

    • 让计算机帮你“解方程”得到 Flag。这是逆向选手的杀手锏。


总结:你的技能树点法

  1. 眼力 (Pattern Recognition): 看到常量 0x9E3779B9 知道是 TEA,看到 256 次循环赋值知道是 RC4,看到 / 和 % 知道是取模或编码。

  2. 工具使用 (Tooling):

    • IDA/Ghidra 插件: FindCrypt(找算法常量)。

    • CyberChef: 网页版瑞士军刀,快速测试 Base64、XOR、Hex 等。

    • Python 库: pwntools, pycryptodome, z3-solver。

  3. 代码还原能力: 就像你刚才做的,把汇编/伪代码手动转为 Python 逆向脚本。

建议:

刚开始不需要深究 AES 内部具体的数学原理(那是 Crypto 选手的事),你只需要:认出它是 AES -> 找到 Key -> 调库解密。只有当你遇到“魔改版 AES”(修改了 S-Box 或轮数)时,才需要深入算法细节。