可以看到要求的输入长度是64个字符,前面是简单的验证输入的字符是否合规,红框圈起来的函数是主加密函数,下面可以不用分析了。
动态调试F7步入函数。
加密部分可以划分为三块,每一块都是用AVX2汇编实现的,类似于进行了内联汇编。这是第一部分,将我们的输入与ebp-40处开始的32个字节进行异或操作并保存到ymm0处。
第二部分是使用vphufb根据ebp-60处的32字节对ymm0处存放的数据进行重排。
c语言代码表示vpshufb ymm0, ymm0 , index
1 | for (int i = 0; i < 32; ++i) |
最后是比较部分,ebp-20处存放的是比较数据。
那么逆向过程就是:
- 提取比较数据
- 重排
- 异或
1 |
|
逆向过程没啥障碍,写脚本的时候flag[changedata[31-i]]=cmpdata[31-i];
31写成了32,造成了越界,但是非常的不明显
离谱的是vscode有时候能跑起来有时候跑不起来,这里记录一下,以后注意这个问题,可能需要安装一个检测这种小错误的插件。