CTFのためのプログラミング入門:小さな検証を積み重ねる
CTFでのプログラミングは、大きなアプリケーションを作るためだけのものではありません。
文字列を分ける、バイト列を変換する、同じ計算を繰り返すといった小さな処理を書くと、手作業の見落としを減らせます。
最初に身につける操作
- 入力と出力:ファイルや標準入力から値を受け取り、途中の結果を確認できる形で出力します。
- 文字列とバイト列:表示できる文字と、生のデータを区別して扱います。
- 繰り返しと条件分岐:同じ規則を全ての要素に適用し、例外を明示します。
- エラーの読解:失敗した行と値を手掛かりに、仮説を小さく修正します。
言語は一つに絞って構いません。
Python、JavaScript、Bashなどで、入力と出力を確かめる短いコードを自力で書ける状態を目標にします。
検証コードの作り方
- 問題から確認したい規則を一文にし、入力と期待する出力を一組だけ決めます。
- 規則をそのまま実装し、途中の値を表示して手計算と照合します。
- 境界の値、空の値、文字コードの違いなど、結果が変わりそうな条件を追加します。
- 期待と異なるときは、コード全体を書き直さず、最初にずれた値を探します。
一度に多くを自動化すると、誤った前提まで高速に繰り返してしまいます。
短いコードと小さな入力で仮説を確かめるほうが、問題の理解にもつながります。
読めるコードにする
変数名には、その値が何を表すかを残します。
入手したデータ、変換したデータ、最終結果を別の変数にすれば、どこで内容が変わったか追跡できます。
提出後に読み返して説明できるコードは、次の問題の雛形にもなります。
実行する対象を限定する
入手元が不明なスクリプトやバイナリを、普段使う端末でそのまま実行するわけにはいきません。
チャレンジの配布物でも、問題文の指示と演習環境の範囲を確認し、機密情報を含むファイルを入力にしないでください。
安全な利用条件は責任ある利用方針にまとめています。
次に読むページ
- プログラミングカテゴリのチャレンジで、入出力と検証の練習ができます。
- 暗号CTF入門では、変換を検証する小さなコードが役立ちます。
- CTF初心者におすすめの課題で、取り組む順序を確認できます。