南邮攻防训练平台逆向maze
?
文件為 ELF64 可執行文件,輸入正確 flag 返回判定結果的逆向題。
用 ida 打開,先看f5之后的代碼,容易知道 flag 長度為24位,以 "nctf{" 為前綴:
先是一個對字符的判定過程:
可以看出是對輸入的字符串進行判斷,當當前字符值大于78則再次與79和111進行比較,滿足條件則分別跳入 sub_400650 和 sub_400660 函數中,分別對應自增一和自減一,且范圍為(0,8);else 中情況也一樣,但是區別在于上者是 &v9+1 而下者是 &v9 ,接著看:
每次判斷完之后都回跳至 LABEL_15 處,調用 sub_400690 函數判斷,而其中的參數 asc_601060 為字符串 :“ *******? ?*? **** * ****? * ***? *#? *** *** ***? ? ?********* ”,長度為64,剛好是8*8,一個方陣,而函數則是進行判定當前那位置不能為‘ * ’字符,并且最后必須跳至‘ # ’字符處,否則輸出“錯誤”;假如換行成方陣模樣(將空格替換成‘ 0 ’ ,顯示的是notepad++中的格式,更整齊些):
再聯系上面的flag長度為24,去掉格式之后剩下18個字符,而且根據 main 函數的過程知道每個字符只能在方陣范圍內控制一步,上、下、左、右,看一下圖中,從0開始要在符合條件的情況下到達' # '處至少需要18步,和字符數剛好一致,且最短路徑唯一,所以結果也唯一,然后在v9這個地方從反編譯的代碼不是很清楚,看一下匯編代碼:
?
?
其實不是同一個變量,一個控制行(定位時 *8),一個控制列,看一下后面的匯編代碼容易知道 r14 控制行,即在反編譯代碼中 &v9 地址中的變量控制了行數, &v9+1 則是列;直接手寫,最后的 flag 的 ascii 碼值:
111,48,111,111,48,48,79,48,48,48,111,111,111,111,46,46,79,79
得到字符串:?o0oo00O000oooo..OO
flag : nctf{o0oo00O000oooo..OO}
?
==
轉載于:https://www.cnblogs.com/zUotTe0/p/9159592.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的南邮攻防训练平台逆向maze的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Luogu3383】【模板】线性筛素数
- 下一篇: Vue axios发送Http请求