TEA

看题目以为是TEA加密

893db9c72135491facc261a7c8a51c4.png

查壳 :64位无壳exe程序

7f312f8ff2ec08b77388bff84e62a31.png

扔到64位IDA里面 找到main函数F5反编译出伪代码

2b51696baf478e37557d8f47554225f.png

分析一下主函数:

用户先输入一个字符串后经过加密最后与encoude_flag 进行比较

查看一下这个encode_flag字符串

7a749900e2593a0ea7101bdadf18160.png

在字符串列表界面看更直观一点

44741190e0425acf378fd3aed78324b.png

像flag吗 像的

试着交一下,就是flag

Maze

一看题目名字maze知道是迷宫题

那么题目描述中的wasd自然就是移动方式

16ec4434a2573825bfa3d01e5a30ce7.png

老规矩查个壳

64位无壳exe程序

e28067fc981e7d1c28e7a49e670ce72.png

丢IDA反编译

主函数伪代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
char v3; // [rsp+27h] [rbp-9h] BYREF
int v4; // [rsp+28h] [rbp-8h]
int v5; // [rsp+2Ch] [rbp-4h]

_main(argc, argv, envp);
v5 = 0;
v4 = 0;
puts(
"There may be circumstances that you win the game but the flag is not right.Pay attention to the title of this game.");
while ( 1 )
{
while ( 1 )
{
puts("input your choice:");
scanf(" %c", &v3);
if ( v3 == 119 || v3 == 115 || v3 == 97 || v3 == 100 )
break;
puts("Invalid choice!");
}
if ( v3 == 119 )
--v5;
if ( v3 == 115 )
++v5;
if ( v3 == 97 )
--v4;
if ( v3 == 100 )
++v4;
if ( v5 < 0 || v4 < 0 || maze[16 * v5 + v4] == 43 || v5 > 15 || v4 > 15 )
{
puts("FAIL!");
exit(0);
}
if ( maze[16 * v5 + v4] == 33 )
{
puts("Win!");
puts("flag is : flag{Md5 what you just input} ! Remember that choose 32bit and small letter");
exit(0);
}
}
}

简单分析一下代码

知道了由wasd控制移动且迷宫大小为16*16

查看字符串列表

看到第一串字符串如下

18a71693b65f2d21298e20db3b33e54.png

1
.data:0000000000403020    00000100    C    *+00000000++++++0+0+0++++0+0000+0+0+0000+0++++0+0+0+++0+00000+0+0+0+0+0+++++0+0+0+0+0000+0000+0+0+++0++++0++0+0+0+00000+0000++0+0+0+++0++++00+0+0+0+00000+00++0+0+0+++++0+0+++0+0+0+00000+00000+0+0+++++++0+++++0+0+00000000000+000+0+++++++++++++++00000000000!

按照迷宫题的套路应该是迷宫的地图,’*’代表入口,’!’代表出口

将这个字符串变成16*16的正方形就可以得到迷宫的地图

然后将走出迷宫的每一步组成字符串进行md5加密(32位小写)即可得到flag

UPX

9f6cb922637fb644a284acd3df6c3eb.png

查壳 64位exe程序带UPX壳

5f65cd032b6806c8b32015d0abf9fa4.png

去壳

b349648f5fbd8e6b8a3f71a417f7951.png

IDA反编译main函数

关键函数代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int __cdecl main(int argc, const char **argv, const char **envp)
{
char Str1[44]; // [rsp+20h] [rbp-30h] BYREF
int i; // [rsp+4Ch] [rbp-4h]

_main(argc, argv, envp);
scanf("%s", Str1);
Str1[43] = 0;
for ( i = 0; i <= 41; ++i )
Str1[i] ^= key[i % 7];
if ( !strcmp(Str1, encoded_flag) )
puts("win!");
else
puts("wrong!");
system("pause");
return 0;
}

简单分析一下:

用户输入字符串Str1

然后将Str1中的字符每七个和key中的字符依次进行异或赋值

判断函数将异或后的Str1字符串和encoded_flag字符串进行比较

如果两字符串相同则正确

还是先查看一下encoded_flag 字符串

69d5c08cf9c2929aa911fe322151287.png

还要找一下key字符串

6151908832c5d83246f0b44b9d02dec.png

异或是可逆运算

逆回去就可以得到flag

1
2
3
4
ecode_flag :   ()4687$v m4'fl{t`fngrv#xh&etc$0br5pyqderg<
key : NEUQCSA

flag{de8e8ed5-5157-438f-9e65-ae31f1741414}