picoCTF 2021 Writeup うさみみハリケーンで解いてみた
picoCTF 2021 Writeup うさみみハリケーンで解いてみた
この Writeup について
「 picoCTF 」は、セキュリティの技術を競う競技大会「 CTF 」のひとつで、中学生・高校生向けのものです。普段 PC ゲームの解析で使っている「うさみみハリケーン」で、この「 picoCTF 2021 」を解いてみました。この解説の解き方には正攻法ではないものがありますので、「出題の意図に沿った正しい解き方が知りたい」方は、他の Writeup ( CTF の解き方の解説)も読まれることをお勧めします。CTF では問題の答えのことを「フラグ」といいます。各問題の説明の最後にある文字列がフラグです。
筆者は「同人 PC ゲームの解析をする人」で、情報セキュリティ系の人ではないので、Linux や Python の使用経験はありませんし、情報セキュリティに関連する勉強会やサークルなどの参加経験もありません。統合開発環境「 Visual Studio Community 」の「 Visual C++ 」で、「うさみみハリケーン」のプラグインをコンパイルした経験はあります。
picoCTF の問題はこちらから。過去問を含む「 picoGym 」と、2021年版の「 picoCTF 2021 」があります。私のような、情報セキュリティ系ではない人ならば、新しい2021年版の問題だけではなく2018年と2019年の過去問も解く方が、プログラム解析などの勉強になるでしょう。
過去問の解説:
「picoCTF 2018 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2019 Writeup うさみみハリケーンで解いてみた」
この Writeup は、「 picoCTF 2019 」の解説「picoCTF 2019 Writeup うさみみハリケーンで解いてみた」のフォーマットを再利用しています。
CTF や PC ゲーム解析では、必ず最新版の「うさみみハリケーン」を使用してください。古いバージョンだと上手くいかないこともあります。この Writeup 執筆時ではバージョン0.35が最新版です。この0.35へのバージョンアップ時に併せて、「青い空を見上げればいつもそこに白い猫」もバージョンアップしています。
この Writeup で使用している「うさみみハリケーン」は新型32ビット版の「 UsaMimi32.exe 」です。「青い空を見上げればいつもそこに白い猫」の実行ファイルは「 AoZoraSiroNeko.exe 」です。
補足:このWriteupは、匿名希望の方からDigital Travesiaへ提供されたものです。公開にあたり、Digital Travesia側で若干の修正や補記を行っています。
ツールの入手先
汎用プロセスメモリエディタ兼デバッガ「うさみみハリケーン」「うさみみハリケーン」の公式サイト
「うさみみハリケーン」のダウンロード・インストール・使用方法 (messiahcat氏提供)
ツールの使い方
●うさみみハリケーンと付属ツールの説明「うさみみハリケーン」の最新オンラインヘルプ
式入力演算・進数変換ソフト「UMEC」
多倍長整数演算・進数変換ソフト 「UMECappend」
汎用ファイルアナライザ「青い空を見上げればいつもそこに白い猫」(略称:青空白猫)
この Writeup では使用しませんが、「うさみみハリケーン」には、他にも有用なツールが同梱されています
PEファイルのダンプ・解析・編集・仲介DLL(Proxy DLL)ソースコード出力用 PE エディタ「UMPE」
プロセスが行う、プロセス・スレッド・DLLロード・ファイル・レジストリ・ネットワーク関連等の挙動解析用プロセスモニター「猫原喜雨」さん
x86/x64 対応の簡易アセンブラ・逆アセンブラ「ロケットねこみみ」
プログラム解析時の使用も想定しているボタン型ランチャー「NekoLaunch」
●使う前に読んでおいた方がよい解説
基礎用語 バイナリファイルの解析
基礎用語 キャラクターコード(文字コード)
基礎用語 逆アセンブルコードリスト
ステガノグラフィーの解析について
ファームウェア解析への『うさみみハリケーン』活用について
YARAについて
picoCTF 2021 解いてみた問題と Writeup 目次
●Obedient Cat●Mod 26
●Wave a flag
●information
●Static ain't always noise
●Tab, Tab, Attack
●Weird File
●Matryoshka doll
●tunn3l v1s10n
●Wireshark doo dooo do doo...
●Pixelated
●Disk, disk, sleuth!
●Milkslap
●Disk, disk, sleuth! II
Obedient Cat | 5 points
This file has a flag in plain sight (aka "in-the-clear"). Download flag.問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
picoCTF{s4n1ty_v3r1f13d_1a94e0f9}
Mod 26 | 10 points
Cryptography can be easy, do you know what ROT13 is? cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_jdJBFOXJ}「うさみみハリケーン」付属の「UMECappend」で ROT13 変換するとわかる
コード埋め込みと実行の練習を兼ねて新型32ビット版「 UsaMimi32.exe 」で ROT13 の復号ルーチンを自作してみる
キャラクターコード(文字コード)は「うさみみハリケーン」のオンラインヘルプを参照した
復号ルーチンの x86 アセンブリ言語ソースコードを「うさみみハリケーン」の「パラサイトルーチン作成」機能で作成して実行させればよい
「うさみみハリケーン」付属の解析練習用ソフト「 UsaTest2.EXE 」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
メニューの「編集」→「選択アドレスへの直接書き込み・選択範囲の一括書き換え」で、アドレス 403000 に問題文の文字列を書き込む
メニューの「デバッグ」→「パラサイトルーチン作成」
復号ルーチンのアセンブリ言語ソースコードを記述してから「プレビュー」ボタンで問題がないか確認
今回は実行させるコードへのジャンプは不要なので、書き込む前に「ルーチンのみ」チェックボックスにチェックしておく
「ジャンプ+ルーチン書き込み」ボタンで、プレビューされたアセンブル後のバイナリデータをプロセスメモリに書き込む
※プログラムのコード内に任意の処理を注入する「パラサイトルーチン」の作り方は picoCTF 2019の解説 を参照してください
:403100 ;書き込み先アドレス強制指定 mov esi, 403000 mov eax, 0D ;ROT 13 mov ecx, 0 mov edx, 4161 ;'A' 'a' mov ebx, edx add bh, al ;'N' 4E add bl, al ;'n' 6E ;start >cmp byte ptr[esi+ecx], dl jae 40313A ;small char cmp byte ptr[esi+ecx], 5A ;'Z' ja 40314F ;last cmp byte ptr[esi+ecx], 41 ;'A' jb 40314F ;last cmp byte ptr[esi+ecx], bh jae 403135 ;N-Z ;A-M add byte ptr[esi+ecx], al jmp 40314F ;last ;N-Z >sub byte ptr[esi+ecx], al jmp 40314F ;last ;small char cmp byte ptr[esi+ecx], 7A ;'z' ja 40314F ;last >cmp byte ptr[esi+ecx], bl jae 40314A ;n-z ;a-m add byte ptr[esi+ecx], al jmp 40314F ;last ;n-z >sub byte ptr[esi+ecx], al jmp 40314F ;last ;ZeroJMP ;last >inc ecx cmp byte ptr[esi+ecx], 0 jnz 40311A ;start ret
ダンプ画面で復号ルーチンのコード先頭(アドレス 403100)を選択
メニューの「デバッグ」→「選択アドレスで CreateRemoteThread 関数実行」で復号ルーチンのコード先頭から実行させる
「 UsaTest2.EXE 」は DEP の適用対象外なので実行属性のないデータを実行可能
なお、「パラサイトルーチン作成」機能で確保されるバッファは実行属性が付加される
メニューの「デバッグ」→「メモリ領域の確保とアクセス属性変更」で任意のメモリエリアに実行属性を付加することもできる
復号ルーチン実行後にメニューの「編集」→「指定メモリエリアから文字列を抽出」で ROT13 変換後の文字列をコピー
picoCTF{next_time_I'll_try_2_rounds_of_rot13_wqWOSBKW}
Wave a flag | 10 points
Can you invoke help flags for a tool or binary? This program has extraordinarily helpful information...問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
picoCTF{b1scu1ts_4nd_gr4vy_616f7182}
information | 10 points
Files can always be changed in a secret way. Can you find the flag? cat.jpg問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出する
「うさみみハリケーン」付属の「UMECappend」で base64 変換するとわかる
picoCTF{the_m3tadata_1s_modified}
Static ain't always noise | 20 points
Can you look at the data in this binary: static? This BASH script might help!問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
picoCTF{d15a5m_t34s3r_f5aeda17}
Tab, Tab, Attack | 20 points
Using tabcomplete in the Terminal will add years to your life, esp. when dealing with long rambling directory structures and filenames: Addadshashanammu.zipZIP ファイルを展開して出てきたファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
picoCTF{l3v3l_up!_t4k3_4_r35t!_6f332f10}
Weird File | 20 points
What could go wrong if we let Word documents run programs? (aka "in-the-clear"). Download file.問題のファイルを ZIP ファイルとして展開し、「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で YARAルールでスキャンする
「対象ファイルのあるフォルダごとスキャン」と「サブフォルダもスキャン」オプションを有効にしてフォルダ内の全ファイルを一度にスキャンする
あらかじめ付属の「 yara_rule_file.txt 」内の「 rule CTF_Flag_Strings : CTF 」ルールに以下を追記
$picoCTF_Flag_Text = "picoCTF{" nocase ascii wide //picoCTF2021
$picoCTF_Flag_Base64 = "cGljb" ascii //picoCTF2021
$picoCTF_Flag_ROT13 = "cvpbPGS" ascii //picoCTF2021
$picoCTF_Flag_Text_Padding = {70 [1-16] 69 [1-16] 63 [1-16] 6F [1-16] 43 [1-16] 54 [1-16] 46 [1-16] 7B} //picoCTF2021
スキャンでヒットしたファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出する
「うさみみハリケーン」付属の「UMECappend」で base64 変換するとわかる
picoCTF{m4cr0s_r_d4ng3r0us}
Matryoshka doll | 30 points
Matryoshka dolls are a set of wooden dolls of decreasing size placed one inside another. What's the final one? Image: this問題の JPEG ファイルを、「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」でステガノグラフィー解析(フォーマット解析)すると、
画像ファイルに結合された ZIP ファイルが検出される
「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で画像ファイルに結合された ZIP ファイルを抽出する
抽出した ZIP ファイルを展開すると、問題ファイル同様の、ZIP ファイルが結合された JPEG ファイルが出てくるという入れ子構造になっている
上の抽出・展開作業を繰り返すとフラグ文字列が格納されたテキストファイルが得られる
picoCTF{4cf7ac000c3fb0fa96fb92722ffb2a32}
tunn3l v1s10n | 40 points
We found this file. Recover the flag.問題のファイルは「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で BMP ファイルと判別されるが、ヘッダに問題があるようで表示できない
BMP ファイルならば画像データは RGB バイト列になっていると推測した
「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」でバイナリデータ視覚化表示するとわかる
画像データがボトムアップ型なので画像は上下逆に表示される
ヘッダを修復するアプローチも試してみた
問題の BMP ファイルを、「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」のヘキサエディタでヘッダを修復する
ファイルサイズや画像データのサイズに対して画像縦サイズがおかしいので修正するとわかる
推定される画像縦サイズは、画像データのサイズ÷横サイズ÷RGB3バイト≒0x352
画像縦サイズの値はオフセット 0x16 以降に格納されている
picoCTF{qu1t3_a_v13w_2020}
Wireshark doo dooo do doo... | 50 points
Can you find the flag? shark1.pcapng.「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で YARAルールでスキャンする
あらかじめ付属の「 yara_rule_file.txt 」内の「 rule CTF_Flag_Strings : CTF 」ルールに以下を追記
$picoCTF_Flag_Text = "picoCTF{" nocase ascii wide //picoCTF2021
$picoCTF_Flag_Base64 = "cGljb" ascii //picoCTF2021
$picoCTF_Flag_ROT13 = "cvpbPGS" ascii //picoCTF2021
$picoCTF_Flag_Text_Padding = {70 [1-16] 69 [1-16] 63 [1-16] 6F [1-16] 43 [1-16] 54 [1-16] 46 [1-16] 7B} //picoCTF2021
「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出する
「うさみみハリケーン」付属の「UMECappend」で ROT13 変換するとわかる
picoCTF{p33kab00_1_s33_u_deadbeef}
Pixelated | 200 points
I have these 2 images, can you make a flag out of them? scrambled1.png scrambled2.png問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」のステガノグラフィー解析機能で合成するとわかる
picoCTF{2a4d45c7}
Disk, disk, sleuth! | 110 points
Use `srch_strings` from the sleuthkit and some terminal-fu to find a flag in this disk image: dds1-alpine.flag.img.gzGZ ファイルを展開して得られる IMG ファイルに「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で YARAルールでスキャンする
あらかじめ付属の「 yara_rule_file.txt 」内の「 rule CTF_Flag_Strings : CTF 」ルールに以下を追記
$picoCTF_Flag_Text = "picoCTF{" nocase ascii wide //picoCTF2021
$picoCTF_Flag_Base64 = "cGljb" ascii //picoCTF2021
$picoCTF_Flag_ROT13 = "cvpbPGS" ascii //picoCTF2021
$picoCTF_Flag_Text_Padding = {70 [1-16] 69 [1-16] 63 [1-16] 6F [1-16] 43 [1-16] 54 [1-16] 46 [1-16] 7B} //picoCTF2021
ヒットしたオフセットを「青い空を見上げればいつもそこに白い猫」のヘキサエディタで確認するとわかる
「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出する
picoCTF{f0r3ns1c4t0r_n30phyt3_dcbf5942}
Milkslap | 120 points
(記述なし)リンク先のソースを見て CSS ファイルをチェックすると PNG 画像名があるので、画像 URL で指定してダウンロードした
「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」のステガノグラフィー解析機能でビットプレーンを見ると、青色ビット0にデータが埋め込まれているのがわかる
フラグはテキスト形式で、かつ青色ビット0にフラグ以外の余計なデータは無いように見える
なので、ビット抽出画面で「テキストのみ表示」オプションを有効にしてビット抽出を行う
これで画像全体のビット抽出結果から、指定した文字コードのテキストだけが表示される
picoCTF{imag3_m4n1pul4t10n_sl4p5}
Disk, disk, sleuth! II | 130 points
All we know is the file with the flag is named `down-at-the-bottom.txt`... Disk image: dds2-alpine.flag.img.gzGZ ファイルを展開して得られる IMG ファイルに「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で YARAルールでスキャンする
あらかじめ付属の「 yara_rule_file.txt 」内の「 rule CTF_Flag_Strings : CTF 」ルールに以下を追記
$picoCTF_Flag_Text = "picoCTF{" nocase ascii wide //picoCTF2021
$picoCTF_Flag_Base64 = "cGljb" ascii //picoCTF2021
$picoCTF_Flag_ROT13 = "cvpbPGS" ascii //picoCTF2021
$picoCTF_Flag_Text_Padding = {70 [1-16] 69 [1-16] 63 [1-16] 6F [1-16] 43 [1-16] 54 [1-16] 46 [1-16] 7B} //picoCTF2021
ヒットしたオフセットを「青い空を見上げればいつもそこに白い猫」のヘキサエディタで確認するとわかる
「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出する
picoCTF{f0r3ns1c4t0r_n0v1c3_ff27f139}