AES CBC 字节翻转攻击


简单介绍一下 AES CBC 字节翻转攻击

0x00 AES CBC 流程

一图胜千言

解释一下加密流程

  1. 首先首先将明文分组 (常见的以 16 字节为一组),位数不足的根据不同规则进行填充。
  2. 生成一个初始化向量 (IV) 和一个密钥。
  3. 将 IV 和第一组明文异或。
  4. 用密钥对 xor 后产生的密文加密。
  5. 用 key 产生的密文对第二组明文进行 xor 操作。
  6. 用密钥对 xor 产生的密文加密。
  7. 重复 4-7,到最后一组明文。
  8. 将IV和加密后的密文拼接在一起,得到最终的密文。

也可参考下面简洁一些的公式

  • Ciphertext-0 = Encrypt(Plaintext XOR IV)—只用于第一个组块
  • Ciphertext-N = Encrypt(Plaintext XOR Ciphertext-(N-1))—用于第二及剩下的组块

那么可以得到解密流程图如下

0x01 攻击原理

了解了加解密流程后,我们可以找到攻击的点。如果我们改变 Ciphertext-(N-1) 的一个字节,然后与下一个解密后的组块异或,我们就可以得到一个不同的明文了。 举两个例子

  • HCTF-GAME 2017 explorer的奇怪番外5

    题目要求输入一段 token,aes 解密后明文是 admin:alvndasjnc。提供了注册功能,但是不能直接输入明文。 对于这道题来说我们可以 > 注册 bdmin:alvndasjnc,得到 token: 8eb9e846f62c5036a8bfa2bd3f6ff9c65d7b15e6eb0494081a7f1c74e9cc4e37a7585b5a9d17d775291595adaa12701c, > 更改 IV 的首字节 > 根据 0x8e xor 0x62 xor 0x61 = 0x8d 得到: 8db9e846f62c5036a8bfa2bd3f6ff9c65d7b15e6eb0494081a7f1c74e9cc4e37a7585b5a9d17d775291595adaa12701c, 提交拿到 flag

  • TCTF 2017 integrity

    这个题和上一个很像,依然是构造 admin 的 token。只不过加密的部分多了一段 md5。 其流程为,先将明文填充,然后将其做 md5 摘要,将摘要和明文填充合并做md5加密, 返回IV + enc(md5(pad(plain)) + pad(plain))。在解密的时候,如果检测到 md5 不匹配则拒绝返回。 这次我们直接注册md5(pad('admin'))+pad('admin'),将返回的值去掉 IV 作为 token,这样第一段相当于把第一段密文作为 IV,就可以还原出 admin,拿到 flag。

0x02 总结

总的来说,字节翻转攻击就是利用 CBC 模式加密流程中的缺陷结合异或操作来改变明文。即使你不知道 AES 加解密的 key 是多少,只要你能获取到 IV,你就可以构造明文对应的 token。