Malleus CTF Pwn

コンピュータセキュリティのコンテストCTFのジャンルの1つであるpwnableに焦点をあてて、 解析用の環境の構築方法、スタックバッファの構造、書式文字列攻撃、C++コードの解析、 ヒープオーバーフローによる攻撃方法等の基礎を解説します。

 

頒布

ダウンロード

教材

本書で扱う問題はDockerで動かせるようにしています。 Dockerをインストールして

docker run --rm -it -p 10081:80 -p 10001-10012:10001-10012 kusanok/ctfpwn:2

を実行後、 http://localhost:10081 を開いてください。 このコマンドを実行している間だけ、スコアサーバーと問題サーバーが動作します。

何らかの理由で上記のコマンドによるDocker Hubからの導入ができない場合には、下記のGitHubリポジトリもしくはアーカイブからファイルをダウンロードしてビルドしてください。

詳細

頒布価格
1,000 円くらい
サイズ
B5
ページ数
128ページ

改訂履歴

  • 第2版
    • glibc 2.28 - glibc 2.31に対応
    • House of Orangeの解説を追加
    • File stream oriented programmingの解説を追加
    • Hose of Corrosionの解説を追加

正誤表

第2版

ページ 備考
7 >docker run --rm -it -p 10080:80 -p 10001-10012:10001-10012 kusanok/ctfpwn:2 >docker run --rm -it -p 10081:80 -p 10001-10012:10001-10012 kusanok/ctfpwn:2 10080ポートのアクセスがunsafe portとしてブラウザにブロックされるようになったため、代わりに10081ポートを使用してください。
7 >docker run --rm -it -p 10080:80 -p 10001-10012:10001-10012 ctfpwn >docker run --rm -it -p 10081:80 -p 10001-10012:10001-10012 ctfpwn
7 ブラウザで http://localhost:10080/ を開き、 ブラウザで http://localhost:10081/ を開き、
46 次に、0x12 - 0x34 + 0x100 = 0xde文字を出力して0x134を次のアドレスに書き込みます。 次に、0x12 - 0x34 + 0x100 = 0xde文字を出力して0x112を次のアドレスに書き込みます。
49 rot13を攻撃するために、pwntoolsのpwnlib.fmtstrモジュールが利用できないという記述 (削除)

執筆時点で、アドレスをバッファの後ろに置くようにpwnlib.fmtstrの動作が変更されており、pwnlib.fmtstrを使用してrot13を解くことができました。

Improve format string generator by bennofs · Pull Request #1216 · Gallopsled/pwntools

実装例: rot13_pwntools.py

fmtstr.fmtstr_payloadの引数のoffsetで、fmtstr_payloadの返す文字列の先頭がprintfの何番目の引数にあたるかを指定します。 numbwrittenは、fmtstr_payloadの返す文字列を出力する前にprintfが出力するバイト数です。

初版

ページ 備考
5 >docker run --rm -it -p 10080:80 -p 10001-10007:10001-10007 kusanok/ctfpwn >docker run --rm -it -p 10080:80 -p 10001-10007:10001-10007 kusanok/ctfpwn:1 間違いというわけではないのですが、そのうちタグを指定しなかった場合は最新版になるようにしようと思っています。GitHubリポジトリから取得する場合は、タグv1.0をチェックアウトしてください。
56 fd_nextsize 0x8 双方向連結リストのサイズが自分より大きい要素 fd_nextsize 0x8 双方向連結リストのサイズが自分より小さい要素
56 bk_nextsize 0x8 双方向連結リストのサイズが自分より小さい要素 bk_nextsize 0x8 双方向連結リストのサイズが自分より大きい要素
66 fastbinからchunkを取り外すとき、chunkのサイズがこのfastbinに格納されるべきサイズである (削除) 通常のfree関数の呼び出し時、この条件は確認されていませんでした。

初版をお持ちの方も第2版の電子版をダウンロードできるので、ご利用ください。