picoCTF 2023 Writeup うさみみハリケーンで解いてみた
picoCTF 2023 Writeup うさみみハリケーンで解いてみた
この Writeup について
「 picoCTF 」は、セキュリティの技術を競う競技大会「 CTF 」のひとつで、中学生・高校生向けのものです。普段 PC ゲームの解析で使っている「うさみみハリケーン」で、この「 picoCTF 2023 」を解いてみました。この解説の解き方には正攻法ではないものがありますので、「出題の意図に沿った正しい解き方が知りたい」方は、他の Writeup ( CTF の解き方の解説)も読まれることをお勧めします。CTF では問題の答えのことを「フラグ」といいます。各問題の説明の最後にある文字列がフラグです。
筆者は「同人 PC ゲームの解析をする人」で、情報セキュリティ系の人ではないので、Linux や Python の使用経験はありませんし、情報セキュリティに関連する勉強会やサークルなどの参加経験もありません。統合開発環境「 Visual Studio Community 」の「 Visual C++ 」で、「うさみみハリケーン」のプラグインをコンパイルした経験はあります。
picoCTF の問題はこちらから。過去問を含む「 picoGym 」と、2023年版の「 picoCTF 2023 」があります。
過去問の解説:
「picoCTF 2018 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2019 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2021 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2022 Writeup うさみみハリケーンで解いてみた」
この Writeup は、「 picoCTF 2022 」の解説「picoCTF 2022 Writeup うさみみハリケーンで解いてみた」のフォーマットを再利用しています。
CTF や PC ゲーム解析では、必ず最新版の「うさみみハリケーン」を使用してください。古いバージョンだと上手くいかないこともあります。この Writeup 執筆時ではバージョン 0.39 が最新版です。
この Writeup で使用している「うさみみハリケーン」は新型 32 ビット版の「 UsaMimi32.exe 」や 64 ビット版の「 UsaMimi64.exe 」 です。「青い空を見上げればいつもそこに白い猫」の実行ファイルは「 AoZoraSiroNeko.exe 」です。
補足:このWriteupは、匿名希望の方からDigital Travesiaへ提供されたものです。公開にあたり、Digital Travesia側で若干の修正や補記および文体の統一等を行っています。
ツールの入手先
汎用プロセスメモリエディタ兼デバッガ「うさみみハリケーン」「うさみみハリケーン」の公式サイト
「うさみみハリケーン」のダウンロード・インストール・使用方法 (messiahcat氏提供)
ツールの使い方
●うさみみハリケーンと付属ツールの説明「うさみみハリケーン」の最新オンラインヘルプ
汎用ファイルアナライザ「青い空を見上げればいつもそこに白い猫」(略称:青空白猫)
簡易エクスプローラー「Portable Explorer」
多倍長整数演算・進数変換ソフト 「UMECappend」
この Writeup では使用しませんが、「うさみみハリケーン」には、他にも有用なツールが同梱されています
式入力演算・進数変換ソフト「UMEC」
PEファイルのダンプ・解析・編集・仲介DLL(Proxy DLL)ソースコード出力用 PE エディタ「UMPE」
プロセスが行う、プロセス・スレッド・DLLロード・ファイル・レジストリ・ネットワーク関連等の挙動解析用プロセスモニター「猫原喜雨」さん
x86/x64 対応の簡易アセンブラ・逆アセンブラ「ロケットねこみみ」
プログラム解析時の使用も想定しているボタン型ランチャー「NekoLaunch」
●使う前に読んでおいた方がよい解説
基礎用語 バイナリファイルの解析
基礎用語 キャラクターコード(文字コード)
基礎用語 逆アセンブルコードリスト
ステガノグラフィーの解析について
ファームウェア解析への『うさみみハリケーン』活用について
YARAについて
picoCTF 2023 解いてみた問題と Writeup 目次
●hideme●PcapPoisoning
●ReadMyCert
●repetitions
●Reverse
●rotation
●Safe Opener 2
●timer
●FindAndOpen
●MSB
●No way out
●Invisible WORDs
hideme 100 points
Every file gets a flag. The SOC analyst saw one image been sent back and forth between two people. They decided to investigate and found out that there was more than what meets the eye here.問題の PNG ファイルを、「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」でステガノグラフィー解析(フォーマット解析)すると、画像ファイルに結合された ZIP ファイルが検出される
「青い空を見上げればいつもそこに白い猫」のファイル・データ抽出機能で ZIP ファイルを抽出すると、その中にフラグ文字列の画像ファイルがある
「うさみみハリケーン」付属の簡易エクスプローラー「 Portable Explorer 」は画像用 OCR(光学式文字認識)機能を実装している( Windows の機能「 Windows TIFF IFilter 」の有効化が必要)
しかし字が小さすぎる上に一部切れているという、まるで OCR 対策を施したような画像なので、この画像用 OCR 機能では文字を読み取れない
picoCTF{Hiddinng_An_Imag3_within_@n_ima9e_85e04ab8}
PcapPoisoning 100 points
How about some hide and seek heh?Download this file and find the flag.
問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
picoCTF{P64P_4N4L7S1S_SU55355FUL_4d72dfcc}
ReadMyCert 100 points
How about we take you on an adventure on exploring certificate signing requestsTake a look at this CSR file here.
問題の CSR ファイルの Base64 部分を「うさみみハリケーン」付属の「 UMECappend 」で変換するとわかる
picoCTF{read_mycert_a7163be8}
repetitions 100 points
Can you make sense of this file?Download the file here.
問題のテキストファイルにある文字列を「うさみみハリケーン」付属の「 UMECappend 」で繰り返し Base64 変換するとわかる
picoCTF{base64_n3st3d_dic0d!n8_d0wnl04d3d_4557ec3e}
Reverse 100 points
Try reversing this file? Can ya?I forgot the password to this file. Please find it for me?
問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
picoCTF{3lf_r3v3r5ing_succe55ful_7851ef7d}
rotation 100 points
You will find the flag after decrypting this fileDownload the encrypted flag here.
Hints
Sometimes rotation is right
問題の文字列は「 xqkwKBN{z0bib1wv_l3kzgxb3l_25l7k61j} 」
フラグ先頭は「 picoCTF 」となるはずなので、アルファベットの文字コードで -8 と +18 のケースがある( ROT18 )とわかる
「うさみみハリケーン」付属の解析練習用ソフト「 UsaTest2.EXE 」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
メニューの「編集」→「選択アドレスへの直接書き込み・選択範囲の一括書き換え」で、アドレス 403000 に問題の文字列を書き込む
併せて、ダンプ画面での文字列表示用文字コードを「 UTF-8 」にして漢字等への誤変換を回避する(メニュー「表示」→「文字コード」)
書き込んだバイト列を選択後コピーしてアドレス 403080 にペーストし、ペーストしたバイト列を選択する
メニューの「編集」→「選択範囲への演算実行」で、アドレス 403080 以降のバイト列の各バイトに値 8 の減算を行う
同様に問題文字列のバイト列を選択後コピーしてアドレス 403100 にペーストし、ペーストしたバイト列を選択後に値 18 の加算を行う
上記の演算結果を組み合わせ、さらに記号と数字を元に戻して、アドレス 4030C0 にフラグを作成する
メニューの「編集」→「指定メモリエリアから文字列を抽出」で、完成したフラグの文字列をコピーできる
picoCTF{r0tat1on_d3crypt3d_25d7c61b}
Safe Opener 2 100 points
What can you do with this file?I forgot the key to my safe but this file is supposed to help me with retrieving the lost key. Can you help me unlock my safe?
問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
picoCTF{SAf3_0p3n3rr_y0u_solv3d_it_b427942b}
timer 100 points
You will find the flag after analysing this apkDownload here.
apk ファイルの展開先フォルダを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で YARAルールでスキャンする
付属の「 yara_rule_file.txt 」には、「 CTF 」タグで picoCTF 用ルールが含まれている
スキャン結果からフラグ文字列を含むファイルとオフセットがわかる
「青い空を見上げればいつもそこに白い猫」で Unicode(UTF-16LE) の文字列抽出を行う
picoCTF{t1m3r_r3v3rs3d_succ355fully_17496}
FindAndOpen 200 points
Someone might have hidden the password in the trace file.Find the key to unlock this file. This tracefile might be good to analyze.
問題の PCAP ファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出すると Base64 らしき文字列が見つかる
文字列そのままでは Base64 変換がエラーになるので、先頭から 1 文字ずつ削除しながら「うさみみハリケーン」付属の「 UMECappend 」で変換する
「 picoCTF{R34DING_LOKd_ 」が問題の別添 ZIP ファイルの展開パスワードだった
ZIP ファイルからフラグ文字列のテキストファイルを展開するとわかる
picoCTF{R34DING_LOKd_fil56_succ3ss_cbf2ebf6}
MSB 200 points
This image passes LSB statistical analysis, but we can't help but think there must be something to the visual artifacts present in this image...Download the image here
「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」のステガノグラフィー解析機能で、画像の色情報の MSB を抽出するとテキストデータが埋め込まれているのがわかる
保存したテキストファイルを、「青い空を見上げればいつもそこに白い猫」で YARAルールでスキャンする
付属の「 yara_rule_file.txt 」には、「 CTF 」タグで picoCTF 用ルールが含まれている
テキストファイルとして保存後に、「青い空を見上げればいつもそこに白い猫」で文字列抽出して「 pico 」で検索するアプローチもある
picoCTF{15_y0ur_que57_qu1x071c_0r_h3r01c_06326238}
No way out 200 points
Put this flag in standard picoCTF format before submitting. If the flag was h1_1m_7h3_f14g submit picoCTF{h1_1m_7h3_f14g} to the platform.問題の脱出系ゲームは、筆者の CTF 用環境( Windows 10 の仮想マシン)では動作異常が生じたので、ゲーム用環境(Windows 11 の実機)で解析した
アプローチの手順は以下
このアプローチで使用する、「簡易数値検索」機能(メニュー「検索」下)と「固定化書き換え」機能(メニュー「編集」下)の詳細や使い方はヘルプを参照してください
アプローチ参考画像(フラグ取得時)
ゲーム開始後にプレーヤーを少し前方に移動させる(検索時に多くの誤ヒットを招く値ゼロを検索対象から除き、座標検索の効率性を高めるため)
「うさみみハリケーン」の 64 ビット版「 UsaMimi64.exe 」でゲームのプロセスをオープンし、「簡易数値検索」機能でプレーヤーの座標が格納されたアドレスを検索する
ゲームと「うさみみハリケーン」の画面切り替えは Alt + Tab キーで行う
座標の値の形式はたいてい Float なので Float のみを指定し、初回検索は比較方法「2つの入力値の間」で 0.1 と 50 を指定して検索
検索対象領域のアクセス属性やタイプは初期設定のままでいけた
絞り込み検索はプレーヤーを前方に移動して比較方法「増加した」、後方移動で「減少した」、視野だけ変えて「変動していない」を繰り返す
該当アドレス数が少なくなったら、ダンプ画面で各アドレスの 4 バイト選択後にツールバー上の「選択範囲を記録バッファとクリップボードにコピー」・「自動貼り付け」・「自動貼り付け処理を停止」ボタンで選択した 4 バイトを固定化させ、ゲーム上でプレーヤーを前後移動させて移動動作に影響がないか確認する
自動貼り付け処理の実行間隔(ミリ秒)はオプションで変更できるが、初期設定で問題なかった
このアプローチは手間がかかるが、複数のアドレスを同時に固定化するよりはゲームがクラッシュする可能性を低減できると考えられる
他のアプローチとして、該当アドレス数が少なくなったら、ゲーム上でプレーヤーを少し移動させて、検索結果リスト上で各アドレスを選択して右クリックから「直近の検索時の値を書き込む」でプレーヤーの位置に変化がないか確認する方法もあるが、このゲームでは目的のアドレスで変化しなかった
ゲーム上でプレーヤーの移動に影響するアドレスが見つかったら、座標の値を書き換えて壁の向こう側までプレーヤーを移動させる
筆者の場合はアドレスが 2 か所見つかり、一つは正しいアドレス、もう一つは書き換えるとマップから落下しながら回転し続けてプレイ続行不能になるものだった
正しいアドレスの方の書き換えを、確実に行うため単発ではなく「固定化書き換え」機能で行う
固定化書き換えの画面は、「簡易数値検索」のリスト上で目的のアドレスを選択して右クリックから表示できる
座標情報は他のパラメータ群と連動した高頻度の更新が想定されるため固定化書き換えが望ましい
ゲーム側で画面切り替えを検出してパラメータ復元が行われるケース(実例あり)でも固定化書き換えならば対処できる
壁の向こう側までプレーヤーが移動したら、固定化書き換えを解除する
たいてい、ゲームに画面を切り替えて少しだけ移動しないと、ゲーム画面上で壁の向こう側までプレーヤーが移動しなかった
マップ上に旗が立っており、プレーヤーがその旗に近づくとフラグ用文字列「 WELCOME_TO_UNITY!! 」が表示される
表示される文字列に「 picoCTF{ } 」が含まれないのは、この表示文字列がゲーム起動時からプロセスメモリ上に存在し容易に検索可能なためと見られる
picoCTF{WELCOME_TO_UNITY!!}
補足:
座標の解析アプローチ時に、座標の値とその周辺の値を一覧表示するには、「うさみみハリケーン」の「構造体編集」機能が使える
この「構造体編集」機能は、特定周期でプロセスメモリ書き換えを行う固定化書き換えにも対応している
座標の解析アプローチ時に、座標の値とその周辺の値が時系列で変化する状況を確認するには、「うさみみハリケーン」の「特定アドレス格納値の時系列状況推移を表示」機能が使える
CTF の脱出系ゲームの場合は、ゲームのマップに関連するバイナリファイルの書き換えや、Unity ならば逆コンパイルして移動関連処理を改変するというアプローチも考えられる
Invisible WORDs 300 points
Do you recognize this cyberpunk baddie? We don't either. AI art generators are all the rage nowadays, which makes it hard to get a reliable known cover image. But we know you'll figure it out. The suspect is believed to be trafficking in classics. That probably won't help crack the stego, but we hope it will give motivation to bring this criminal to justice!Download the image here
問題の BMP ファイルを、「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」でステガノグラフィー解析(フォーマット解析)すると、 BMP ファイルのヘッダ異常が検出される
「青い空を見上げればいつもそこに白い猫」のヘキサエディタでヘッダを見ると、 ZIP ファイルのヘッダが見える
ZIP ファイルのヘッダのフォーマットと比較すると、ZIP ヘッダ先頭以降には、 2 バイトの正しいデータと 2 バイトのダミーデータが交互に並んでいるようだ
なので、元ファイルから 4 バイトごとに 2 バイトを抽出してファイルを再構成すればよい
「うさみみハリケーン」付属の解析練習用ソフト「 UsaTest2.EXE 」を起動して「うさみみハリケーン」でオープン
メニューの「デバッグ」→「メモリ領域の確保とアクセス属性変更」で、ファイル読み込み用領域とファイル再構成用領域を確保する
メニュー「編集」→「選択範囲を指定・ハッシュ生成」でファイルサイズ分を選択状態にする
メニュー「プロセス」→「選択範囲内にファイルをアップロード」で 問題の BMP ファイルをプロセメモリ上に読み込む
メニューの「デバッグ」→「パラサイトルーチン作成」
再構成ルーチンのアセンブリ言語ソースコードを記述してから「プレビュー」ボタンで問題がないか確認
今回は実行させるコードへのジャンプは不要なので、書き込む前に「ルーチンのみ」チェックボックスにチェックしておく
「ジャンプ+ルーチン書き込み」ボタンで、プレビューされたアセンブル後のバイナリデータをプロセスメモリに書き込む
※プログラムのコード内に任意の処理を注入する「パラサイトルーチン」の作り方は picoCTF2022 の解説 basic-mod2 を参照してください
メニューの「デバッグ」→「選択アドレスで CreateRemoteThread 関数実行」で、書き込んだ再構成ルーチンのコード先頭から実行させる
プロセスメモリ上で再構成した ZIP ファイルを、メニュー「プロセス」→「選択範囲をファイルにダンプ」でファイルとして保存する
メニュー「編集」→「選択範囲を指定・ハッシュ生成」でファイル該当範囲をアドレス指定して「同左をダンプ」ボタンでも保存できる
保存した ZIP ファイルから 7-Zip でテキストファイルを展開して、「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
picoCTF{w0rd_d4wg_y0u_f0und_5h3113ys_m4573rp13c3_5eadc23e}