CTF總結-逆向篇

一、通用過程

  1. 通過file命令查看文件類型,判斷是ELF還是PE,32位還是64位。
  2. 通過strings並重定向標準輸出,然後搜索大括號 { ,看看是否能直接得到flag.
  3. 將程序運行一下,心裏有個數。
  4. 通過ExeinfoPe查殼,如果有殼,通過upx -d [ 文件名 ] 去殼。
  5. 通過各種工具將文件反彙編+反編譯(如果比較剛猛,也可以直接看二進制指令)
  6. 閱讀代碼,判斷題型。

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

待補充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章