BUUCTF--不一样的flag

测试文件:https://buuoj.cn/files/91b89e765c9aff8e82690c0868975b37/0bf39b5d-5f2f-4095-a921-fb5c20f53f21.zip?token=eyJ0ZWFtX2lkIjpudWxsLCJ1c2VyX2lkIjoxOTAzLCJmaWxlX2lkIjoxNDl9.XXmYkQ.5edzFDlCw_3UHmzs0yvtlqN2pqk

 

1.准备

获取信息

  1. 32位文件

 

2.IDA打开

将main函数反编译为C语言代码

 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 }

 

3.代码分析

查看第13行代码中的_data_start__ 

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

又通过第16~20行代码,第51~53行代码,我们能够知道这是一个迷宫题。

 

通过第51行5 * v4,这是一个5行5列的迷宫(一共25个字符)

*1111
01000
01010
00010
1111#

 

从*走到#即可

 

4.get flag!

flag{222441144222}

posted @ 2019-09-12 09:09  Hk_Mayfly  阅读(2080)  评论(0编辑  收藏  举报