测试文件:https://buuoj.cn/files/91b89e765c9aff8e82690c0868975b37/0bf39b5d-5f2f-4095-a921-fb5c20f53f21.zip?token=eyJ0ZWFtX2lkIjpudWxsLCJ1c2VyX2lkIjoxOTAzLCJmaWxlX2lkIjoxNDl9.XXmYkQ.5edzFDlCw_3UHmzs0yvtlqN2pqk
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}