1. 程式人生 > 其它 >[ACTF新生賽2020]Oruga

[ACTF新生賽2020]Oruga

前言:爭取寒假養成一天一篇的部落格的習慣

ELF64,無殼,丟ida繼續分析

找到了main函式,是一道輸入型的題目

可以看到main函式只有一個關鍵的函式sub_78A,同時也把我們輸入的s字串傳入了進去.

繼續跟進

可以看到一開始是有WEMJ的四種情況,有點類似迷宮,但是不確定,但我們可以通過每次索引的字元來判斷是否為迷宮

如果是W,則v4 == 16,

如果是E,則v4==1,

如果是M,則v4==16,

如果是J,則v4=-1

而在第二個迴圈可以看到最後v2+=4的,而數組裡的值是通過v2進行尋值的

所以根據迷宮題,上下左右的原則,v4=1,肯定就是往右邊移動1格,v4=-1,肯定就是往左邊移動1格,如果是往上走的話,是v4=-16,也就是上下二個數據相差0x10,同理往下走,就算v4=16.

這是第一個迴圈告訴我們的意思,而第二個迴圈是幹什麼的呢?

既然我們知道了1,-1,16,-16分別代表左,右,下,上。

那麼條件(v2 & 0xF) ==0 就代表如果當前位置在第一列,那麼不能往左邊走;

條件v2%16 == 15則代表如果當前位置在第十六列,那麼就不能往右邊走

條件v2-240 <= 0xF 代表如果當前位置在最後一行,那麼不能往下走

條件v2+15 <=0x1E 代表如果當前位置在第一行,那麼不能往上走

所以如果不滿足任何以上任意一個條件,就返回0LL

然後我們用python指令碼把地圖大致搞出來

初始點是0,終點是!,這裡終點是!的原因是因為,這裡的關鍵函式程式碼不能超過33,33剛好就是字元"!"

同時我們這裡碰到障礙物,也要往別的方向走,結合上述規則。

迷宮的路線如下

flag{MEWEMEWJMEWJM}