type
status
date
slug
summary
tags
category
icon
password
😀
这周其实没有学什么新的东西,实验室在修东西搬东西什么的。主要还是做题了这周,同时也复习了一下AES算法和回顾了白盒AES算法
这周就主要复习了之前的知识,包括AES加密算法(主要是AES-128),白盒AES,如何用DFA求解白盒AES

📝 本周周报

👉
复习这些知识主要是有一个师傅给了一道题,我就尝试做了一下,主要记录自己在做题中的思路,以及做完这道题的思考

事件起因

晚上的时候看群里面有一个师傅在求救,当时闲来无事出于好奇就加了师傅,然后师傅给了我一道题
notion image
notion image
得到题目以后就开始复现了

学习的内容

AES算法复习

AES-128接收16字节的明文输入,16字节的密钥,输出16字节的密文结果。
notion image
接下来进入AES的世界,下方是整体流程图
notion image
如果只讲具体的数学原理过于抽象,我们就选择简单的概括一下
在AES加密中通常分以下四个模块: 设中间值变量为state,它通常被描述为一个二维的字节数组,即,一个4×4数组。
  • 轮密钥加(AddRoundKey):中间值state与16字节轮密钥进行异或。
  • 字节替换(SubBytes):通过S盒完成一个字节到另一个字节的映射
  • 行位移(ShiftRows):中间值state矩阵内部字节之间进行置换
  • 列混淆(MixColumns):中间值state左乘一个在GF(256)上面的可逆矩阵,每次更新只影响中间值state的一列(4个字节)。 加密中每轮的密钥分别由种子密钥经过密钥扩展算法得到,具体加密流程如下:
    • notion image
aes.c
main.c
aes.h

基于表实现的AES算法(白盒AES)

1、重新定义循环将AddRoundKey(state,k0)加入循环中,并将AddRoundKey(state,k9)移出循环,具体加密流程如下:
notion image
2、将for循环内中ShiftRows移至于第一,其次为AddRoundKey,SubBytes,MixColumns.
交换ShiftRows与SubBytes位置
我们都知道ShiftRows是一种线性变化,SubBytes是一个字节到另一个字节的映射。
交换ShiftRows与AddRoundkey位置
中间值状态S t a t e StateState每次应于相应的 轮密钥k kk做异或运算,因此如需要交换ShiftRows与AddRoundkey位置,可以对轮密钥k kk做同样的置换运算,然后交换行移位和轮密钥加进行一个交换 最终加密流程:
notion image
经过以上处理后,我们可以开始构造相应查找表T-box,Ty_tables,XOR tables,TyiboxsT-boxs
在每一轮中,AddRoundKey和SubBytes可以组合成16个将字节映射到字节的查找表(8bit进8bit出)。
notion image
这其中包括k9,k10这两轮所以说一共有160个T-box盒
我们定义T-box[10][16][256],其中10为轮数,16为字节个数,256是字节值
Tyi_tables
在第1轮到第9轮中,在每个字节通过T-box进行映射后,然后将其输入到一个混合列转换中。
因MixColumns 每次作用在一列,可由32×32的矩阵 MC 乘32比特的列向量表示,在白盒实现中加密时的 MixColumns 与解密时的 MixColumns 逆操作都可通过四个较小规模的8bit输入到32bit输出的查找表操作后再通过异或的方式完成。
notion image
最后MixColumns可表示为4次查表于3次异或操作(异或需要借助XOR tables):
notion image
XOR tables
Xor tables用于对于每轮当中的两个半字节进行一个查表的异或运算,因此我们定义数组为:
Xor tables[9][96][16][16],其中9为轮数,96为一轮所需的异或次数,16,16为4bit数所有可能值。
表合并
T-boxs表于Tyi_tables实际上可以进行合并成为新的表Tyiboxs,组合查找表可以减少执行加密所需的单个表的访问次数。合并方法如下所示:
notion image
注意:TyiBoxes仅用于前9轮加密,第10轮加密中仍需要用到TBoxes。
最后基于表的AES加密流程如下:
notion image
代码实现如下:
 
总结一下:
其实白盒AES的目的就是隐藏密钥使得解密者无法定位到密钥

DFA攻击

DFA也被称作差分故障攻击
DFA的原理很长,我在这里就是简述
首先我们知道AES加密要经过十轮加密,但是我们要是在第九轮的时候更改了某一个密文的的值,后续的结果是不是会发生变化
故障的效果是随机修改state中某一个字节,那么我们应当意识到,图中四个时机点,效果是等价的,这在4.1里就验证过了,只要没经过列混淆,那么错误就只影响一个字节。那么“倒数两个列混淆之间发生故障对密文的影响”只需要看最后一个列混淆前发生故障对密文的影响即可。
notion image
因为后面这五步骤里,只有一次列混淆,所以会导致结果中四个字节改变。这是很好推断的,我们再仔细瞧瞧,有没有别的规律。
如果故障字节位于第一列,那么其最终一定会改变第一、第八、第十一、第十四这四个字节。
如果故障字节在第二列呢
notion image
最终会改变第二、第五、第十二、第十五这四个字节。
第三列
notion image
最终会改变第三、第六、第九、第十六这四个字节
第四列
notion image
最终改变第四、第七、第十、第十三这四个字节
我们发现,结果中发生改变的四个字节有其规律,只有四种变法。
这里总结一下
  • 如果故障早于倒数第二个列混淆,那么会影响结果中的十六个字节
  • 如果故障发生在倒数两个列混淆之间,那么会影响结果中的四个字节,且依照故障所发生的列,仅存在四种“模式”。
  • 如果故障晚于最后一个列混淆,那么会影响结果中的一个字节
然后差分故障攻击呢其实就是为了得到故障的密文,然后从故障密文得到最后一轮的密钥
然后我们就可以用开源的工具去跑,然后就可以得到最初的密钥
这里建议使用phoenixAES
phoenixAES 可以通过pip直接安装,tracefile中,第一行传正确密文,后面传入故障密文。
例子:
notion image
具体在题目中的体现,就是2023强网杯dotdot,C#语言编写的
实现的就是这样的效果
notion image

师傅给的题目

正常upx脱壳之后,64位程序
主要逻辑很简单,首先是检测输入flag的格式满足: flag{}
notion image
sub_40273B是加密函数
notion image
因为是练习的缘故,为了使伪代码阅读更顺畅,这里选择了类型修复
这里就是取flag{}里面的内容进行处理,把每一个字节的前4位放到v12里面,后4位放到v11里面
notion image
我们看后面的两个函数
notion image
sub_402193函数明显就是两个6x6的矩阵相乘
notion image
sub_402276函数就是和另一个数组相加
notion image
接下来我们就要分析sub_40265F和sub_402483函数
notion image
先看sub_402483函数,很明显是个比较函数,经过加密的v10和v9分别和v4,v3进行比较
sub_402555函数的作用就是根据函数的参数a2生成不同的下标值,然后再从a1(我们要进行加密数据里面挑选并重新组合成新的数组,然后再进行加密)
notion image
所以我们分析sub_4024E0函数就行,
notion image
notion image
AES加密的伪代码
这个基本上没有经过魔改,s_box的值也没有变,就最好进行了一次异或0x55,解密的时候再异或一次就行
静态分析完毕之后我们动态调
发现有反调试,这个时候我们取start函数里面看
这里patch掉就行
notion image
这里其实出题在初始化函数的时候留了坑
这里是检测调试器和对数值进行了异或
对AES的密钥进行了异或
notion image
前面下标值的获取是通过动态调试直接得到
notion image
直接单步跳过F8
notion image
这里求解矩阵我选择的是z3求解
exp
decode.py
main.c
notion image

遇到的问题

其实在做这个题的时候还是遇到了一些问题,比如说求解矩阵,刚开始没想到用z3,而且用z3定义变量也得是向量(BitVec)而不能用整数(Int)
感觉自己对这种反调试之类的还是不太敏感,还是要多做题积累
这周事情太多了,MFC和WIN32API都还没怎么动手看
现在做国际赛的题目,现在遇到的好多都是js逆向,要不要去学一下js?

🤗 总结归纳

师傅给的这道题很适合做算法加密类的逆向题练习,下周的会回到正常的学习轨道,实验室的东西都处理好了

📎 参考文章

 
💡
有关学习上的问题,欢迎您在底部评论区留言,一起交流~
日常比赛记录周报(三)
Loading...
5m10v3
5m10v3
目前主攻方向为Re
Announcement
🎉5m10v3のBlog已经上线啦🎉
-- 感谢各位师傅的支持 ---
👏欢迎师傅们前来交流👏