はじめに
初期にデバッカーを起動していてもしてなくても検知しているとしてループから抜け出せない仕様
Windbgは使わなくてもクリアできたらしいです。
https://youtu.be/AKYwzmRcLtw?si=lQ7gdsD5XCmG77Rt
をみて学びました
手順
picoCTFより実行ファイルをダウンロードする。
ファイルとして .exe, .pdb, .configがある。
- pdbファイル : 実行ファイルの関数情報等が記載された解析補助ファイル?
- config : これを使用して起動しているらしい。
upxのアンパック
ファイルがupxでパッキングされているため
https://github.com/upx/upx/releases/tag/v5.0.0
より
upx-5.0.0-win64.zip
をダウンロードする。解凍すると.exeがあるので、Windowsのcmdを起動して同じフォルダに移動して以下を実行。
私はパス指定があれだったので同階層にCTFのファイルをすべて移動してしまいました。
upx.exe -d WinAntiDbg0x300.exe
また、Linuxのupx -dで解凍してしまうとWindowsで実行できなくなる。
ghidraを用いた解析
https://github.com/NationalSecurityAgency/ghidra
の
To install an official pre-built multi-platform Ghidra release:
Install JDK 21 64-bit
Download a Ghidra release file
NOTE: The official multi-platform release file is named ghidra_<version>_<release>_<date>.zip which can be found under the "Assets" drop-down. Downloading either of the files named "Source Code" is not correct for this step.
を見て、
https://adoptium.net/temurin/releases/
のWindows用の.msi形式のファイルをダウンロードして実行する。
https://github.com/NationalSecurityAgency/ghidra/releases
より
ghidra_11.3.1_PUBLIC_20250219.zipのような最新のファイルをダウンロードする。
ファイル内の.BAT(バッチファイル)を実行する。
projectを新規作成し、import fileからWinAntiDbg0x300.exeを読み込むがこの時に、アナライズは実行しない。
次に、File > Load PDB file > ファイルを選択してロードする。
この時点でwinMain関数が見れる状態になる。
winMain関数の逆コンパイル結果に以下のようにあるので、
local_8 = CreateThread(0,0,ChallengeThreadFunction,0,0,0);
ChallengeThreadFunctionをクリックしてChallengeThreadFunctionに飛ぶ。
この関数は問答無用で5秒ごとにループしているので、これを無効化する。
NOPを入れる
JMP命令を右クリックし、Clear > Clear Code Bytesをクリック。
その後空白になったところ5か所に、Ctrl+Shift+Gまたは、右クリックしてPatchInstructionを選択して、NOP命令に書き換える。
次に、完成したファイルを書き出す
File > Export program > Formatはoriginalで任意の場所に出力する。