CTF 攻略記事
やあ、私は Sean です。余暇に CTF の問題を解くのが好きです。現在の仕事では
バイナリエクスプロイトとソフトウェアリバースエンジニアリングを多く扱っているため、
どちらかといえばそれらのカテゴリに焦点を当てがちです。ネットで見かける攻略記事の多くは
ひどいものなので、ここにある記事が基礎的な概念のいくつかをよりうまく説明できていると
願っています。
すべての解法には、pwntools で書かれた再現可能なソリューションを可能な限り含めるように
しています。大切なのはフラグではなく、フラグにたどり着くまでの道のりです。
この記事がすぐに古びてしまわないことを願いつつ、これらの CTF 問題のいくつかについては
ビデオウォークスルーも作成してみました。YouTube で視聴できます。
以下は、一般的な Unix Access のトピックと、それに関連する CTF チャレンジのリストです。
Unix Access の知識
脆弱性クラス
脆弱性クラスをエクスプロイトする能力を示す
- ゼロから動作するシェルコードを作成し、シェルコードを書くためのすべての手順を示す:
- 以下の緩和策がある場合とない場合のスタックバッファオーバーフロー:アドレス空間レイアウトのランダム化(ASLR)、実行不可メモリ(NX)、スタックカナリア:
- ヒープグルーミングと関数ポインタを持つオブジェクトを用いたヒープバッファオーバーフロー:
- ヒープデータ構造を破壊することによるヒープバッファオーバーフロー:
- 関数ポインタを含むオブジェクトを使った UAF:
- 任意読み書きプリミティブを可能にするオブジェクトを使った UAF:
- 型の混同(type confusion)の脆弱性
- 任意読み書きプリミティブのための書式文字列(format string)の脆弱性:
- 未初期化変数がエクスプロイトにどのように利用されるか:
エクスプロイトプリミティブを実装する能力を示す
- 任意書き込みプリミティブ:
- 相対書き込みプリミティブ:
- 任意読み出しプリミティブ:
- プリミティブを連鎖させてエクスプロイトを構築する方法
- 書き込みプリミティブを使用して権限を昇格/任意のコードを実行する方法:
以下の ELF リンキング構造の目的と構造、およびバイナリエクスプロイトにおいてそれらがどのように悪用されるかを説明する
- Procedure Linkage Table(PLT):
- Global Offset Table(GOT):
PLT/GOT データ構造の相互作用の観点から以下の動的再配置モードを説明し、それらの間でエクスプロイトプリミティブがどのように異なるかを説明する
- Partial RELRO:
- Full RELRO:
以下のことを行うために ROP/JOP を実装する能力を示す
- ROP/JOP ガジェットを見つける:
- libc 関数とシステムコールを呼び出す:
- ガジェットを連鎖させてコードを実行する:
- 任意のシェルコードを実行する
エクスプロイト緩和策の目的と実装を説明する
- ASLR
- Data Execution Prevention(DEP)/NX:
- Position Independent Executables(PIE)
- PIE がエクスプロイトに与える影響
- スタックカナリア:
- セーフアンリンク(safe unlinking)
ソフトウェアリバースエンジニアリング
以下の技術とそのユースケースを比較対照する
- 静的リバースエンジニアリング:
- 動的リバースエンジニアリング:
以下の種類のツールを使って静的・動的リバースエンジニアリングを行うことに精通していることを示す
- 静的ディスアセンブラ
- デバッガ
- 上記ツールを用いた自動化技術
ファジング技術
- ダムファジング技術
- コードカバレッジベースのファジング
- シンボリック実行
参考になる CTF ブログ記事