BUUCTF-RE-不一样的flag

养成扔PE的习惯

用IDA打开

 1 int __cdecl main(int argc, const char **argv, const char **envp)
 2 {
 3   char v3; // [esp+17h] [ebp-35h]
 4   int v4; // [esp+30h] [ebp-1Ch]
 5   int v5; // [esp+34h] [ebp-18h]
 6   signed int v6; // [esp+38h] [ebp-14h]
 7   int i; // [esp+3Ch] [ebp-10h]
 8   int v8; // [esp+40h] [ebp-Ch]
 9 
10   __main();
11   v4 = 0;
12   v5 = 0;
13   qmemcpy(&v3, _data_start__, 0x19u);
14   while ( 1 )
15   {
16     puts("you can choose one action to execute");
17     puts("1 up");
18     puts("2 down");
19     puts("3 left");
20     printf("4 right\n:");
21     scanf("%d", &v6);
22     if ( v6 == 2 )
23     {
24       ++v4;
25     }
26     else if ( v6 > 2 )
27     {
28       if ( v6 == 3 )
29       {
30         --v5;
31       }
32       else
33       {
34         if ( v6 != 4 )
35 LABEL_13:
36           exit(1);
37         ++v5;
38       }
39     }
40     else
41     {
42       if ( v6 != 1 )
43         goto LABEL_13;
44       --v4;
45     }
46     for ( i = 0; i <= 1; ++i )
47     {
48       if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )
49         exit(1);
50     }
51     if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == '1' )
52       exit(1);
53     if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == '#' )
54     {
55       puts("\nok, the order you enter is the flag!");
56       exit(0);
57     }
58   }
59 }

从13行的_data_start__中得到以下信息

.data:00402000                 public __data_start__
.data:00402000 __data_start__  db '*11110100001010000101111#',0

又结合16-20、51-53行可知这是一个迷宫 

第51、53行中的5*v4可知这是一个5x5的迷宫

*1111
01000
01010
00010
1111#

从*走到#即可

flag就是通过迷宫的数字

posted @ 2020-03-12 20:51  Nicky_啦啦啦是阿落啊  阅读(301)  评论(0编辑  收藏  举报