ctfshow七夕杯2022easy_magic

分析

首先查壳,64位无壳

image-20220811232926186

然后放入IDA中分析,先去字符串那里查找关键词

image-20220811233006978

然后交叉引用进去就能够看到了

image-20220811233120222

image-20220811233137201

首先可以看到43行有一个累加的过程,然后下面有一个sub_219B函数不知道是什么,然后点进去看

image-20220811233244373

这里有三个函数分别点进去看一下第一个sub_AB6

image-20220811233315269

没发现什么去下一个看一下sub_1F7D

image-20220811233400827

又有一个函数,进去看一下

image-20220811233427853

看到这里的时候就联想到之前做的题目,知道这是md5的加密,那么sub_219B这一整个大的函数就是将v10 md5进行加密然后给s1,最后通过if语句与s2进行md5值比较来判断输出是否正确

那么解题的思路应该就是直接将s2去md5解密就可以得到v10也就是flag了,去网站看一下能否解出

image-20220811233934218

可惜网站破不出,那么只能写脚本来还原v10数组了

逻辑很简单,就是将v5的值累加给v10,但是这个累加过程没有v10[0],而v10[0] = v4;由于这是ctfshow比赛,那么猜一下v4=v5=v10[0]=’c’,然后就开始写脚本

脚本

#include<stdio.h>
#include<string.h>
int main()
{
char v4;
char v7[32];
char v10[104];
char v5;
v7[0] = 17;
v7[1] = -14;
v7[2] = 13;
v7[3] = -11;
v7[4] = 7;
v7[5] = 8;
v7[6] = 4;
v7[7] = -68;
v7[8] = 65;
v7[9] = -25;
v7[10] = 7;
v7[11] = 6;
v7[12] = -11;
v7[13] = 6;
v7[14] = -8;
v7[15] = 10;
v7[16] = 10;
v7[17] = -20;
v7[18] = 9;
v7[19] = -3;
v7[20] = 13;
v7[21] = -13;
v7[22] = 24;
v5 = 0;
v4 = 'c';
v5 = v4 ;
v10[0] = 'c';
for(int i=0;i<23;i++)
{
v5 += v7[i];
v10[i+1] = v5;
}
for(int j=0;j<=strlen(v10);j++)
{
printf("%c",v10[j]);
}
}
//ctfshow{7x_flag_is_here}

总结

这道题虽然逻辑简单,但是我想说的是这次终于看到了学以致用的题目,之前就看到过_ROL4_ 的md5,很激动❤