异或夯基

Realknow Lv2

异或夯基

Create by Gemini

1. 异或的基本性质

首先,我们要掌握异或运算的三个数学基石:

  1. 归零律:

    AA=0(任何数与自己异或,结果为0A \oplus A = 0(任何数与自己异或,结果为 0)

  2. 单位律:

    A0=A(任何数与0异或,结果不变)A \oplus 0 = A(任何数与 0 异或,结果不变)

  3. 结合律/交换律:

    (AB)C=A(BC)(A \oplus B) \oplus C = A \oplus (B \oplus C)


2. 形式化推导

假设我们有一个原始数据(明文)M 和一个密钥 K,加密过程是:

C=MK(这里C是加密后的密文)C = M \oplus K(这里 C 是加密后的密文)

我们要证明: 已知 C 和 K,可以还原出 M。

推导步骤:

  1. 在等式两边同时异或 K:

    CK=(MK)KC \oplus K = (M \oplus K) \oplus K

  2. 利用结合律,改变右边的运算顺序:

    CK=M(KK)C \oplus K = M \oplus (K \oplus K)

  3. 利用归零律

    KK等于0:K \oplus K 等于 0:

    CK=M0C \oplus K = M \oplus 0

  4. 利用单位律

    M0等于M:M \oplus 0 等于 M:

    CK=MC \oplus K = M

结论: 只需要把密文和密钥再异或一次,就得到了明文。


3. 为什么这在逆向题目中很重要?

回到你给出的那道题,它的加密逻辑是:

1
__b[i] = __b[i] ^ __b[i-1]

这意味着当前的字符是靠“前一个字符”来加密的。在解密时:

  1. 已知 __b[0] 是确定的(因为它没参与循环)。

  2. 第二个字符 __b[1] 的加密公式是:

    New_b[1]=Old_b[1]New_b[0]New\_b[1] = Old\_b[1] \oplus New\_b[0]

  3. 根据我们上面的推导,逆运算就是:

    Old_b[1]=New_b[1]New_b[0]Old\_b[1] = New\_b[1] \oplus New\_b[0]

这就解释了为什么你只需要用 global 数组中相邻的两个字节互相异或,就能把 Flag 还原出来。


4. 直观理解

你可以把异或看作是一个“翻转开关”。

  • 如果 K 的某一位是 1,它就会把 M 对应的那一位翻转(0变1,1变0)。
  • 如果你再用 K 异或一次(再按一次开关),那一层翻转就又变回去了。

这就是为什么它是“自反”的。

  • Title: 异或夯基
  • Author: Realknow
  • Created at : 2026-02-23 11:19:24
  • Updated at : 2026-02-23 11:51:54
  • Link: https://realknowtech.github.io/2026/02/23/异或夯基/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
异或夯基