前言
bash
1、在ECB模式的基础上,增强了块与块之间的联系。
2、明文块先与IV XOR运算后,在进行加密,得到的密文充当下一个明文区块的IV...
3、明文块填充方式,如果明文为abcd,长度为4,则需要填充12位,12的十六进制为x0C,在最后加密的明文为abcdx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0Cx0C
加密
解密
利用
字节翻转攻击
密文通过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
再次刷新
- 分析源代码
可以知道代码解密得到的用户名为 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
相关推荐: 除了OD和IDA,你还用过什么逆向工具?(完结篇)
译文声明 本文是翻译文章,文章原作者Itay Cohen,文章来源:https://www.megabeets.net 原文地址:https://www.megabeets.net/5-ways-to-patch-binaries-with-cutter/#G…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论