runme.exe_b834d0ce1d709affeedb1ee4c2f9c5d8ca4aac68
をダウンロードする。
fileコマンドで中身をみるとwindows実行ファイルであることがわかる。
runme.exe_b834d0ce1d709affeedb1ee4c2f9c5d8ca4aac68: PE32 executable (console) Intel 80386, for MS Windows
拡張子を.exeに変更つまりrunme.exeに名前を変更する。
mv runme.exe_b834d0ce1d709affeedb1ee4c2f9c5d8ca4aac68 runme.exe
stringsで中身をみると
!This program cannot be run in DOS mode.
.text
.data
@.import
j@h' @
h0 @
U
BRjC
U
BRj:
U
BRj\
U
BRjT
U
BRje
U
BRjm
U
BRjp
U
BRj\
U
BRjS
U
BRjE
U
BRjC
U
BRjC
U
BRjO
U
BRjN
U
BRj2
U
BRj0
U
BRj1
U
BRj8
U
BRjO
U
BRjn
U
BRjl
U
BRji
U
BRjn
U
BRje
U
BRj.
U
BRje
U
BRjx
U
BRje
U
BRj"
U
BRj
U
BRjS
U
BRjE
U
BRjC
U
BRjC
U
BRjO
U
BRjN
U
BRj{
U
BRjR
U
BRju
U
BRjn
U
BRjn
U
BRj1
U
BRjn
U
BRj6
U
BRj_
U
BRjP
U
BRj4
U
BRj7
U
BRjh
U
BRj}^
Failed
The environment is not correct.
Congratz
You know the flag!
kernel32.dll
user32.dll
ExitProcess
GetCommandLineA
と出てくるのでSECCON{}で囲われた部分がflagになる。
SECCON{Runnin6_P47h}
これでも解けるが、より正攻法で解いてみる。
リバースエンジニアリングツールとして代表的なツールの一つであるGhidraを使ってときます。
functionsからentryを見ると、右側のデコンパイルされた部分は以下のようになります。
void entry(void)
{
LPSTR pCVar1;
UINT uExitCode;
pCVar1 = GetCommandLineA();
uExitCode = 0x22;
FUN_00401034('\"',pCVar1);
MessageBoxA((HWND)0x0,"You know the flag!","Congratz",0x40);
/* WARNING: Subroutine does not return */
ExitProcess(uExitCode);
}
コマンドラインを呼び出した後、FUN_00401034が呼び出されています。
ダブルクリックで飛ぶと以下のようになっていました。
void __cdecl FUN_00401034(char param_1,char *param_2)
{
UINT unaff_ESI;
if (param_1 == *param_2) {
FUN_00401060('C',param_2 + 1);
return;
}
MessageBoxA((HWND)0x0,"The environment is not correct.","Failed",0x40);
/* WARNING: Subroutine does not return */
ExitProcess(unaff_ESI);
}
if文に注目すると、param_1とparam_2を比較した後今度はFUN_00401060を呼び出して引数に'C'とparam_2 + 1を渡しています。param_2 + 1でアドレスに1増やしているので、次の文字を比較していると分かります。
つまり1文字ずつ関数を呼び出して文字を比較して、一文字でも違ったら先程のThe environment is not correct.がでると分かります。
一つづつダブルクリックしてもいいですが、Funcから見ていきます。
見切れている下まで順にクリックして比較対象を一文字ずつ調べると、最終的に以下のようになります。
C:\\Temp\\SECCON2018line.exe" SECCON{Runn1n6_P47th
終わりの}が抜け落ちてしまっていますが、先程同様のflagを得ることができました。
参考文献
中島 明日香『入門セキュリティコンテスト ― CTFを解きながら学ぶ実戦技術』翔泳社, 2023年.