0x00 AES CBC 流程

不讲具体实现,只讲大致流程
首先是一图胜千言系列

Cbc_encryption

解释一下加密流程

  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))—用于第二及剩下的组块

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

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。