picoCTF 2025 Writeup うさみみハリケーンで解いてみた
picoCTF 2025 Writeup うさみみハリケーンで解いてみた
この Writeup について
「 picoCTF 」は、セキュリティの技術を競う競技大会「 CTF 」のひとつで、中学生・高校生向けのものです。普段 PC ゲームの解析で使っている「うさみみハリケーン」で、この「 picoCTF 2025 」を解いてみました。この解説の解き方には正攻法ではないものがありますので、「出題の意図に沿った正しい解き方が知りたい」方は、他の Writeup ( CTF の解き方の解説)も読まれることをお勧めします。CTF では問題の答えのことを「フラグ」といいます。各問題の説明の最後にある文字列がフラグです。
筆者は「同人 PC ゲームの解析をする人」で、情報セキュリティ系の人ではないので、Linux ディストリビューションや Python の使用経験はありませんし、情報セキュリティに関連する勉強会やサークルなどの参加経験もありません。統合開発環境「 Visual Studio Community 」の「 Visual C++ 」で、「うさみみハリケーン」のプラグインをコンパイルした経験はあります。
picoCTF の問題はこちらから。picoCTF の過去問を含む「 picoGym 」があります。
過去問の解説:
「picoCTF 2018 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2019 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2021 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2022 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2023 Writeup うさみみハリケーンで解いてみた」
「picoCTF 2024 Writeup うさみみハリケーンで解いてみた」
この Writeup は、上記のフォーマットを再利用しています。
CTF や PC ゲーム解析では、必ず最新版の「うさみみハリケーン」を使用してください。古いバージョンだと上手くいかないこともあります。この Writeup 執筆時ではバージョン 0.43 が最新版です。
この Writeup で使用している「うさみみハリケーン」は 64 ビット版の「 UsaMimi64.exe 」です。「青い空を見上げればいつもそこに白い猫」の実行ファイルは「 AoZoraSiroNeko.exe 」です。「へきさにゃん」の実行ファイルは「 HekisaNyan.exe 」です。
補足:このWriteupは、匿名希望の方からDigital Travesiaへ提供されたものです。公開にあたり、Digital Travesia側で若干の修正や補記を行っています。
ツールの入手先
汎用プロセスメモリエディタ兼デバッガ「うさみみハリケーン」「うさみみハリケーン」の公式サイト
「うさみみハリケーン」のダウンロード・インストール・使用方法 (messiahcat氏提供)
ツールの使い方
●うさみみハリケーンと付属ツールの説明「うさみみハリケーン」の最新オンラインヘルプ
ヘキサエディタ「へきさにゃん」
汎用ファイルアナライザ「青い空を見上げればいつもそこに白い猫」(略称:青空白猫)
多倍長整数演算・進数変換ソフト 「UMECappend」
PEファイルのダンプ・解析・編集・仲介DLL(Proxy DLL)ソースコード出力用 PE エディタ「UMPE」
この Writeup では使用しませんが、「うさみみハリケーン」には、他にも有用なツールが同梱されています
式入力演算・進数変換ソフト「UMEC」
プロセスが行う、プロセス・スレッド・DLLロード・ファイル・レジストリ・ネットワーク関連等の挙動解析用プロセスモニター「猫原喜雨」さん
リソース文字列ビューア「ResStrView」
簡易エクスプローラー「Portable Explorer」
x86/x64 対応の簡易アセンブラ・逆アセンブラ「ロケットねこみみ」
プログラム解析時の使用も想定しているボタン型ランチャー「NekoLaunch」
●使う前に読んでおいた方がよい解説
基礎用語 バイナリファイルの解析
基礎用語 キャラクターコード(文字コード)
基礎用語 逆アセンブルコードリスト
ステガノグラフィーの解析について
ファームウェア解析への『うさみみハリケーン』活用について
YARAについて
picoCTF 2025 解いてみた問題と Writeup 目次
●Shuffle●head-dump
●Ph4nt0m 1ntrud3r
●Cookie Monster Secret Recipe
●Chalkboard
●RED
●flags are stepic
●YaraRules0x100
●perplexed
●Event-Viewing
●Binary Instrumentation 1
●Binary Instrumentation 2
●picoCTF2023 No way out 再チャレンジ
Shuffle 50 points
※この問題が運営から削除された時点で Writeup は作成済みのため掲載●文字の並び替えや逆順を求められる問題
問題の文字列を指定されたように並べ替える
「うさみみハリケーン」付属のヘキサエディタ「へきさにゃん」でメニュー「ファイル」あるいはツールバーから新規ファイルを作成
Windows ANSI 文字列部にキャレットがある状態でメニュー「編集」あるいは右クリックから「貼り付け」
これでコピーした文字列がそのまま貼り付けられる
バイト列部で 0 キーを連打して全体のサイズを拡大してから、文字列を手入力で並び替える

並び替えた文字列全体を選択状態にしてからメニュー「編集」あるいは右クリックから「数値入力で選択範囲を指定+演算+特殊コピー」
「上の指定選択範囲内で各種演算」を有効、演算方法は「バイト順逆転」を選択して「 OK 」ボタン

Windows ANSI 文字列部にキャレットがある状態でメニュー「編集」あるいは右クリックから「コピー」で文字列がそのままコピーできる

picoCTF{scr8mbledt_flvg_9dea5179}
head-dump 50 points
● Web サイトの調査を求められる問題問題の Web サイトのソースからリンク先を調べていくと、ファイルがダウンロードできるページがある
「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」の YARA ルールでスキャン機能を使用する
付属の YARA ルール集「 yara_rule_file.txt 」には、「 CTF 」タグで picoCTF 用ルールが含まれている
ダウンロードしたファイルを YARA ルールでスキャンするとフラグのオフセットがわかる

「青い空を見上げればいつもそこに白い猫」の文字列抽出機能でフラグがわかる

picoCTF{Pat!3nt_15_Th3_K3y_305d5b9a}
Ph4nt0m 1ntrud3r 50 points
●本来は PCAP ファイルの分析を試される問題「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」の YARA ルールでスキャン機能を使用する
付属の YARA ルール集「 yara_rule_file.txt 」には、「 CTF 」タグで picoCTF 用ルールが含まれている
問題の PCAP ファイルを YARA ルールでスキャンするとフラグのオフセットがわかる

「青い空を見上げればいつもそこに白い猫」の文字列抽出機能で Base64 らしい文字列が複数見える
YARA ルールでスキャンしてヒットしたものがあるのでこれらがフラグの断片と判断
うさみみハリケーン付属の「 UMECappend 」でそれぞれを Base64 変換していく


nt_th4t
}
e1ff063
_34sy_t
{1t_w4s
picoCTF
bh_4r_2
以上を組み合わせるとフラグがわかる
picoCTF{1t_w4snt_th4t_34sy_tbh_4r_2e1ff063}
Cookie Monster Secret Recipe 50 points
● Cookie の解析を試される問題問題のリンク先でログイン画面が表示される
適当なユーザー名とパスワードでログインを試してみる
ブラウザの検証ツールで、作成されたクッキーの名前と値を得る

値の文字列をうさみみハリケーン付属の「 UMECappend 」で Base64 変換するとわかる

picoCTF{c00k1e_m0nster_l0ves_c00kies_6C2FB7F3}
Chalkboard 100 points
※この問題が運営から削除された時点で Writeup は作成済みのため掲載●文字列の解析を求められる問題
問題のテキストファイルは一見「 I WILL NOT BE SNEAKY (改行)」が連続しているように見える
なので、異なる文字列が含まれていないか確認する
うさみみハリケーンの新しいプラグイン「 FileReader 」を試してみる
このプラグインは、うさみみハリケーンの「構造体編集」機能や「パラサイトルーチン作成」機能などで、バイナリファイルの読み書きを実現するために作ったものらしい

うさみみハリケーン同梱の解析練習用「 UsaTest2_x64.exe 」を起動する
うさみみハリケーンの 64 ビット版「 UsaMimi64.exe 」で「 UsaTest2_x64.exe 」のプロセスを開く
うさみみハリケーンでファイル読み込みプラグイン「 FileReader 」を使って問題のファイルを読み込む
うさみみハリケーンのメニュー「検索」→「メモリ範囲を指定して置換」でプロセスメモリ上の文字列「 I WILL NOT BE SNEAKY 」をスペースに置換

「 FileReader 」で置換後のメモリエリアをファイルに保存
うさみみハリケーン同梱のヘキサエディタ「へきさにゃん」で文字「 I 」を検索してみる
フラグの 1 文字を含む文字列が複数ヒットするので、それぞれからフラグの 1 文字を抽出するとわかる

picoCTF{chalkboard_bert_f99edf8a}
RED 100 points
●画像のステガノグラフィー解析を求められる問題「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」のステガノグラフィー解析機能を使う
問題画像の各ビットを画像表示してみると、 RGBA のビット 0 にデータが埋め込まれているように見える

RGBA のビット 0 を抽出すると文字列が得られる

文字列をうさみみハリケーン付属の「 UMECappend 」で Base64 変換するとわかる

picoCTF{r3d_1s_th3_ult1m4t3_cur3_f0r_54dn355_}
flags are stepic 100 points
※「うさみみハリケーン」で解けるとの情報提供を受け追記●本来は画像へのデータ埋め込み用ツール「 Stepic 」の使用を求められる問題
問題のヒントにより、問題文からのリンク先で、国と地域の一覧のうち存在しない国を探し出す
「 Upanzi, Republic The 」という存在しない国の、国旗とされる PNG 画像を得る
「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」のステガノグラフィー解析機能を使う
問題画像の各ビットを画像表示してみると、画像データの先頭から RGB のビット 0 にデータが埋め込まれているように見える

RGB のビット 0 を抽出するとバイト列が得られる

抽出されたバイト列は
703498CDE432A118F666360D0CE5F340D06A5F331B06867308D86C341A0D472613EF
フラグ「 picoCTF{ 」の「 p 」が見えているので、「うさみみハリケーン」付属の「 UMECappend 」で 2 進文字化して観察する

2 進文字化した結果は
01110000001101001001100011001101111001000011001010100001000110001111011001100110001101100000110100001100111001011111001101000000110100000110101001011111001100110001101100000110100001100111001100001000110110000110110000110100000110100000110101000111001001100001001111101111
「うさみみハリケーン」付属の「へきさにゃん」でメニュー「ファイル」あるいはツールバーから新規ファイルを作成
Windows ANSI 文字列部に「 picoCTF{ 」と入力し、メニュー「オプション」→「表示用基数」で 2 進数を指定する
表示内容と上の 2 進文字列を比較する

フラグの文字に該当する 8 文字( 1 バイト分)と余分な 1 文字のセットが連続していることに気づく
9 文字ごとに 1 文字を削除する
余った最後の 2 文字も削除する
011100000110100101100011011011110100001101010100010001100111101101100110011011000011010001100111010111110110100000110100001101010101111101100110011011000011010001100111011000010011011000110110001101000011010000110101001110010110000101111101
この 2 進文字列を「うさみみハリケーン」付属の「 UMECappend 」で ASCII 文字列に変換するとわかる

picoCTF{fl4g_h45_fl4ga664459a}
YaraRules0x100 200 points
● 64 の検体群を適切に処理できる YARA ルールの作成を求められる問題「うさみみハリケーン」のオンラインヘルプにある解説「YARAについて」を読むと YARA ルールのことがわかる
解説内「YARAルール作成時の各種識別情報の収集例」を参考に問題の EXE ファイルから識別情報を集めていく
PE ダンパー兼 PE エディタ 「 UMPE 」で、ロケール、 pe.timestamp 、圧縮されていないリソース(アイコン)の情報が得られる
ヘキサエディタ「へきさにゃん」で、 pe.rich_signature.key の値が得られる
汎用ファイルアナライザ「青い空を見上げればいつもそこに白い猫」で、文字列抽出結果や、ダンプした圧縮されていないリソース(アイコン)のハッシュが得られる
「青い空を見上げればいつもそこに白い猫」で、作った YARA ルールの動作確認をする

完成した YARA ルールのテキストファイルをネットにアップロード
Webshell を起動し上のテキストファイルをダウンロードしてから提出コマンドを入力
最初に提出した YARA ルール
YARA ルールの書式は「うさみみハリケーン」付属の YARA ルール集「 yara_rule_file.txt 」を参考にした
import "pe" import "hash" rule picoCTF2025 : CTF2025 { strings: $SusStr = "elcome to the YaraRules0x100 cha" ascii condition: pe.locale(0x0409) == 1 and pe.language(0x09) == 1 and pe.rich_signature.key == 0x78D17E0C and pe.timestamp == 0x657CAC34 and for any i in (0..pe.number_of_resources - 1): ( pe.resources[i].id == 1 and pe.resources[i].type == pe.RESOURCE_TYPE_ICON and pe.resources[i].length == 0x25A8 and hash.md5(pe.resources[i].offset, pe.resources[i].length) == "3028c80304bd30f5afe88ba7949e4d8b" ) and $SusStr }提出結果は構文エラー
False Negatives Check: Syntax error in your YARA rule: "line 7: undefined identifier "pe""
この問題は「 import "pe" 」が使えないという仕様なので、文字列やバイト列で YARA ルールを作る
へきさにゃんで独特な文字列やバイナリデータがないか目視で調べていく

4 回 YARA ルールを書き換えながら提出するが最後の 1 検体にマッチしない
False Negatives Check: Testcase failed. Your rule generated a false negative.
False Positives Check: Testcases passed!
Stats: 63 testcase(s) passed. 1 failed. 0 testcase(s) unchecked. 64 total testcases.
6 回目の提出で 64 検体をパスした YARA ルール
※ UPX は非公式の亜種があるのでセクション名の「 UPX 」指定は避けた方がよい
rule picoCTF2025 : CTF2025 { strings: $SusByte = {28 00 00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00 00 00 00 24 00 00 C3 0E 00 00 C3 0E 00 00 } //$SusStrP = "YaraRules0x100" ascii //$SusStrP = {59 [0-8] 61 [0-8] 72 [0-8] 61 [0-8] 52 [0-8] 75 [0-8] 6C [0-8] 65 [0-8] 73 [0-8] 30 [0-8] 78 [0-8] 31 [0-8] 30 [0-8] 30} $SusStrP = {4E [0-8] 74 [0-8] 51 [0-8] 75 [0-8] 65 [0-8] 72 [0-8] 79 [0-8] 49 [0-8] 6E [0-8] 66 [0-8] 6F [0-8] 72 [0-8] 6D [0-8] 61 [0-8] 74 [0-8] 69 [0-8] 6F [0-8] 6E [0-8] 50 [0-8] 72 [0-8] 6F [0-8] 63 65 [0-8] 73 [0-8] 73} //$SusStrP2 = "VirtualProtect" //$SusStrP3 = "LoadLibraryA" $SusStr = "Welcome to the YaraRules0x100 challenge!" $Author = "Nandan Desai" wide //$secUPX = "UPX" ascii $sectext = ".text" ascii condition: ($SusByte and $SusStrP) or // and $SusStrP2 and $SusStrP3 and $SusStrP and $secUPX at (0x1F8) ($SusByte and $SusStr and $sectext at (0x1F8) and $Author) }Writeup 用の清書版 YARA ルール
rule picoCTF2025 : CTF2025 { strings: $IconBytes = {28 00 00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00 00 00 00 24 00 00 C3 0E 00 00 C3 0E 00 00} $NtQueryInformationProcess = {4E [0-8] 74 [0-8] 51 [0-8] 75 [0-8] 65 [0-8] 72 [0-8] 79 [0-8] 49 [0-8] 6E [0-8] 66 [0-8] 6F [0-8] 72 [0-8] 6D [0-8] 61 [0-8] 74 [0-8] 69 [0-8] 6F [0-8] 6E [0-8] 50 [0-8] 72 [0-8] 6F [0-8] 63 [0-8] 65 [0-8] 73 [0-8] 73} $RefString = "Welcome to the YaraRules0x100 challenge!" $SectionName = ".text" $Author = "Nandan Desai" wide condition: ($IconBytes and $NtQueryInformationProcess) or //packed ($IconBytes and $RefString and $SectionName at (0x1F8) and $Author) //unpacked }Status: Passed
Congrats! Here is your flag: picoCTF{yara_rul35_r0ckzzz_d31fbfb7}
perplexed 400 points
● ELF 実行ファイルの逆コンパイルとコード読解を求められる問題問題の ELF ファイルを「 Decompiler Explorer 」で逆コンパイルする
出力された Ghidra の逆コンパイル結果を ChatGPT で C++言語のソースコードに変換する
「以下のELFファイル逆コンパイル結果を、VC++で使用できるC++言語のソースコードに変換したい」
出力されたソースコードを VC++ で新規作成したコンソールアプリに移植する
入力文字列の比較処理
if (((param_1[local_1c] & local_34) != (local_58[local_24] & local_30))) {
return 1;
}
これをコメントアウトして、比較用の変数を出力してみる
printf("%X ", (int)(local_58[local_24] & local_30));
80 40 20 0 0 0 0 1 80 0 20 0 0 4 2 1 0 0 0 10 8 4 2 0 80 40 20 10 8 0 0 0 0 40 20 10 0 4 0 1 0 0 20 0 0 0 2 1 0 40 20 10 8 0 2 1 0 40 20 0 0 0 0 1 80 0 20 10 8 0 0 1 80 0 0 10 8 4 0 1 80 40 20 10 8 4 0 0 0 40 0 10 8 0 2 0 0 40 0 10 8 0 2 1 80 40 0 10 8 4 2 1 0 40 20 0 8 0 0 1 80 40 0 10 0 0 2 0 80 40 20 10 8 4 2 0 0 0 0 10 8 0 2 1 80 40 20 0 8 4 0 1 80 40 20 10 0 4 0 0 80 40 20 0 8 4 0 1 0 40 20 0 0 4 2 1 80 40 20 10 0 4 0 0
このビット比較用変数を眺めていて、先頭「 80 40 20 0 0 0 0 」を 2 値化して「 1110000 」にすれば、アルファベット「 p 」になることに気づく
全体を 2 値化してみる
1110000110100111000111101111100001110101001000110111101101100001101110011001110111111100010110100101101111011111011010011101001011111110000110111110110111110100111011010110011111110100
7 文字ごとに区切って変換するとフラグ文字になる
テキストエディタで 7 文字ごとに改行し、最後に余った 2 文字「 00 」は削除
改行を「 0 」に置換する
111000001101001011000110110111101000011010101000100011001111011001100000110111000110011010111110110001001101001001101110101111100110100011101000101111101100001010111110011011101101001011011010011001101111101
この 2 進文字列をうさみみハリケーン付属の「 UMECappend 」で ASCII 文字列に変換するとわかる

picoCTF{0n3_bi7_4t_a_7im3}
Event-Viewing 200 points
● EVTX ファイルの解析を求められる問題問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で開く
文字列抽出でフラグ断片とみられる文字列がみつかる
近くにある「 Totally_Legit_Software 」が問題文にあるマルウェアと判断した

Windows 付属のイベントビューアで「 Legit 」を検索すると別のフラグ断片が見つかる
イベントビューアでシャットダウンのイベント ID ( 1074 )でフィルタリングすると最後のフラグ断片が見つかる
うさみみハリケーン付属の「 UMECappend 」でフラグの断片それぞれを Base64 変換しつなぎ合わせるとわかる

picoCTF{Ev3nt_vi3wv3r_1s_a_pr3tty_us3ful_t00l_81ba3fe9}
Binary Instrumentation 1 200 points
●解析対策を施された EXE ファイルの解析を求められる問題「うさみみハリケーン」の 64 ビット版「 UsaMimi64.exe 」でプロセスを開く
メニュー「検索」→「メモリ範囲を指定して検索」で、検索対象に「文字:Windows ANSI」を選択して、表示される文字列内「 flag 」を検索

プロセスメモリ上にフラグと見られる文字列がみつかる
メニュー「検索」→「YARAルールでスキャン」でもみつかる

メニューの「編集」→「指定メモリエリアから文字列を抽出」で、Windows ANSI 文字列を抽出すると、見つかったフラグの文字列をコピーできる

うさみみハリケーン付属の「 UMECappend 」で Base64 変換するとわかる

picoCTF{w4ke_m3_up_w1th_fr1da_f27acc38}
別アプローチ例
「うさみみハリケーン」の 64 ビット版「 UsaMimi64.exe 」でプロセスを開く
メニュー「移動」→「表示アドレスを指定」でメモリマップをみると、実行属性があるメモリエリアが確保されている
ここにプログラムコードが展開あるいは復号されていると判断した

メニュー「デバッグ」→「選択範囲を逆アセンブル」でこのメモリエリアを逆アセンブルすると、 Sleep 関数を何度も呼び出しているのがわかる

問題の EXE ファイルを起動しなおす
プロセスリスト画面の「実行ファイルを起動」ボタンを押して、表示される画面で問題の EXE ファイルを指定する
「通常起動時にエントリーポイントで実行停止」オプションを有効化して起動する
起動したプロセスを「うさみみハリケーン」で開く

メニュー「デバッグ」→「モジュール別参照関数表示」で Sleep 関数のアドレスを確認する

メニュー「デバッグ」→「ブレークポイントの挿入/削除」でアタッチ後に、 Sleep 関数のアドレスに実行のブレークポイントを設定する
デバッガのオプション「HBP/INT3/UD2ブレーク時に実行を一時停止・ステップ実行」を有効にしておく
「実行ファイルを起動」画面で「再開」ボタンを押して実行させる
ブレークするので、ここでプロセスを実行一時停止にしておく(デバッギー実行停止)


RCX レジスタつまり Sleep 関数の引数に大きな値が入っているので、メニュー「デバッグ」→「スレッド別レジスタ表示」で小さな値に書き換える

メニュー「デバッグ」→「選択範囲を逆アセンブル」でプログラムコードを書き換えて、次の Sleep 関数呼び出し箇所からフラグ表示箇所までジャンプさせる


さらにフラグ表示箇所の直後に実行のブレークポイントを設定し、プロセスが終了しないようにする
「ブレークポイントの挿入/削除」画面で「実行再開」ボタンを押すと実行が再開され、フラグ表示直後にブレークする

ブレーク前にフラグの Base64 文字列が表示される

Binary Instrumentation 2 300 points
●解析対策を施された EXE ファイルの解析を求められる問題この EXE ファイルは起動してもすぐに終了する
「うさみみハリケーン」の 64 ビット版「 UsaMimi64.exe 」を起動
プロセスリスト画面の「実行ファイルを起動」ボタンを押して、表示される画面で問題の EXE ファイルを指定
「通常起動時にエントリーポイントで実行停止」オプションを有効化して起動
起動したプロセスを「うさみみハリケーン」で開く

問題文からファイルを作成することがわかっているので、CreateFileA 関数の開始アドレスにブレークポイントを設定して、ブレーク時の引数を確認してみる
メニューの「デバッグ」→「モジュール別参照関数表示」で CreateFileA 関数の開始アドレスを確認する

メニューの「デバッグ」→「ブレークポイントの挿入/削除」でアタッチしてから、CreateFileA 関数の開始アドレスに実行のブレークポイントを設定
オプションで「HBP/INT3/UD2ブレーク時に実行を一時停止・ステップ実行」を有効にしておく

「実行ファイルを起動」画面で「再開」ボタンを押して実行させる
ブレークするので、ここでプロセスを実行一時停止にしておく(デバッギー実行停止)

ブレーク時のスタックやレジスタにある参照アドレス以降にどんなデータがあるか確認する
メニューの「移動」→「同上クリップボードからアドレスを取得」や、メニューの「移動」→「選択アドレスをポインタとみなして表示アドレス変更」を活用

フラグと見られる文字列がみつかる

メニューの「編集」→「指定メモリエリアから文字列を抽出」で、Windows ANSI 文字列を抽出すると、見つかったフラグの文字列をコピーできる

うさみみハリケーン付属の「 UMECappend 」で Base64 変換するとわかる

picoCTF{fr1da_f0r_b1n_in5trum3nt4tion!_b21aef39}
補足
このケースでは問題文によりファイルを作成することが明らかだが、本来はプロセスモニターなどを使って挙動を確認する
うさみみハリケーン付属のプロセスモニター「猫原喜雨」さんでファイル関連の挙動を確認した結果

ファイル作成時に不適切なパスを指定しており、その結果「NtStatus:C0000033」で処理に失敗していることがわかる
このエラーの値の意味は、うさみみハリケーンでメニュー「その他」→「エラーコードを説明文に変換」で確認できる

もし今回の問題にデバッガ対策が施されていたならば、メニュー「デバッグ」→「パラサイトルーチン作成」で動的な CreateFileA 関数のフックを行い、 CreateFileA 関数呼び出し時に任意のコードを実行し対処していた
また、パッカーが適用されていなければ、 PE ダンパー兼 PE エディタ 「 UMPE 」で、「 kernel32.dll 」の仲介 DLL のソースコードを出力して、仲介 DLL を適用する方法もある
picoCTF2023 No way out 再チャレンジ
picoCTF2023 の問題「 No way out 」を、現在ベータテスト中の .NETアプリケーション逆アセンブラ兼逆コンパイラを借りて解いてみるこの .NETアプリケーション逆アセンブラ兼逆コンパイラは「うさみみハリケーン」の次回更新時に同梱するとのこと
この問題はいわゆる脱出系ゲームで、3D 空間でプレーヤーを操作して、塀で四方を囲まれた状態から、塀の外にある旗まで移動させればフラグが表示されて成功、ただしジャンプしても塀を超えることはできない
2023 年当時にこの問題の「うさみみハリケーンでのアプローチ例」を公開している
こちらが、.NETアプリケーションでなくても使える汎用性の高いアプローチ
CTF の脱出系ゲームにおける、プロセスメモリエディタによる基本的なアプローチでは以下の手順で行う
1.プレーヤーの座標が格納されたメモリアドレスを検索で探し出す
2.座標の値を塀の外に該当する値に書き換えて、プレーヤーを塀の外に移動させる
なお、座標の値はゲーム側で高頻度の更新が行われるので、「簡易数値検索」機能に実装している固定化書き換え機能か、専用の「固定化書き換え」機能を使って確実に書き換える必要がある
この問題は Unity 製のゲームなので、.NETアプリケーション逆アセンブラ兼逆コンパイラで解析できる
.NETアプリケーション逆アセンブラを用いた、逆アセンブラや逆コンパイラで解析後に IL コード書き換えでのアプローチ例は以下
・大ジャンプあるいは多段ジャンプを実現し塀を飛び越える
・初期化処理内で重力の初期設定値を変更する
・初期プレーヤー位置を塀の外に変更する
・移動可能フラグの値を常に true つまり値 1 にして塀を通過する
・フラグ表示を行うか判定する処理の条件分岐を書き換える
上記のうち、一番自然な動作に近い、大ジャンプあるいは多段ジャンプを実現し塀を飛び越えるアプローチを試す
ゲーム内の各種整合性チェックを想定して、一番自然な動作に近く、影響が局所的なアプローチを選択した
Unity 製のゲームなので、基本の解析対象といえる Assembly-CSharp.dll を解析する
EvolveGames.PlayerController クラスの Update メソッドという、プレーヤーの位置に関連するメソッドが見つかる
このメソッドにある、Y座標の減算処理(ジャンプ時の重力による落下処理)を書き換えてみる


減算処理そのものを無条件ジャンプでスキップすると、プレーヤーは浮上し上昇し続けてしまう
一応、旗の上空にはたどり着けるものの上昇し続けるので、別の書き換えを試してみる


減算する値に 0.08 を乗算し減算する値を減少させると、塀を飛び越える大ジャンプが可能になる



塀を飛び越えたら、浮上することなく歩いて旗までたどり着ける

picoCTF{WELCOME_TO_UNITY!!}