セキュリティ・キャンプ全国大会2023 専門コースC【脅威解析クラス】応募課題 以下の問1から問8について、それぞれ回答してください。ただし問1~4は2000文字以内で回答してください。 なお、正解がある設問については、"正解していること"よりも"正解にたどり着くまでのプロセスや熱意"を重要視しています。答えにたどり着くまでの試行錯誤や自分なりの工夫等を書いて、精一杯アピールしてください。 ## 問1 あなたがセキュリティ・キャンプ全国大会に応募する理由を教えてください。受講生や講師とのコミュニケーション、受講したい講義、なりたい自分など、何でも構いません。 ## 問2 今までに解析したことのあるソフトウェアやハードウェアにはどのようなものがありますか?解析の目的や解析方法、結果として得られた知見などを含めて教えてください。 ## 問3 今までに作成したソフトウェアやハードウェアにはどのようなものがありますか? どんな言語やライブラリ、パーツを使って作ったのか、どこにこだわって作ったのか、などたくさん自慢してください。 ## 問4 ここ数年に発表された、以下のキーワードに関連するニュースや記事や学術論文から1つ選び、それに関して調べた内容を記述してください。内容には、1.選んだ理由、2.技術的詳細、3.被害規模または影響範囲、4.対策、の4点を必ず含めてください。なお、対策は今ある技術のみに捕われず、将来的な技術や法律など、自由な発想で書いてください。 キーワード: - サイバーセキュリティインシデント - マルウェア - 攻撃キャンペーン - 脆弱性 - 新たな攻撃手法 - 未知の脅威 ## 問5 ポートスキャンに関して、次の各問に回答してください。 ### 問5-1 TCPのポートに対するポートスキャンの方法には、TCP SYNスキャン、TCP Connectスキャンが知られています。これらの手法には互いに長所と短所が存在します。 TCP SYNスキャンの長所/短所、TCP Connectスキャンの長所/短所をそれぞれ述べてください。 ### 問5-2 RustScanやMASSCANなど、Nmapより高速にポートスキャンを行えるツールが台頭しています。しかし、ポートスキャンを高速に行うと問題が生じる場合(特に社内/学内などの内部ネットワークを対象とする場合)があります。具体的な影響の例とともに考えられる問題点を述べてください。 ## 問6 (配布ファイルは以下に置きました) https://www.kazamiya.net/files/69128407fd804bd05c365b9696d99cab/sc2023_sd.zip 外付デバイスに保存していたデータがランサムウェアによって使用不能になってしまいました。配布ファイルは、使用不能になった時点で取得した外付デバイスのディスクイメージファイル(dd形式)です。ランサムウェアの特徴とディスクの状態を踏まえると、データの一部は復旧の余地があります。 配布ファイルを解析して、以下の問題に回答してください。 ### 問6-1 実行されたランサムウェアの特徴について判明したことを記述してください。 ### 問6-2 使用不能状態のファイルは合計で7つありますが、ファイルによっては元のデータへの復旧、または一部データの復旧が可能です。復旧を試みた過程と、復旧できた場合はどのようなデータであったかがわかる情報(ファイル名、タイトル、内容、数字など)を含めて記述してください。 ## 問7 添付されたプログラムは特定のファイルを暗号化するプログラムです。このプログラムによって暗号化されたファイルがflag.encです。 flag.zip(https://1drv.ms/u/s!Av9PgeUNEmzMhCRf2L1_0FrWmbEK?e=IOohsX) ### 問7-1 このプログラムが利用する暗号アルゴリズム、鍵等の情報を含めて動作を説明してください。 ### 問7-2 プログラムを解析し、flag.encを復号するコードを書いて提出してください。また、復号結果も示してください。 ## 問8 きりんさんは、セキュリティに興味を持ち始めた大学1年生です。きりんさんはC言語とセキュリティについて勉強している時に、以下の疑問を持ちました。 ### 問8-1 きりんさんは自分で書いたCプログラムをコンパイルして生成されたアセンブラを眺めながらお茶を飲んでいました。自分で作った`func`という関数の呼び出しが`call func`という命令になっていることには納得しましたが、関数の呼び出し前に`mov rdi, 0`、`func`関数の先頭に`push rbp`のような書いた覚えのない命令がいくつかあることに気が付きました。 x86-64アーキテクチャにおいて関数呼び出しがどのように行われるのか説明して下さい。説明には、引数の渡し方や関数から戻る際の処理などを含めて書いて下さい。 ### 問8-2 きりんさんは、関数呼び出しの全てを理解しました。 しかし、「`func`という関数は自分で書いたコードの中にあるから関数のアドレスが分かるけど、`printf`や`scanf`のようなライブラリ関数はどうやって呼び出すのだろう」と気になりました。少し調べたところ、ELFバイナリにはGOT(Global Offset Table)やPLT(Procedure Linkage Table)といったものがあるらしいです。 GOTやPLTはどのようなもので、きりんさんが書いたプログラムはどのようにしてライブラリ関数を呼び出すのか説明して下さい。 ### 問8-3 きりんさんは、GOTやPLTを調べて完全に理解しました。 しかし調べているうちに、GOT内の値を書き換えることでプログラムの制御を奪う攻撃が存在することを知りました。また、それらの攻撃への対策としてFull RELROと呼ばれる機構があることも知りました。 Partial RELROとFull RELROがそれぞれどのようなものであるかを簡単に説明して下さい。 ### 問8-4 きりんさんは、友達のしばいぬさんが作った以下のプログラムにはバグがあることに気が付きました。しかもこの前調べたGOTなどの知識を使うと、本来は呼ばれるはずのない`interactive()`関数を呼ぶことができそうです。 しばいぬさんのプログラムにはどのようなバグがあり、どのようにすれば攻撃することができるのかを説明して下さい。可能であれば、`chall`バイナリに対して実際に攻撃を行いシェルを奪取する道筋を説明して下さい。検討もつかない場合は、このバイナリをGDBでデバッグして得た知見や感想を書いて下さい。 問題バイナリ: https://drive.google.com/file/d/1cMlRAWWA5ZpC0dgZolm8LtZbzMCPgm7l/view?usp=share_link ```chall.c #include #include #define NUM_STUDENT 0x10 char students[NUM_STUDENT][0x10] = {0}; void interactive(void) { system("/bin/bash"); } int main(int argc, char *argv[]) { long id; setvbuf(stdout, NULL, _IONBF, 0); while (1 == 1) { printf("Enter student's ID: "); if (scanf("%15ld", &id) != 1) break; if (id >= NUM_STUDENT) break; printf("Enter student name: "); if (scanf("%15s", students[id]) != 1) break; } puts("Good bye!"); return 0; } ```