[ACTF新生賽2020]Oruga
阿新 • • 發佈:2022-12-08
前言:爭取寒假養成一天一篇的部落格的習慣
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}