源文件地址下載
鏈接:https://pan.baidu.com/s/12p2rkH2jHfux4zVaSrUTXw 提取碼:jk9q
0X1查看有無加殼
沒有殼,32位進制的文件
0X2用IDA打開,進入main函數頁面,F5反編譯查看偽代碼
F5
0X3分析代碼
1 void main() 2 { 3 char v0; // [sp+17h] [bp-35h]@1 4 int v1; // [sp+30h] [bp-1Ch]@1 5 int v2; // [sp+34h] [bp-18h]@1 6 signed int v3; // [sp+38h] [bp-14h]@2 7 signed int i; // [sp+3Ch] [bp-10h]@14 8 int v5; // [sp+40h] [bp-Ch]@20 9 10 __main(); 11 v1 = 0; 12 v2 = 0; 13 qmemcpy(&v0, _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", &v3); 22 if ( v3 == 2 ) 23 { 24 ++v1; 25 } 26 else if ( v3 > 2 ) 27 { 28 if ( v3 == 3 ) 29 { 30 --v2; 31 } 32 else 33 { 34 if ( v3 != 4 ) 35 LABEL_13: 36 exit(1); 37 ++v2; 38 } 39 } 40 else 41 { 42 if ( v3 != 1 ) 43 goto LABEL_13; 44 --v1; 45 } 46 for ( i = 0; i <= 1; ++i ) 47 { 48 if ( *(&v1 + i) < 0 || *(&v1 + i) > 4 ) 49 exit(1); 50 } 51 if ( *((_BYTE *)&v5 + 5 * v1 + v2 - 41) == '1' ) 52 exit(1); 53 if ( *((_BYTE *)&v5 + 5 * v1 + v2 - 41) == '#' ) 54 { 55 puts("\nok, the order you enter is the flag!"); 56 exit(0); 57 } 58 } 59 }
注意這幾行
puts("you can choose one action to execute"); puts("1 up"); puts("2 down"); puts("3 left"); printf("4 right\n:");
1上2下3左4右暗示我們這是個迷宮游戲
50 } 51 if ( *((_BYTE *)&v5 + 5 * v1 + v2 - 41) == '1' ) 52 exit(1); 53 if ( *((_BYTE *)&v5 + 5 * v1 + v2 - 41) == '#' ) 54 { 55 puts("\nok, the order you enter is the flag!"); 56 exit(0); 57 } 58 } 59 }
這幾行代碼告訴我們,如果是1就停止,是#就輸出,且迷宮的長度為5
0X4打開“ _data_start”函數得到迷宮的值
*11110100001010000101111#
0X5走迷宮
根據上面的分析,不能走1,只能走0.從*到#。
總共是下下下右右上上右右下下
1上2下3左4右
所以就是22244114422