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