AES Cache 攻击实验

踩坑记录 专栏收录该内容
4 篇文章 0 订阅

大家做这个的懂的都懂,想要做个像样的复现实验是比较难得(网上的资料少),这里就给大家介绍一个使用了多线程和共享内存的环境来复现 Cache 攻击,(PS:代码中的共享内存和多线程我不会讲的,你在阅读代码的时候就会看到攻击代码就是用到了)

1 实验环境

配置参数
openssl 版本OpenSSL 0.9.8
虚拟机操作系统ubuntu20
编译器gcc 与 g++

2 要点

首先要下载 openssl 0.9.8 ,编译好,攻击源代码也有现成的Cache AES 复现代码,该攻击代码有4种攻击实现,我们挑选第一种(对应的文件是 keyrecov_full.cpp),看起来好像什么都有,但实际上想在你的计算机上运行成功得花很多功夫配置环境,这篇文章主要就是讲我在配置环境中遇到的问题以及解决方法。其他的内容都是顺带一提,因为这方面很多有很多资料。当然我会附上所有该实验相关的所有资料在结尾的参考资料中,包括攻击原理,配置环境遇到问题的解决等

3 原理

做这个的应该都懂的吧,就是查表实现的AES在加密过程中的密钥信息可以被cache这个侧信道所探测到,进而会发生被攻击者破解秘钥的可能。下面附几张图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 攻击及大致过程

在这里插入图片描述
选用的方法利用前两轮加密以及任意一表段:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
就是分了两步,第一步利用第一轮服务了每一个字节中的高4位,第二轮再回复余下的
原作者的攻击代码结果:
在这里插入图片描述

5 问题解决

这是重点!
攻击代码有4中攻击,我们只实现第一种,所以只需要用到里面的 keyrecov_full.cpp,从修改这个文件到成功编译和运行会遇到如下问题:
配置实验环境遇到的问题:

  • 动态库中符号地址问题
  • 动态库加载问题
  • openssl 0.9.8 编译问题
  • cacheutils.h 头文件缺失问题

5.1 openssl 0.9.8 编译问题

  1. 打开md5-x86_64.pl 文件 vim openssl-0.9.8e/crypto/md5/asm/md5-x86_64.pl
  2. 在指定位置填入内容:
    在文件的 sub round1_step
    { my ($pos, $dst, $x, $y, $z, $k_next, $T_i, $s) = @_;
    这两行的后面加入:
    + $T_i = unpack("l",pack("l", hex($T_i))); # convert to 32-bit signed decimal
    请注意,填进去的时候不要加上前面的 +
    类似地,在本文件的sub round2_step, sub round3_step 和 sub round4_step相应的位置都加上这行
    这样弄完之后还有一步,配置 config 生成动态库文件,我们做的实验就需要动态库,使用 config 命令的时候我们需要加上 shared 选项,这样编译之后就可以得到 libcrypto.so.0.9.8 文件了

5.2 动态库中符号地址问题

使用 objdump -tnm -s 可以获取动态链接库中符号的地址,可以参考 动态链接库的地址
keyrecov_full.cpp (项目中我们需要的文件)中有这样一段代码:

int T[4] = {0x125260, 0x124e60, 0x124a60, 0x124660}

这个是AES使用的4个查找表在动态链接库的地址,OpenSSL在加密的时候使用的函数是 AES_encrypt ,加密的时候使用了 Te0 Te1 Te2 Te3 这个四个表,使用如下命令获取:
objdump -t libcrypto.so.0.9.8 | grep Te
在这里插入图片描述
将这个结果与原来的那4个值替换

5.3 cacheutils.h 头文件缺失问题

这个文件在这个 github 仓库中,仓库连接,兄弟不要觉得麻烦,解决问题就是这么曲折
在这里插入图片描述
仅仅把图中箭头指向的文件拿过来就行,不用担心需要额外修改,攻击代码的作者应该就是引用的这个仓库的代码

5.4 动态库加载问题

在编译 keyrecov_full.cpp (项目中我们需要的文件)的时候,用如下命令:

g++ keyrecov_full.cpp -I /home/tam/openssl-0.9.8f/include/ -L /home/tam/openssl-0.9.8f/ -lcrypto -g

相应的目录换成你自己的即可,结果会生成一个名为 a.out 的可执行文件,但是出现问题,因为找不到动态库文件(没错,你编译的时候已经指定了动态库的位置,但是运行的时候该可执行文件仍然找不到),所以你需要设置 ld.so.conf 文件,将动态库所在的目录填入该文件中,步骤如下:
vim /etc/ld.so.conf # 打开该文件
在这里插入图片描述
然后运行命令:
sudo ldconfig

即可运行

6 结果与总结

在这里插入图片描述
上面是在我电脑上跑的样子,这是第一阶段,也就是预测密钥的每个字节的高4bit,可以看到总体来说还算比较准确的吧,想要更好的效果,你就还得深入研究一样这个代码了

写的并不是保姆级教学,仍有不懂的童鞋可以私聊我。

7 参考资料

  1. 查找符号地址的工具
  2. 攻击原理
  3. 攻击代码
  4. https://github.com/IAIK/cache_template_attacks
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值