picoCTF 2019 Writeup うさみみハリケーンで解いてみた
picoCTF 2019 Writeup うさみみハリケーンで解いてみた
この Writeup について
「 picoCTF 」は、セキュリティの技術を競う競技大会「 CTF 」のひとつで、中学生・高校生向けのものです。普段 PC ゲームの解析で使っている「うさみみハリケーン」で、この「 picoCTF 2019 」を解いてみました。この解説の解き方には正攻法ではないものがありますので、「出題の意図に沿った正しい解き方が知りたい」方は、他の Writeup ( CTF の解き方の解説)も読まれることをお勧めします。CTF では問題の答えのことを「フラグ」といいます。各問題の説明の最後にある文字列がフラグです。
筆者は「同人 PC ゲームの解析をする人」で、情報セキュリティ系の人ではないので、CTF・Linux・Python の経験はありません。統合開発環境「 Visual Studio Community 」の「 Visual C++ 」で、「うさみみハリケーン」のプラグインをコンパイルした経験はあります。
picoCTF 2019 の問題はこちらから。開催期間中の picoCTF は、問題を解き進めると表示される問題が増えていくという仕様になっています。
この Writeup は、前回「 picoCTF 2018 」の解説「PicoCTF 2018 Writeup うさみみハリケーンで解いてみた」のフォーマットを再利用しています。
CTF や PC ゲーム解析では、必ず最新版の「うさみみハリケーン」を使用してください。古いバージョンだと上手くいかないこともあります。
この Writeup で使用している「うさみみハリケーン」は32ビット版の「 UsaMimi.exe 」です。「青い空を見上げればいつもそこに白い猫」の実行ファイルは「AoZoraSiroNeko.exe」です。
補足:このWriteupは、匿名希望の方からDigital Travesiaへ提供されたものです。公開にあたり、Digital Travesia側で文体の変更および若干の修正や補記を行っています。
ツールの入手先
汎用プロセスメモリエディタ兼デバッガ「うさみみハリケーン」「うさみみハリケーン」の公式サイト
「うさみみハリケーン」のダウンロード・インストール・使用方法 (messiahcat氏提供)
ツールの使い方
●うさみみハリケーンと付属ツールの説明「うさみみハリケーン」の最新オンラインヘルプ
式入力演算・進数変換ソフト「UMEC」
多倍長整数演算・進数変換ソフト 「UMECappend」
汎用ファイルアナライザ「青い空を見上げればいつもそこに白い猫」(略称:青空白猫)
●使う前に読んでおいた方がよい解説
基礎用語 バイナリファイルの解析
基礎用語 キャラクターコード(文字コード)
基礎用語 逆アセンブルコードリスト
ステガノグラフィーの解析について
ファームウェア解析への『うさみみハリケーン』活用について
YARAについて
picoCTF 2019 解いてみた問題と Writeup 目次
●2Warm●Glory of the Garden
●Lets Warm Up
●The Numbers
●Warmed Up
●practice-run-1
●vault-door-training
●13
●Bases
●First Grep
●strings it
●vault-door-1
●So Meta
●What Lies Within
●extensions
●asm1
●vault-door-3
●WhitePages
●asm2
●c0rrupt
●vault-door-4
●asm3
●vault-door-5
●vault-door-6
●asm4
●vault-door-7
●vault-door-8
2Warm - Points: 50
Can you convert the number 42 (base 10) to binary (base 2)?「うさみみハリケーン」付属の「UMEC」(UMEC.exe)を使うとわかる
picoCTF{101010}
Glory of the Garden - Points: 50
This garden contains more than it seems. You can also find the file in /problems/glory-of-the-garden_0_8731a7d4bc355885c1dde115a9fe3978 on the shell server.問題の JPEG ファイルを、「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」でステガノグラフィー解析(フォーマット解析)するとわかる
picoCTF{more_than_m33ts_the_3y3f089EdF0}
Lets Warm Up - Points: 50
If I told you a word started with 0x70 in hexadecimal, what would it start with in ASCII?「うさみみハリケーン」付属の「UMECappend」で 16進数の 0x70 を ASCII に変換するとわかる
picoCTF{p}
The Numbers - Points: 50
The numbers... what do they mean?問題画像にある10進数値の配列は、フラグとなる ASCII 文字列の元で、それぞれ 0x40 からの相対値と判断
ヒントでフラグは大文字で入力することが指定されている
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
10進数値の配列をバイト列として一度にプロセスメモリへ書き込む
メニューの「編集」→「選択アドレスへの直接書き込み・選択範囲の一括書き換え」
さらにバイト列の個々のバイトに対して 0x40 を加算する
メニューの「編集」→「選択範囲への演算実行」でバイト単位で加算を実行する
実行後にメニューの「編集」→「指定メモリエリアから文字列を抽出」で文字列を抽出してコピー
PICOCTF{THENUMBERSMASON}
Warmed Up - Points: 50
What is 0x3D (base 16) in decimal (base 10).「うさみみハリケーン」付属の「UMEC」(UMEC.exe)を使うとわかる
picoCTF{61}
practice-run-1 - Points: 50
You're going to need to know how to run programs if you're going to get out of here. Navigate to /problems/practice-run-1_0_62b61488e896645ebff9b6c97d0e775e on the shell server and run this program to receive a flag.問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
「青い空を見上げればいつもそこに白い猫」の「YARAルールでスキャン」でフラグを検索( GREP )するやり方もある
全部の問題ファイルを一つのフォルダにダウンロードしてから、フォルダごとスキャンする
スキャンに使う CTF 用 YARA ルールの例は以下
rule CTF_Flag_Strings : CTF { strings: $Flag1 = "ctf{" nocase ascii wide $Flag2 = "flag{" nocase ascii wide $Flag3 = "f14g{" nocase ascii wide condition: any of them }
picoCTF{g3t_r3adY_2_r3v3r53}
vault-door-training - Points: 50
Your mission is to enter Dr. Evil's laboratory and retrieve the blueprints for his Doomsday Project. The laboratory is protected by a series of locked vault doors. Each door is controlled by a computer and requires a password to open. Unfortunately, our undercover agents have not been able to obtain the secret passwords for the vault doors, but one of our junior agents obtained the source code for each vault's computer! You will need to read the source code for each level to figure out what the password is for that vault door. As a warmup, we have created a replica vault in our training facility. The source code for the training vault is here: VaultDoorTraining.java問題の JAVA ファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
picoCTF{w4rm1ng_Up_w1tH_jAv4_7e183572fa2}
13 - Points: 100
Cryptography can be easy, do you know what ROT13 is? cvpbPGS{abg_gbb_onq_bs_n_ceboyrz}「うさみみハリケーン」付属の「UMECappend」で rot13 変換するとわかる
picoCTF{not_too_bad_of_a_problem}
Bases - Points: 100
What does this bDNhcm5fdGgzX3IwcDM1 mean? I think it has something to do with bases.「うさみみハリケーン」付属の「UMECappend」で base64 変換するとわかる
picoCTF{l3arn_th3_r0p35}
First Grep - Points: 100
Can you find the flag in file? This would be really tedious to look through manually, something tells me there is a better way. You can also find the file in /problems/first-grep_0_93be1631acf1a93b98cdcc3e7b9fdc52 on the shell server.問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
抽出結果から目視でフラグを探すより検索した方が簡単
picoCTF{grep_is_good_to_find_things_4b2451ea}
strings it - Points: 100
Can you find the flag in file without running it? You can also find the file in /problems/strings-it_3_8386a6aa560aecfba03c0c6a550b5c51 on the shell server.問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で文字列抽出するとわかる
抽出結果から目視でフラグを探すより検索した方が簡単
picoCTF{5tRIng5_1T_c7fff9e5}
vault-door-1 - Points: 100
This vault uses some complicated arrays! I hope you can make sense of it, special agent. The source code for this vault is here: VaultDoor1.java問題の JAVA ファイルに、パスワードを構成する各文字とその先頭からの相対位置が、文字の順番をバラバラにして書かれている
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
パスワードを構成する各文字と先頭からの相対位置を基に、順番に手動でプロセスメモリへ書き込んでいく
先頭からの相対位置が重要なので、メニューの「編集」→「選択アドレスを基準にして相対アドレス表示」も使用してミスを防ぐ
書き込み後にメニューの「編集」→「指定メモリエリアから文字列を抽出」で文字列を抽出してコピー
picoCTF{d35cr4mbl3_tH3_cH4r4cT3r5_51e7fd}
So Meta - Points: 150
Find the flag in this picture. You can also find the file in /problems/so-meta_6_8d7541b8d04bd65a01336fdb8db6db24.問題の PNG ファイルを、「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」でステガノグラフィー解析(フォーマット解析)すると、
「tEXt文字列チャンク: キーワード[Artist] オフセット0001A8C3 サイズ00000020バイト」と表示される
なので、「青い空を見上げればいつもそこに白い猫」のヘキサエディタ(日本で言うバイナリエディタ)でオフセット 0001A8C3 以降を見るとわかる
picoCTF{s0_m3ta_505fdd8b}
What Lies Within - Points: 150
Theres something in the building. Can you retrieve the flag?問題の PNG ファイルを、「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」でステガノグラフィー解析すると、画像の左上隅にデータ埋め込みが見える
表示候補を全部試した結果、データ埋め込みがあるのは赤緑青の各色ビット0と判断
「青い空を見上げればいつもそこに白い猫」でステガノグラフィー解析(ビット抽出)するとわかる
picoCTF{h1d1ng_1n_th3_b1t5}
extensions - Points: 150
This is a really weird text file TXT? Can you find the flag?問題の TXT ファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で読み込むと、ファイル形式は PNG 画像ファイルと判別される
「青い空を見上げればいつもそこに白い猫」のステガノグラフィー解析機能で読み込んでみるとわかる
picoCTF{now_you_know_about_extensions}
asm1 - Points: 200
What does asm1(0x610) return? Submit the flag as a hexadecimal value (starting with '0x'). NOTE: Your submission for this question will NOT be in the normal flag format. Source located in the directory at /problems/asm1_1_95494d904d73b330976420bc1cd763ec.問題のアセンブリ言語ソースコードを「うさみみハリケーン」の「パラサイトルーチン作成」機能で注入して実行させればよい
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
メニューの「デバッグ」→「パラサイトルーチン作成」、ダイアログが表示されたら「確保」ボタン
問題のソースコードは関数だけなので、引数を指定してその関数を CALL するコードを追加する
問題のソースコードのジャンプ先アドレス部分はプロセスメモリ上のアドレスに書き換える
アセンブリ言語ソースコードを記述してから「プレビュー」ボタンで問題がないか確認
実行させるコードへのジャンプは不要なので、書き込む前に「ルーチンのみ」チェックボックスにチェックしておく
「ジャンプ+ルーチン書き込み」ボタンで、プレビューされたアセンブル後のバイナリデータをプロセスメモリに書き込む
メニューの「デバッグ」→「ブレークポイントの挿入/削除」で関数実行直後に実行ブレークポイントをセット
メニューの「デバッグ」→「選択アドレスでCreateRemoteThread関数を実行」でコード先頭から実行させる
ブレークしたら EAX レジスタに戻り値が表示される
アセンブルコードそれぞれの処理結果を見たいなら、関数先頭にブレークポイント+「ブレーク時に実行一時停止」でステップ実行
本来のパラサイトルーチン活用方法である、デバッガや CreateRemoteThread 関数を使用しない方法もある
メニューの「デバッグ」→「モジュールを逆アセンブル」で「UsaTest2.EXE」のプロセスを解析する
「UsaTest2.EXE」画面上部「パラメータ増加」ボタンに対応する処理の開始アドレスは 0040137C であることがわかる
このアドレスからパラサイトルーチンにジャンプさせ、ボタンを押せばフラグを表示するように改造する
パラサイトルーチンの設定で、ジャンプ元アドレスに 0040137C を指定する
パラサイトルーチンのテンプレート出力で「レジスタ取得・表示」を出力してから問題の関数呼び出し処理を組み合わせる
以下の例は確保バッファアドレスが 7FE70000 の場合で、実行環境によってアドレスの値の修正が必要になる
;ジャンプ元:0040137C 先:7FE70000 PUSHAD PUSHFD ;追加コード先頭 push 0x610 call 7FE70050 add esp, 4 PUSH EAX PUSH 7FE70400;"Flag=EAX:0x%x" PUSH 7FE70500;文字列出力用バッファアドレス CALL 7707F7E0;wsprintfA ADD ESP, 0C;スタック破棄 PUSH 0 ;MB_OK PUSH 7FE70480;タイトル文字列アドレス PUSH 7FE70500;メッセージ文字列アドレス PUSH 0 CALL 770C78F0;MessageBoxA ;追加コード終端 POPFD POPAD ;オリジナルのコードを復元 ;">"で目印設定 >PUSH 4020C7 ;ジャンプ元に戻る JMP 00401381 :7FE70050 push ebp mov ebp,esp cmp DWORD PTR [ebp+0x8],0x3b9 jg 7FE70072 cmp DWORD PTR [ebp+0x8],0x1 jne 7FE7006a mov eax,DWORD PTR [ebp+0x8] add eax,0x11 jmp 7FE70089 mov eax,DWORD PTR [ebp+0x8] sub eax,0x11 jmp 7FE70089 cmp DWORD PTR [ebp+0x8],0x477 jne 7FE70083 mov eax,DWORD PTR [ebp+0x8] sub eax,0x11 jmp 7FE70089 mov eax,DWORD PTR [ebp+0x8] add eax,0x11 pop ebp ret上のアセンブリ言語ソースコードを記述してから「プレビュー」ボタンで問題がないか確認
「ジャンプ+ルーチン書き込み」ボタンで、プレビューされたアセンブル後のバイナリデータをプロセスメモリに書き込む
「うさみみハリケーン」のダンプ画面上で、(上の例では)アドレス 7FE70400 に、ANSI文字列"Flag=EAX:0x%x"を書き込む
これで「UsaTest2.EXE」の画面上部「パラメータ増加」ボタンを押せばフラグが表示される
0x621
vault-door-3 - Points: 200
This vault uses for-loops and byte arrays. The source code for this vault is here: VaultDoor3.java問題の JAVA ファイルにパスワード比較処理と最終的な比較対象文字列が書かれている
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
まず最終的な比較対象文字列を書き込む
メニューの「編集」→「選択アドレスへの直接書き込み・選択範囲の一括書き換え」
書き込んだ文字列を見ながら比較条件に合致する文字を書き込んでいく
比較処理内容は、文字の位置(先頭からの相対距離)を整数 i とすると
char[0]からchar[7]は入力文字列をそのままコピー
char[8]からchar[15]は入力文字列の 23-i の位置にある文字をコピー
char[16]から2バイトごとchar[30]までに入力文字列の 46-i の位置にある文字をコピー
char[31]から2バイトごとchar[17]までに入力文字列をそのままコピー
書き込んだらメニューの「編集」→「指定メモリエリアから文字列を抽出」で文字列を抽出してコピー
picoCTF{jU5t_a_s1mpl3_an4gr4m_4_u_90cf31}
WhitePages - Points: 250
I stopped using YellowPages and moved onto WhitePages... but the page they gave me is all blank!問題の TXT ファイルを、「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で解析する
「青い空を見上げればいつもそこに白い猫」のヘキサエディタで開くと、このファイルは「 E28083 」と「 20 」の2種類のバイナリデータで構成されている
なので2進数への変換が必要な問題と判断(ほかに各バイナリデータの連続出現回数を16進数に変換なども考えてみた)
2進数への変換にあたって、問題の TXT ファイルのバイナリデータを16進文字列化すれば加工しやすくなると推測
このヘキサエディタ上で、Ctrl+A キーで全選択、さらに Ctrl+D キーでクリップボードにコピーする(ファイル保存はキャンセル)
これで問題のファイルのバイナリデータを、プログラミング用のバイト列情報の文字列に変換したものが得られる
unsigned char aData[] =
{
0xE2, 0x80, 0x83, 0xE2, 0x80, 0x83, 0xE2, 0x80, 0x83, 0xE2, 0x80, 0x83, 0x20, 0xE2, 0x80, 0x83,
(以下省略)
クリップボードにコピーされた文字列をテキストエディタで整形する
「0xE2」を「0」に置換
「0x80」を「」(文字数ゼロ)に置換して削除
「0x83」を「」(文字数ゼロ)に置換して削除
「0x20」を「1」に置換
「うさみみハリケーン」付属の「UMECappend」で、整形した文字列に含まれている2進文字を連結して ASCII 文字列に変換できる
ちなみに、「うさみみハリケーン」付属のx86/x64 簡易アセンブラ・逆アセンブラ「ロケットねこみみ」(NekoAsm64.exe)で、
実行モードを逆アセンブラにしてから問題のファイルをドラッグ・アンド・ドロップか「バイナリファイル」ボタンで読み込んでも、16進文字列化ができる
この場合は得られた16進文字列を正規表現対応のテキストエディタで整形する
改行「\n」を「」(文字数ゼロ)に置換して削除
「E28083」を「0」に置換
「20」を「1」に置換
picoCTF{not_all_spaces_are_created_equal_3bf40b869ee984866e67f3057f006a92}
asm2 - Points: 250
What does asm2(0x10,0x18) return? Submit the flag as a hexadecimal value (starting with '0x'). NOTE: Your submission for this question will NOT be in the normal flag format. Source located in the directory at /problems/asm2_0_a50f0b17a6f50b50a53305ebd71af535.問題のアセンブリ言語ソースコードを「うさみみハリケーン」の「パラサイトルーチン作成」機能で注入して実行させればよい
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
メニューの「デバッグ」→「パラサイトルーチン作成」、ダイアログが表示されたら「確保」ボタン
問題のソースコードは関数だけなので、引数を指定してその関数を CALL するコードを追加する
問題のソースコードのジャンプ先アドレス部分はプロセスメモリ上のアドレスに書き換える
アセンブリ言語ソースコードを記述してから「プレビュー」ボタンで問題がないか確認
実行させるコードへのジャンプは不要なので、書き込む前に「ルーチンのみ」チェックボックスにチェックしておく
「ジャンプ+ルーチン書き込み」ボタンで、プレビューされたアセンブル後のバイナリデータをプロセスメモリに書き込む
メニューの「デバッグ」→「ブレークポイントの挿入/削除」で関数実行直後に実行ブレークポイントをセット
メニューの「デバッグ」→「選択アドレスでCreateRemoteThread関数を実行」でコード先頭から実行させる
ブレークしたら EAX レジスタに戻り値が表示される
アセンブルコードそれぞれの処理結果を見たいなら、関数先頭にブレークポイント+「ブレーク時に実行一時停止」でステップ実行
0xff
c0rrupt - Points: 250
We found this file. Recover the flag. You can also find the file in /problems/c0rrupt_0_1fcad1344c25a122a00721e4af86de13.問題のファイルを「うさみみハリケーン」付属の「青い空を見上げればいつもそこに白い猫」で解析する
「青い空を見上げればいつもそこに白い猫」のヘキサエディタで開くと、 PNG 画像ファイルのチャンク名らしいものが見えるので壊れた PNG 画像と判断
ヘッダ先頭のバイナリデータやチャンク名を修正する
PNG 画像として表示可能になった
picoCTF{c0rrupt10n_1847995}
vault-door-4 - Points: 250
This vault uses ASCII encoding for the password. The source code for this vault is here: VaultDoor4.java問題の JAVA ファイルにパスワード比較処理が書かれている
入力文字列をバイト列として、各バイトを10進数値、16進数値、8進数値、 ASCII 文字と比較している
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
比較処理の10進数値、16進数値、8進数値の配列を一度にプロセスメモリへ書き込む
メニューの「編集」→「選択アドレスへの直接書き込み・選択範囲の一括書き換え」
続いて ASCII 文字列を一度にプロセスメモリへ書き込む
書き込んだらメニューの「編集」→「指定メモリエリアから文字列を抽出」で文字列を抽出してコピー
picoCTF{jU5t_4_bUnCh_0f_bYt3s_7a1c8c668b}
asm3 - Points: 300
What does asm3(0xfe8cf7a4,0xf55018af,0xb8c70926) return? Submit the flag as a hexadecimal value (starting with '0x'). NOTE: Your submission for this question will NOT be in the normal flag format. Source located in the directory at /problems/asm3_6_22c78ed107ca0b7dd11f868d7203cf8c.問題のアセンブリ言語ソースコードを「うさみみハリケーン」の「パラサイトルーチン作成」機能で注入して実行させればよい
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
メニューの「デバッグ」→「パラサイトルーチン作成」、ダイアログが表示されたら「確保」ボタン
問題のソースコードは関数だけなので、引数を指定してその関数を CALL するコードを追加する
アセンブリ言語ソースコードを記述してから「プレビュー」ボタンで問題がないか確認
実行させるコードへのジャンプは不要なので、書き込む前に「ルーチンのみ」チェックボックスにチェックしておく
「ジャンプ+ルーチン書き込み」ボタンで、プレビューされたアセンブル後のバイナリデータをプロセスメモリに書き込む
メニューの「デバッグ」→「ブレークポイントの挿入/削除」で関数実行直後に実行ブレークポイントをセット
メニューの「デバッグ」→「選択アドレスでCreateRemoteThread関数を実行」でコード先頭から実行させる
ブレークしたら EAX レジスタに戻り値が表示される
アセンブルコードそれぞれの処理結果を見たいなら、関数先頭にブレークポイント+「ブレーク時に実行一時停止」でステップ実行
0xe82f
vault-door-5 - Points: 300
In the last challenge, you mastered octal (base 8), decimal (base 10), and hexadecimal (base 16) numbers, but this vault door uses a different change of base as well as URL encoding! The source code for this vault is here: VaultDoor5.java問題の JAVA ファイルにパスワード比較処理が書かれている
入力文字列との比較用文字列は base64 変換されている
なので「うさみみハリケーン」付属の「UMECappend」で base64 変換する
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
変換後のURL用文字列をバイト列としてプロセスメモリに書き込む、書き込むモードは「Byte列入力」を指定
このモードでは、バイト列の書き込み指定用文字列のうち16進文字以外は無視される
メニューの「編集」→「選択アドレスへの直接書き込み・選択範囲の一括書き換え」
書き込んだらメニューの「編集」→「指定メモリエリアから文字列を抽出」で文字列を抽出してコピー
picoCTF{c0nv3rt1ng_fr0m_ba5e_64_db6946ba}
vault-door-6 - Points: 350
This vault uses an XOR encryption scheme. The source code for this vault is here: VaultDoor6.java問題の JAVA ファイルにパスワード比較処理が書かれている
入力文字列と比較用文字列の比較時に XOR 演算を行っている
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
XOR 演算後の比較用バイト列をそのままプロセスメモリに書き込む
メニューの「編集」→「選択アドレスへの直接書き込み・選択範囲の一括書き換え」
メニューの「編集」→「選択範囲への演算実行」でバイト単位で XOR 演算を実行し、再演算で XOR 演算前に戻す
XOR 演算実行後にメニューの「編集」→「指定メモリエリアから文字列を抽出」で文字列を抽出してコピー
picoCTF{n0t_mUcH_h4rD3r_tH4n_x0r_3484ebc}
asm4 - Points: 400
What will asm4("picoCTF_376ee") return? Submit the flag as a hexadecimal value (starting with '0x'). NOTE: Your submission for this question will NOT be in the normal flag format. Source located in the directory at /problems/asm4_2_0932017a5f5efe2bc813afd0fe0603aa.問題のアセンブリ言語ソースコードを「うさみみハリケーン」の「パラサイトルーチン作成」機能で注入して実行させればよい
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
メニューの「デバッグ」→「パラサイトルーチン作成」、ダイアログが表示されたら「確保」ボタン
問題のソースコードは関数だけなので、引数を指定してその関数を CALL するコードを追加する
問題のソースコードのジャンプ先アドレス部分はプロセスメモリ上のアドレスに書き換える
アセンブリ言語ソースコードを記述してから「プレビュー」ボタンで問題がないか確認
実行させるコードへのジャンプは不要なので、書き込む前に「ルーチンのみ」チェックボックスにチェックしておく
「ジャンプ+ルーチン書き込み」ボタンで、プレビューされたアセンブル後のバイナリデータをプロセスメモリに書き込む
引数は文字列"picoCTF_376ee"のポインタなので、確保したバッファ内のアドレスを引数に指定してこのANSI文字列を書き込んでおく
メニューの「デバッグ」→「ブレークポイントの挿入/削除」で関数実行直後に実行ブレークポイントをセット
メニューの「デバッグ」→「選択アドレスでCreateRemoteThread関数を実行」でコード先頭から実行させる
ブレークしたら EAX レジスタに戻り値が表示される
アセンブルコードそれぞれの処理結果を見たいなら、関数先頭にブレークポイント+「ブレーク時に実行一時停止」でステップ実行
0x24d
vault-door-7 - Points: 400
This vault uses bit shifts to convert a password string into an array of integers. Hurry, agent, we are running out of time to stop Dr. Evil's nefarious plans! The source code for this vault is here: VaultDoor7.java問題の JAVA ファイルにパスワード比較処理が書かれている
入力文字列との比較用に4バイト数値のビッグエンディアンのバイト列を使用している
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
比較用数値群を4バイト数値の配列としてプロセスメモリに書き込む
メニューの「編集」→「選択アドレスへの直接書き込み・選択範囲の一括書き換え」
メニューの「編集」→「選択範囲への演算実行」で各4バイトの数値に対して、バイトの並びを逆転させる BSWAP 命令を実行する
BSWAP 命令実行後にメニューの「編集」→「指定メモリエリアから文字列を抽出」で文字列を抽出してコピー
picoCTF{A_b1t_0f_b1t_sh1fTiNg_97cb1f367b}
vault-door-8 - Points: 450
Apparently Dr. Evil's minions knew that our agency was making copies of their source code, because they intentionally sabotaged this source code in order to make it harder for our agents to analyze and crack into! The result is a quite mess, but I trust that my best special agent will find a way to solve it. The source code for this vault is here: VaultDoor8.java問題の JAVA ファイルにパスワード比較処理用の関数が書かれている
入力文字列の各文字に対して、引数の異なる比較処理用関数を8回適用してから最終的な比較用バイトと比較している
「うさみみハリケーン」付属の「UMEC」(UMEC.exe)で比較処理用関数の中身と8回適用分の演算式を組み上げる
1行目と2行目ができれば、3行目以降はほぼコピペで済む
c=0x20;p1=1;p2=2;
m1=(1<p1);m2=(1<p2);b1=(c&m1);b2=(c&m2);r1=(c&((m1|m2)!0));s=p2-p1;r2=((b1<s)|(b2>s)|r1);
ca=r2;p1a=0;p2a=3;
m1a=(1<p1a);m2a=(1<p2a);b1a=(ca&m1a);b2a=(ca&m2a);r1a=(ca&((m1a|m2a)!0));sa=p2a-p1a;r2a=((b1a<sa)|(b2a>sa)|r1a);
cb=r2a;p1b=5;p2b=6;
m1b=(1<p1b);m2b=(1<p2b);b1b=(cb&m1b);b2b=(cb&m2b);r1b=(cb&((m1b|m2b)!0));sb=p2b-p1b;r2b=((b1b<sb)|(b2b>sb)|r1b);
cc=r2b;p1c=4;p2c=7;
m1c=(1<p1c);m2c=(1<p2c);b1c=(cc&m1c);b2c=(cc&m2c);r1c=(cc&((m1c|m2c)!0));sc=p2c-p1c;r2c=((b1c<sc)|(b2c>sc)|r1c);
cd=r2c;p1d=0;p2d=1;
m1d=(1<p1d);m2d=(1<p2d);b1d=(cd&m1d);b2d=(cd&m2d);r1d=(cd&((m1d|m2d)!0));sd=p2d-p1d;r2d=((b1d<sd)|(b2d>sd)|r1d);
ce=r2d;p1e=3;p2e=4;
m1e=(1<p1e);m2e=(1<p2e);b1e=(ce&m1e);b2e=(ce&m2e);r1e=(ce&((m1e|m2e)!0));se=p2e-p1e;r2e=((b1e<se)|(b2e>se)|r1e);
cf=r2e;p1f=2;p2f=5;
m1f=(1<p1f);m2f=(1<p2f);b1f=(cf&m1f);b2f=(cf&m2f);r1f=(cf&((m1f|m2f)!0));sf=p2f-p1f;r2f=((b1f<sf)|(b2f>sf)|r1f);
cg=r2f;p1g=6;p2g=7;
m1g=(1<p1g);m2g=(1<p2g);b1g=(cg&m1g);b2g=(cg&m2g);r1g=(cg&((m1g|m2g)!0));sg=p2g-p1g;r2g=((b1g<sg)|(b2g>sg)|r1g);
r2g
この演算式に、ASCII入力可能範囲の0x20から0x28、0x40から0x48を入力といったサンプリングをして演算結果の規則性を探す
得られた規則性を基に、演算結果が最終的な比較用バイトそれぞれに合致する16進数値を「うさみみハリケーン」でASCII文字に変換する
もし規則性が得られなかったら、演算式にASCII入力可能範囲0x20から0x7Eまで入力し、入力結果一覧を作って参照していた
「うさみみハリケーン」付属の解析練習用ソフト「UsaTest2.EXE」を起動して「うさみみハリケーン」でオープン
ツールバーの青色三角ボタン、メニューだと「移動」→「次のコミットエリアに移動」を3回で、アドレス 403000 に移動
アドレス 403000 から 412FFF までは、プロセスメモリ書き込み練習用領域なので自由に使える
上の演算結果が最終的な比較用バイトそれぞれに合致する16進数値を手動で入力していく
入力後にメニューの「編集」→「指定メモリエリアから文字列を抽出」で文字列を抽出してコピー
picoCTF{s0m3_m0r3_b1t_sh1fTiNg_ad0f0c833}