CBC字节翻转攻击

  • A+

前言

bash
1、在ECB模式的基础上,增强了块与块之间的联系。
2、明文块先与IV XOR运算后,在进行加密,得到的密文充当下一个明文区块的IV...
3、明文块填充方式,如果明文为abcd,长度为4,则需要填充12位,12的十六进制为x0C,在最后加密的明文为abcdx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0C

加密

image.png

解密

image.png

利用

字节翻转攻击

密文通过block cipher encryption解密,得到中间密文,中间密文与IV(前一个密文区块)异或后得到的是明文,因此可以通过攻击IV,来改变最终的明文。

```bash
中间密文 ^ 原先IV = 原始明文
中间密文 ^ 伪造IV = 伪造明文

伪造IV = 原始IV ^ 原始明文 ^ 伪造明文
通过篡改IV,来改变密文解密之后的明文
```

例子

```php
// flag.php
<?php
$key = "8bd54bcfe6a23fc0";
$flag = "flag{admin_or_guest}";
?>

// index.php
<?php
error_reporting(0);
include("flag.php");

$iv = 'NGY0MWVlOGE2MGU4NTkxMQ==';
function decode($str,$key,$iv)
{
return openssl_decrypt(base64_decode($str),"AES-128-CBC",$key,OPENSSL_RAW_DATA,base64_decode($iv));
}

function encode($str,$key,$iv)
{
return base64_encode(openssl_encrypt($str,"AES-128-CBC",$key,OPENSSL_RAW_DATA, base64_decode($iv)));
}

if(isset($_COOKIE['username']) && isset($_COOKIE['iv'])){
if(decode($_COOKIE['username'],$key,$_COOKIE['iv']) === "admin"){
echo "hello admin
";
echo $flag."
";
}
else if(decode($_COOKIE['username'],$key,$_COOKIE['iv']) === "guest"){
echo "hello guest
";
}
else {
echo "iv or username error";
}
}
else{
$enc = encode("guest",$key,$iv);
setcookie('username',$enc);
setcookie('iv',$iv);
}
highlight_file(file);
?>
```

  • 启动环境

bash
php -S 0:80

  • 访问URL

image.png

再次刷新

image.png

  • 分析源代码

可以知道代码解密得到的用户名为 admin 时,会得到flag。

所以可以利用CBC字节翻转攻击,将密文解密成任意明文。

  • Solve

```python
import base64

iv = base64.b64decode('NGY0MWVlOGE2MGU4NTkxMQ==')
admin = 'admin' + 'x0b'11
guest = 'guest' + 'x0b'
11

new_iv = ''
for i in range(len(admin)):
new_iv += chr(ord(iv[i]) ^ ord(admin[i]) ^ ord(guest[i]))

print base64.b64encode(new_iv)
# Mnc8K39lOGE2MGU4NTkxMQ==
```

替换cookie中的iv为new_iv

image.png

相关推荐: 除了OD和IDA,你还用过什么逆向工具?(完结篇)

译文声明 本文是翻译文章,文章原作者Itay Cohen,文章来源:https://www.megabeets.net 原文地址:https://www.megabeets.net/5-ways-to-patch-binaries-with-cutter/#G…