这道题很给出一个MD5,求解发现是nuaa,但是在IDA里面我们可以知道要求输入的是int型,所以我们要转成数字形式,这里注意数字的存储方式,小端储存,我们输入1633777006,第一关就过了。
我们可以看到这波操作是针对 byte_404040数组的,搜索一下_mm_loadu类(长这样的函数)的作用,我们就能够跑出来这个迷宫来(byte_404040数组不是迷宫,要经过上图的处理才变成迷宫,所以我们要把它恢复成迷宫的样)
#include <iostream>
using namespace std;
unsigned int byte_404040[208] = {
0x45, 0x5E, 0x4A, 0x4A, 0x2B, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x41, 0x41,
0x4E, 0x55, 0x41, 0x41, 0x4E, 0x55, 0x41, 0x41, 0x4E, 0x5E, 0x4A, 0x41, 0x45, 0x5E, 0x4A, 0x4A,
0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x55, 0x4A, 0x4A, 0x4E, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x4A, 0x4A,
0x45, 0x5E, 0x41, 0x4A, 0x45, 0x5E, 0x41, 0x41, 0x4E, 0x55, 0x41, 0x41, 0x4E, 0x55, 0x41, 0x41,
0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x4A, 0x4A, 0x4E, 0x5E, 0x4A, 0x41,
0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x55, 0x4A, 0x4A, 0x4E, 0x5E, 0x4A, 0x4A,
0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x41, 0x4A, 0x45, 0x55, 0x4A, 0x4A, 0x45, 0x5E, 0x4A, 0x4A,
0x45, 0x5E, 0x4A, 0x41, 0x45, 0x5E, 0x41, 0x4A, 0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x4A, 0x4A,
0x4E, 0x5E, 0x4A, 0x41, 0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x55, 0x4A, 0x4A,
0x01, 0x55, 0x41, 0x41, 0x4E, 0x55, 0x41, 0x41, 0x4E, 0x55, 0x41, 0x4A, 0x45, 0x5E, 0x4A, 0x4A,
0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x5E, 0x4A, 0x4A, 0x45, 0x75, 0x61, 0x61, 0x2A, 0x20, 0x33, 0x2D,
0x3B, 0xFE, 0x8D, 0xE2, 0x82, 0x2D, 0x32, 0x37, 0x39, 0xB3, 0x24, 0x8D, 0x2A, 0xB3, 0x24, 0x8C,
0x1D, 0xB3, 0x24, 0x8F, 0x5D, 0xB3, 0x24, 0x8E, 0x1B, 0xB3, 0x24, 0x91, 0x59, 0xB3, 0x24, 0x90
};
int nuaa[4]={0x6e,0x75,0x61,0x61};
int main()
{
for(int i=0;i<208;i++)
byte_404040[i]=(byte_404040[i]^nuaa[i%4]);
for(int i=0;i<208;i++){
if(i%13==0)
cout<<endl;
cout<<(char)byte_404040[i];
}
return 0;
}
结果迷宫就出来了:
++++E++++++++
+ +
+ +++++++++ +
+ +++++++++ +
++ +
+++++++++++ +
+ +++++++++ +
+ +++++++++ +
+ +++++++++ +
+ +++++++++ +
+ +++++++++ +
+o +
+++++++++++++
从o走到E:RRRR RRRR RRUU UUUU UUUU LLLL LLLU
但是到这里我们又会发现,它又只是让我们输入7个数字,
这7个数字便能代表上面的URLD来完成走出迷宫
继续往下看sub_401130函数 image.png
aDurl数组存放的就是"DURL",可以分析得到,一个数通过aDurl数组转换成4个字符存放在v2中便是迷宫的DURL,于是我们可以推出7个数为 170 170 165 85 85 255 253
第二关通过
接下来第三关:
发现让我们输入flag却没有任何判断函数,if 里面的东西讲真看不懂是什么操作,那么只能动态调试了,
在汇编中我们可以看到 If 语句对应的是调用一个函数,单步跟进去发现这个 image.png create_function再F5 image.png
这里就能写个脚本跑出flag了
#include <iostream>
using namespace std;
int main()
{
char a[18]={'D','s','3','u','7','w','Y','N','{','V','y',';','S','`','=','|','c','h'};
for(int i=0;i<18;i++){
cout<<(char)(a[i]^i);
}
cout<<endl;
return 0;
}
所以flag 就是 Dr1v3r_Is_s0_m3ssy
网友评论