CTF學習-逆向解題思路


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等。

需要注意的是不同CPU的機器指令可能不同,請使用自己CPU對應的機器指令。尤其不要拿着Intel的機器指令拿去套AMD的CPU


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM