关键运算都在main函数
根据提示,我们要输入6次数据,在经过两次处理后的得到的数据,将其转成16进制再变成字符串
第一个处理
这是将输入的六个数据每次取两个,分别给dword_601078和dword_60107c,然后通过sub_400686这个函数进行运算
byte_601060里是四个数据 : 2 2 3 4
进到sub_400686内部
它里面是递加,我们可以递减来实现解密
再看第二处
通过逻辑直接可以推出改变后的6个数
xorm[0] = 3746099070;
xorm[1] = 550153460;
xorm[2] = 3774025685;
xorm[3] = 1548802262;
xorm[4] = 2652626477;
xorm[5] = 2230518816;
然后根据第一处写解密脚本
#include <stdio.h>
int main()
{
unsigned int xorm[6];
xorm[0] = 3746099070;
xorm[1] = 550153460;
xorm[2] = 3774025685;
xorm[3] = 1548802262;
xorm[4] = 2652626477;
xorm[5] = 2230518816;
int i = 0,j=0,sum;
unsigned int temp[2] = {0};
unsigned int data[4] = { 2,2,3,4 };
for (i = 0; i < 5; i += 2)
{
temp[0] = xorm[i];
temp[1] = xorm[i + 1];
sum = 0x458BCD42 * 64;
for (j = 0; j < 64; j++)
{
temp[1] -= (temp[0] + sum + 20) ^ ((temp[0] << 6) + 3) ^ ((temp[0] >> 9) + 4) ^ 0x10;
temp[0] -= (temp[1] + sum + 11) ^ ((temp[1] << 6) + 2) ^ ((temp[1] >> 9) + 2) ^ 0x20;
sum -= 0x458BCD42;
}
xorm[i] = temp[0];
xorm[i + 1] = temp[1];
}
for (i = 0; i < 6; i++)
printf("%x",xorm[i]);
}
这是16进制输出的,转成字符串
得到flag: flag{re_is_great!}