RE1

![1](鲲鹏杯re wp/1.PNG)

直接打开主函数,Str1与字符串akhb~chdaZrdaZudqduvdZvvv|比较,往上看,找到对输入的flag的加密部分,每一个字符先异或再加一,逻辑清楚了,直接解

1
2
3
4
5
a = 'akhb~chdaZrdaZudqduvdZvvv|'
flag = ''
for i in range(len(a)):
flag+= chr((ord(a[i])-1)^6)
print(flag)

RE2

查壳,UPX,脱壳后拖入IDA

可以直接看到输入flag后与字符串HappyNewYear!比较,flag就是HappyNewYear!

RE3

进去看到main函数

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
__int64 __fastcall main(int a1, char **a2, char **a3)
{
signed int v3; // eax
unsigned int i; // [rsp+8h] [rbp-38h]
unsigned int v6; // [rsp+Ch] [rbp-34h]
char s[8]; // [rsp+10h] [rbp-30h]
__int64 v8; // [rsp+18h] [rbp-28h]
__int64 v9; // [rsp+20h] [rbp-20h]
__int64 v10; // [rsp+28h] [rbp-18h]
char v11; // [rsp+30h] [rbp-10h]
unsigned __int64 v12; // [rsp+38h] [rbp-8h]

v12 = __readfsqword(0x28u);
*(_QWORD *)s = 0LL;
v8 = 0LL;
v9 = 0LL;
v10 = 0LL;
v11 = 0;
puts("Welcome to Maze,Have a pleasant time");
printf("input:", a2);
__isoc99_scanf("%32s", s);
v6 = strlen(s);
if ( !v6 || v6 > 0x20 ) //判断输入
{
puts("The length of your input is incorrect!");
puts("Byebye!");
exit(0);
}
for ( i = 0; i < v6; ++i ) //每一个字符进行操作
{
v3 = s[i];
if ( v3 == 'j' )
{
sub_4007BC(&unk_601064, dword_601068); //下移一位
}
else if ( v3 > 'j' )
{
if ( v3 == 'k' )
{
sub_40082F((int *)&unk_601064, dword_601068); //右移一位,等于23h结束
}
else
{
if ( v3 != 'u' ) //大于j且不等于k u 退出
{
LABEL_16:
puts((const char *)0x6F6E6721);
exit(0);
}
sub_4006D6(&unk_601064, dword_601068); //上移一位
}
}
else
{
if ( v3 != 'h' ) //小于j 且不等于h退出
goto LABEL_16;
sub_400749((int *)&unk_601064, dword_601068); //左移一位
}
}
puts("please again!");
return 0LL;
}

Welcome to Maze,知道这是一道迷宫题

迷宫题就要去找方向和迷宫图,下面四个字符 j k u h判断上下左右,进入sub_4007BC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int *__fastcall sub_4007BC(_DWORD *a1, int *a2)
{
int *result; // rax
int v3; // [rsp+1Ch] [rbp-4h]

v3 = *a2 + 1;
if ( byte_400AE0[10 * v3 + *a1] == 79 )
{
puts("wrong!");
exit(0);
}
*a1 = *a1;
result = a2;
*a2 = v3;
return result;
}

判断当前byte_400AE0所在位置的值,那byte_400AE0应该就是迷宫了,点进去查看是一个100位的,那迷宫就是10*10的,如下所示

1
2
3
4
5
6
7
8
9
10
11
30 4F 4F 4F 4F 30 30 30 30 23
30 30 30 4F 4F 30 4F 4F 4F 4F
4F 4F 30 4F 4F 30 30 30 30 4F
4F 30 30 4F 4F 4F 4F 4F 30 4F
4F 30 4F 4F 4F 4F 30 30 30 4F
4F 30 30 4F 4F 30 30 4F 4F 4F
4F 4F 30 4F 4F 30 4F 4F 4F 4F
4F 4F 30 30 30 30 4F 4F 4F 4F
4F 4F 4F 4F 4F 4F 4F 4F 4F 4F
4F 4F 4F 4F 4F 4F 4F 4F 4F 4F
4F 4F 4F 4F 4F 4F 4F 4F 4F 4F

下面分析方向 &unk_601064, dword_601068就是存放当前所在位置的下标,unk_601064是个位 dword_601068是十位

j是 (a2+1)*10+a1 那就是增加10位,就是向下

u是(a2-1)*10+a1 那就是减少10位,就是向上

k是(a1 + 1)+10*a2 那就是加一位,就是向右

h是(a1 - 1)+10*a2 那就是减一位,就是向左

然后按方向走就是flag