这道题目我想写的东西不是很多,前面的部分按常规流程走,第一步我们写逆脚本,推算出数组v15的值,但是输出值却没有啥用,只是告诉我们,the first parts are flag ,没多大用,然后后面就是变表base64加密,加密了10,放到相关网站上去解密,得到了一个网址,那个网址是一篇看雪的文章,我看了一下,大概的意思就是,出题者要想做题者做不出题目来,就要将做题人带到沟里去,而不是在他们在按常规做题的路上设置障碍,那这道题就麻烦了,因为我们被带偏了,这道题难点就在这里,所以也只能去看wp了,发现关键点如下
我们双击进入这个数组,别问为啥,这是我一直忽略的一个关键点
关键点不在这个数组,而是在这个数组后面的那些未知数据,点击这个函数名,ctrl+x进入
f5反编译,转为c代码,如下
接下来就是分析这段代码,也不咋好分析,一大堆的干扰项,首先直接看if条件了,其他的不管,将两个数转为string形式,分别为f和g,再看byte_6cc0a0和byte_6cc0a3在名字上只差了三位,和flag差不多,首位f,末尾g,中间差三位,那由此我们可以逆推出v1和v4,但她两又是相互赋值的,所以她两等于一个数组,点进数组byte_6cc0a0提取四个数据出来,然后将他们和flag依次异或,得到四个数据,这个数据也就是下方for循环中的v4,v4有4为,j%4也有四种结果,刚好对应,那最后就上代码
#include<iostream>
using namespace std;
int main()
{
int num[]= {
64, 53, 32, 86, 93, 24, 34, 69, 23, 47,
36, 110, 98, 60, 39, 84, 72, 108, 36, 110,
114, 60, 50, 69, 91,0
};
int arm[] = { 0x40,0x35,0x20,0x56 };
char rm[] = "flag";
int cc[4];
for (int k = 0; k < 4; k++)
{
cc[k] = rm[k] ^ arm[k];
//printf("%c", cc[k]);
}
for (int i = 0; i<=24; i++)
{
num[i] ^= cc[i % 4];
printf("%c", num[i]);
}
return 0;
}
非常规,难搞的分析,极多的干扰项,< ?_? >