CTF學習-逆向解題思路
通過file命令查看文件類型,判斷是ELF還是PE,32位還是64位。
通過strings並重定向標准輸出,然后搜索大括號 { ,看看是否能直接得到flag.
將程序運行一下,心里有個數。
通過ExeinfoPe查殼,如果有殼,通過upx -d [ 文件名 ] 去殼。
通過各種工具將文件反匯編+反編譯(如果比較剛猛,也可以直接看二進制指令)
閱讀代碼,判斷題型。
TIPS:
如果反編譯后函數特別少,可能是因為加了殼。
如果反編譯后找不到main函數,先通過CTRL+F搜一下,搜不到就說明函數名被隱藏了,這時候跑一下程序,然后看一下程序開始時的那串提示信息,在IDA中CTRL+S切換到rodata段,找到這個字符串,然后看它是在哪里被調用的即可找到main
一般而言,Java和Python的題會簡單一點,因為反編譯后的代碼可讀性更強。
二、手動破解
題型識別:要求你輸入一個字符串,然后程序把你輸入的字符串加密,再把加密后的字符串和存儲在程序里的密文對比。顯然你輸入的即為flag,你需要根據密文和加密過程,反向推出flag.
自己寫個腳本,根據加密算法進行解密即可。
請注意,當加密算法很復雜時,可能是用的某種加密算法。這時候應該善用搜索引擎去搜索現成的解密算法。
三、迷宮問題
題型識別:最大的特征是存在4組判斷,分別對應上下左右的移動操作,以及一個合法性檢測,判斷你是否撞牆。
解題方法很簡單,找到迷宮字符串,它可能二維可能一維,但在C中必然是以一維形式存儲,把它轉換回二維迷宮。然后從起點走到終點的操作序列即為最終的flag.
有一個潛在的難點在於如何記錄橫縱坐標。現在見過的幾個操作是
開兩個數組/兩個變量,分別對應橫縱坐標。
用1個8字節的變量,高低4位分別記錄橫縱坐標。(此時反匯編代碼中可能會存在類似於LOWBYTE、HIBYTE這種)參考博客
四、手動繞開
題型識別:程序會主動輸出flag,但是輸出的是密文,程序內置了解密函數,但是這個函數不會被執行,此時可以嘗試根據解密函數,自己手動破解,但是更好的做法是修改源代碼。
IDA中修改完源碼記得要保存到源程序,否則不生效。
修改源代碼,往往是匯編代碼,不可隨意更改,應該保證對應的機器指令占的字節數不發現改變,可以減少,然后通過nop填充,但一般不可增多,因為會影響到后面代碼的地址,從而影響到整個程序。
常用匯編命令與其機器指令:
je、jne、jmp系列、nop、xor等。