下載附件後,就是一個可執行文件,經查殼後,沒發現有殼!呃,先執行下可執行文件,結果以下:算法
亂按一通,發現直接閃退啦,拖到IDA(32bits)進行反編譯分析,F5進入主函數,發現函數
while ( 1 ) { puts("you can choose one action to execute"); puts("1 up"); //v4-1 puts("2 down"); //v4+1 puts("3 left"); //v5-1 printf("4 right\n:");//v5+1 scanf("%d", &v6); if ( v6 == 2 ) { ++v4; } else if ( v6 > 2 ) { if ( v6 == 3 ) { --v5; } else { if ( v6 != 4 ) LABEL_13: exit(1); ++v5; } } else { if ( v6 != 1 ) goto LABEL_13; --v4; } for ( i = 0; i <= 1; ++i ) { if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 ) exit(1); } if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 ) #49->'1' exit(1); if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 ) #35->'#' { puts("\nok, the order you enter is the flag!"); exit(0); } }
,因此咱們的flag相必就是咱們輸入的數字組合啦!後來一直在逆向推算法,怎麼走才能最終獲得flag,但可能性太多,v8的值又不知道,所以,陷入了僵局。spa
後來想着,看看有什麼奇怪的字符串,而後發現了這個!code
看見那個*11110100001010000101111#,我一度覺得這個就是答案,哈哈哈,想的太好了,怎麼可能!而後,又不知道怎麼弄了,因而我看了下大佬們寫的writeup ,才知道這題是個走迷宮的逆向題,那段字符串,就是走出迷宮的地圖。*((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49,*((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35,中,49對應的Ascii值剛好是'1',35對應的ascii值剛好是'#',根據算法的大意,咱們就能知道,若最後結果等於'1',那麼程序會退出,字最後結果等於'#',那麼相應的咱們就獲得了咱們flag的對應數字順序.也就是說,咱們迷宮的終點是'#',而在這過程當中,咱們要避開'1',就這樣走到咱們的終點。blog
把*11110100001010000101111#按5X5的順序擺好,以下(爲何5X5呢,我也不知道,多是由於正好能夠被5整除,這點,等我之後知道了,我再來補充把!)ci
* 1 1 1 1v8
0 1 0 0 0字符串
0 1 0 1 0it
0 0 0 1 0io
1 1 1 1 #
這裏分析下走的原理(我看了半天,才反應過來怎麼走的)
puts("1 up"); //v4-1 puts("2 down"); //v4+1 puts("3 left"); //v5-1 printf("4 right\n:");//v5+1
分析這裏,咱們能知道,'up'->v4-1,'down'->v4+1,'left'->v5-1,'right'->v5+1
這裏就是至關於,v4和v5表示的是位置初始值,一開始都是0,也就至關於在'*'處,而後咱們要變化v四、v5的值,也就是經過移動位置,走到'#'號處。
那麼這裏結果就出來啦,答案就爲222441144222,走出迷宮!!!