関連サイト
本書の関連ページが用意されています。
内容紹介
情報セキュリティ技術を競う競技であるセキュリティコンテスト:CTF(Capture the Flag)。本書ではCTFの基礎を、技術的な背景の解説を通して実践的に学んでいく一冊です。
現代のCTFにおいて主流である
・Web (Webアプリケーションへの攻撃)
・Crypto (暗号解読)
・Reversing (バイナリ解析)
・Pwnable (低級プログラムの掌握)
の4ジャンルについて取り扱います。
各パートの冒頭には、必要な基礎知識の説明が用意されています。幅広くかつ丁寧に解説していますので、現代CTFの傾向が理解できるとともに、競技を楽しむための足腰を鍛えることができます。
「問題をどのような目線で分析するか」「どのような時に、どの解法を検討するか」といった、問題と向き合う際の思考法への言及にも注目してみてください。
情報セキュリティの技を磨く足掛かりに。CTFに臨むための技術を理論と実践で身に付けよう
書誌情報
- 著者: 梅内翼, 清水祐太郎, 藤原裕大, 前田優人, 米内貴志, 渡部 裕
- 発行日: 2021-07-22 (紙書籍版発行日: 2021-07-22)
- 最終更新日: 2021-07-22
- バージョン: 1.0.0
- ページ数: 704ページ(PDF版換算)
- 対応フォーマット: PDF
- 出版社: マイナビ出版
対象読者
著者について
梅内翼
北陸先端科学技術大学院大学 先端科学技術研究科 博士前期課程 在学。業務ではWebアプリケーションの脆弱性診断、Webフロントエンド開発、Kubernetesクラスタの運用等に従事。CTFでの専門分野はWebで、複数のコンテストにおいて入賞経験を持つ。また、SECCON Beginnersのリーダーとしても活動している。
清水祐太郎
株式会社サイバーディフェンス研究所に於いて脆弱性診断業務に従事。東京農工大学で情報工学を専攻し、修士(工学)を取得。チームTokyoWesternsに所属し、CTFへの参戦や運営に携わる。専らPwnableの問題を嗜む。第45回技能五輪国際大会 サイバーセキュリティ職種に出場経験を持つ。
藤原裕大
2020年に東京工業大学情報理工学院情報工学科を卒業。在学中には株式会社アクティブディフェンス研究所でマルウェア解析を担当。卒業後、株式会社リチェルカセキュリティにてExploit開発や脆弱性診断に従事。チームzer0ptsでPwnable担当として活動し、国内外のCTF運営にも携わる。
前田優人
筑波大学博士前期課程修了後、株式会社サイバーディフェンス研究所にて脆弱性診断業務に従事。またSECCON実行委員会の一員としてCTF 競技の運営にも携わっている。CTFでは幅広いジャンルに興味を持ち、今までにWeb、Pwnable、Reversing、Cryptoの順でマイブームが移り変わっている。
米内貴志
2020年に東京大学理学部情報科学科を卒業。在学中より株式会社Flatt Securityにてセキュリティプロダクトの開発に従事しており、2021年に同社CTOに就任。一般社団法人セキュリティ・キャンプ協議会やSECCON実行委員会の一員として教育活動やCTF競技の運営に取り組んでいる。著書に『Webブラウザセキュリティ』(ラムダノート)がある。
渡部 裕
筑波大学にて学士(情報工学)及び修士(工学)を取得後、株式会社イエラエセキュリティにて外部ペネトレーションテストや脆弱性診断業務に従事。計算機科学全般に興味を持つ。
目次
はじめに
謝辞
Part 1 準備
1 章 CTF 入門
- 1.1 CTF とは
- 1.2 問題の例
- 1.3 競技形式
- 1.3.1 Jeopardy 形式
- 1.3.2 Attack & Defense 形式
- 1.3.3 King of the Hill 形式
- 1.4 代表的なジャンル
- 1.4.1 Web
- 1.4.2 Cryptography
- 1.4.3 Reversing
- 1.4.4 Pwnable
- 1.4.5 Forensics
- 1.4.6 Professional Programming and Coding
- 1.5 参加するには
- 1.6 Writeup のススメ
- 1.7 法律
2 章 実習環境の準備
- 2.1 VirtualBox のインストール
- 2.2 Vagrant のインストール
- 2.3 Vagrantfile のダウンロード
- 2.4 仮想マシンの初期化・起動
- 2.5 仮想マシンの終了・2 回目以降の起動
- 3 章 問題環境の構築
- 3.1 socat コマンドの利用
- 3.2 Docker の利用
- 3.2.1 コンテナ
- 3.2.2 コンテナの起動
- 3.2.3 コンテナイメージの作成
- 3.2.4 複数のコンテナの管理
4 章 Python 入門
- 4.1 インタープリターの利用
- 4.2 基本的な操作
- 4.2.1 算術演算
- 4.2.2 ビット演算
- 4.2.3 論理演算
- 4.2.4 比較演算
- 4.2.5 変数の定義
- 4.2.6 標準的なデータ型とその取り扱い
- 4.2.7 関数定義とラムダ式
- 4.2.8 標準入出力
- 4.2.9 条件分岐とループ
- 4.2.10 例外処理
- 4.2.11 ファイルの入出力
- 4.3 モジュールとパッケージ
Part 2 Web
5 章 Web セキュリティとCTF
- 5.1 Web
- 5.2 Web セキュリティ
- 5.3 CTF におけるWeb 問題
- 5.3.1 問題の形式とアプローチ
- 5.4 終わりに
6 章 Web の基礎知識
- 6.1 プロトコル
- 6.1.1 HTTP
- 6.1.2 リクエストとレスポンス
- 6.1.3 Cookie によるステート管理
- コラム:HTTP とHTTPS
- 6.1.4 URI
- コラム:URI とURL
- 6.2 コンテンツ
- 6.2.1 HTML
- 6.2.2 CSS
- 6.2.3 JavaScript
- 6.2.4 XML
- 6.3 Web クライアント
- 6.3.1 実験に用いるWeb アプリケーション
- 6.3.2 Web ブラウザ
- 6.3.3 curl
- 6.3.4 その他のWeb クライアントアプリケーション
- 6.3.5 Web クライアントプログラムの実装
- 6.4 Web サーバーとWeb アプリケーション
- 6.4.1 Web サーバー
- 6.4.2 Web アプリケーション
- 6.5 ローカルプロキシ
- 6.5.1 Burp Suite の概要
- 6.5.2 実践に向けた下準備
- 6.5.3 実践:Proxy とRepeater
- 6.5.4 実践:Intruder
- コラム:Decoder
- 6.6 データベース
- 6.6.1 データベースとは
- 6.6.2 Relational Database
- 6.6.3 SQL の構文の基礎
- 6.6.4 SQL によるデータベースの操作
- 6.6.5 最後に
- 6.7 Web ブラウザのセキュリティ機構
- 6.7.1 コンテンツの参照に起因する問題
- 6.7.2 CORS によるSOP の緩和
- 6.7.3 まとめ
7 章 ディレクトリトラバーサル
- 7.1 初めに
- 7.2 ディレクトリトラバーサルとは
- 7.3 脆弱なプログラム例
- 7.4 攻撃手法
- 7.4.1 フラグの取得:proc 擬似ファイルシステムの利用
- 7.5 ブラックボックスでの検出
- 7.6 終わりに
8 章 XSS:Cross-Site Scripting
- 8.1 初めに
- 8.2 XSS の概要
- 8.2.1 XSS の種別
- 8.3 Web 問題におけるXSS
- 8.3.1 問題の形式
- 8.3.2 格納箇所に応じたフラグの取得方法
- 8.4 攻撃手法
- 8.4.1 ケース1:単純なエコーバック
- 8.4.2 ケース2:入力値が属性値として出力される場合
- 8.4.3 ケース3:入力値がDOM 操作に利用される場合
- コラム:Web フロントエンドのフレームワークとDOM-based XSS
- 8.5 CSP:Content Security Policy
- 8.5.1 CSP の概要
- 8.5.2 CSP の仕様
- コラム:strict-dynamic
- 8.5.3 CSP のバイパス手法
- コラム:CSP Evaluator
- コラム:CSS インジェクション
- 8.6 終わりに
9 章 SQL インジェクション
- 9.1 初めに
- 9.2 SQL インジェクションとは
- 9.2.1 攻撃の流れの例
- 9.3 脆弱なプログラム例
- 9.4 SELECT 文における攻撃手法
- 9.4.1 Web サーバーの起動
- 9.4.2 UNION 句を用いた攻撃手法
- 9.4.3 Error ベースの攻撃手法
- 9.4.4 Boolean ベースの攻撃手法
- コラム:Boolean ベース SQL インジェクションの高速化
- 9.4.5 Time ベースの攻撃手法
- コラム:Time ベースの手法における注意点
- 9.5 INSERT/UPDATE 文における攻撃手法
- 9.5.1 Error ベースの攻撃例
- 9.5.2 Time ベースの攻撃例
- 9.5.3 アプリケーションロジックを考慮した攻撃例
- 9.5.4 UPDATE 文の場合について
- 9.6 ブラックボックスでの見つけ方
- 9.6.1 初めの一歩
- 9.6.2 SQL インジェクションの判断
- 9.6.3 UNION 句を挿入する際のカラム数の特定
- 9.6.4 テーブル情報の取得
- 9.7 終わりに
10 章 SSTI:Server Side Template Injection
- 10.1 初めに
- 10.2 SSTI とは
- 10.2.1 攻撃の流れの例
- 10.3 脆弱なプログラム例
- 10.4 Python のオブジェクト構造
- 10.4.1 インスタンスオブジェクトからのクラスオブジェクトの取得
- 10.4.2 MRO:Method Resolution Order
- 10.4.3 サブクラスの取得
- 10.4.4 任意のインスタンスオブジェクトからのクラスオブジェクトobject へのアクセス
- 10.4.5 __globals__ 属性と、組み込み関数等を提供するbuiltins モジュール
- 10.4.6 まとめ
- 10.4.7 余談
- 10.5 攻撃手法
- 10.5.1 サーバー内ファイルの読み込み
- 10.5.2 OS コマンドの実行
- 10.5.3 config 情報の表示
- 10.6 ブラックボックスでの見つけ方
- コラム:Jinja 以外でのテンプレートインジェクション
- 10.7 終わりに
11 章 SSRF:Server Side Request Forgery
- 11.1 初めに
- 11.2 SSRF とは
- 11.2.1 攻撃の流れの例
- 11.3 脆弱なプログラム例
- 11.4 攻撃手法
- 11.4.1 フラグ取得方法の検討
- 11.5 ブラックボックスでの見つけ方
- 11.6 終わりに
12 章 XXE:XML External Entity
- 12.1 初めに
- 12.2 XXE とは
- 12.3 脆弱なプログラム例
- 12.4 攻撃手法
- 12.4.1 ローカルファイルの取得
- 12.4.2 Blind XXE
- コラム:PHP とXXE
- 12.5 終わりに
Part 3 Crypto
13 章 暗号について
- 13.1 暗号とは
- 13.1.1 CTF における暗号
- 13.1.2 基本的な用語
- 13.2 暗号の種類
- 13.2.1 古典暗号
- 13.2.2 共通鍵暗号
- 13.2.3 公開鍵暗号・デジタル署名
- 13.2.4 暗号学的ハッシュ関数
- 13.3 暗号に対する攻撃の種類
- 13.3.1 暗号文単独攻撃
- 13.3.2 既知平文攻撃
- 13.3.3 選択暗号文攻撃
- 13.3.4 選択平文攻撃
- 13.3.5 関連鍵攻撃
- 13.4 参考書籍
- コラム:CTF と古典暗号
- 13.5 まとめ
14 章 環境構築
- 14.1 PyCrypto/PyCryptodome
- 14.1.1 AES を用いた暗号化
- 14.1.2 バイト列と数値の相互変換
- 14.2 SageMath
- 14.3 その他のツール
- 14.3.1 OpenSSL
- 14.3.2 PARI/GP
- 14.3.3 hashcat
15 章 ハッシュ関数
- 15.1 暗号学的ハッシュ関数
- 15.1.1 MD5、SHA-1、SHA-2
- 15.1.2 SHA-3
- 15.1.3 bcrypt
- 15.2 ハッシュ関数の応用
- 15.2.1 ソルト
- 15.2.2 ストレッチング
- 15.2.3 HMAC
- 15.3 ハッシュ衝突攻撃
- 15.3.1 Identical-prefix 衝突攻撃
- 15.3.2 Chosen-prefix 衝突攻撃
- 15.4 Length Extension Attack
- 15.4.1 ソルトを使ったMAC に対するLength Extension Attack
- 15.4.2 HashPump を用いた攻撃
- 15.5 まとめ
16 章 共通鍵暗号
- 16.1 共通鍵暗号の種類
- 16.1.1 DES
- 16.1.2 AES
- 16.1.3 RC4
- 16.1.4 ChaCha20
- コラム:トリプルDES(3DES)
- 16.2 パディング方式
- 16.2.1 PKCS#7 パディング
- 16.2.2 ゼロパディング
- 16.3 ブロック暗号利用モード
- 16.3.1 ECB モード
- 16.3.2 CBC モード
- 16.3.3 CTR モード
- 16.4 ビットフリップ攻撃
- 16.5 ECB モードに対する攻撃
- 16.6 パディングオラクル攻撃
- 16.6.1 パディングオラクルの原理
- 16.6.2 パディングオラクルを用いた復号
- 16.6.3 パディングオラクルを用いた暗号化
- 16.7 まとめ
17 章 初等整数論
- 17.1 素数
- 17.1.1 素因数分解の困難性
- コラム:素数判定法
- 17.1.2 ユークリッドの互除法による素因数分解
- 17.2 合同式
- 17.2.1 合同式上の方程式
- 17.2.2 逆元
- 17.3 オイラーの𝝓 関数
- 17.3.1 オイラーの定理
- 17.3.2 フェルマーの小定理
- 17.4 中国剰余定理
- 17.5 集合と群
- 17.5.1 集合
- 17.5.2 群
- 17.5.3 巡回群
- コラム:既約剰余類群の生成元
- 17.5.4 環
- 17.5.5 多項式環
- 17.5.6 離散対数問題
- 17.6 まとめ
- コラム:数学が分からなくても暗号問題は解ける
18 章 RSA 暗号
- 18.1 アルゴリズム
- 18.1.1 鍵生成
- 18.1.2 暗号化
- 18.1.3 復号
- 18.1.4 バイナリ法
- コラム:RSA 暗号の安全性
- 18.2 RSA 暗号の決定性
- 18.3 乗法準同型性
- コラム:完全準同型暗号
- 18.4 RSA 暗号に対する基本的な攻撃
- 18.4.1 e やm がN に対して小さい場合
- 18.4.2 同報通信
- 18.4.3 N が素因数分解可能な場合
- 18.4.4 2 つの平文の差が判明している場合
- 18.5 d が小さい場合の攻撃
- 18.6 Coppersmith 法を用いた攻撃
- 18.6.1 m の一部が判明している場合
- 18.6.2 2 つの平文の差が小さい場合
- 18.6.3 p の一部が判明している場合
- 18.7 まとめ
19 章 ElGamal 暗号
- 19.1 アルゴリズム
- 19.1.1 鍵生成
- 19.1.2 暗号化
- 19.1.3 復号
- 19.1.4 乗法準同型性
- 19.2 脆弱なElGamal 暗号
- 19.2.1 乱数の不備
- 19.2.2 危険な法の使用
- 19.3 ElGamal 署名
- 19.3.1 鍵生成
- 19.3.2 署名
- 19.3.3 署名検証
- 19.3.4 署名の偽造
- 19.4 DSA
- 19.4.1 鍵生成
- 19.4.2 署名
- 19.4.3 検証
- 19.4.4 脆弱なDSA
- コラム:PlayStation 3の署名不備
- 19.5 まとめ
20 章 その他の公開鍵暗号
- 20.1 Diffie–Hellman 鍵共有
- 20.1.1 アルゴリズム
- 20.1.2 中間者攻撃
- 20.1.3 Perfect Forward Secrecy
- 20.2 Paillier 暗号
- 20.2.1 アルゴリズム
- 20.2.2 加法準同型性
- 20.3 楕円曲線暗号
- 20.3.1 楕円曲線上の演算
- コラム:加法でx 軸に対称な点を使う理由
- 20.3.2 楕円曲線上の離散対数問題
- 20.3.3 楕円曲線Diffie-Hellman 鍵共有(ECDH)
- 20.3.4 定義済みの楕円曲線
- 20.4 まとめ
21 章 乱数
- 21.1 乱数生成アルゴリズム
- 21.1.1 線形合同法
- 21.1.2 xorshift
- 21.1.3 メルセンヌ・ツイスタ
- 21.1.4 ハードウェア乱数生成器
- コラム:ハードウェア乱数生成器の信頼性
- 21.2 暗号論的擬似乱数生成器
- 21.3 メルセンヌ・ツイスタの内部状態復元
- 21.4 まとめ
22 章 練習問題
- 22.1 ハッシュ関数
- 22.2 ブロック暗号
- 22.3 公開鍵暗号
- 22.4 解答例
Part 4 Reversing
23 章 Reversing を始める前に
- 23.1 Reversing とは
- 23.1.1 Reversing の目的
- 23.1.2 Reversing の流れ
- 23.2 環境構築
- 23.2.1 IDA
- 23.2.2 z3
- 23.2.3 angr
- 23.3 プログラムが動く仕組み
- 23.3.1 CPU とメモリ
- 23.3.2 レジスタ
- 23.4 アセンブリ言語
- 23.4.1 機械語とアセンブリ
- 23.4.2 objdump
24 章 アセンブリ言語
- 24.1 本章の目標
- 24.2 アセンブリ言語の記法
- 24.2.1 オペコードとオペランド
- 24.2.2 レジスタとメモリ
- 24.2.3 ラベル
- 24.2.4 コメントアウト
- 24.3 mov 命令(代入命令)
- 24.3.1 即値の代入
- 24.3.2 レジスタ間で値を転送
- 24.3.3 メモリから値を転送
- 24.3.4 メモリへ値を転送
- 24.3.5 拡張mov 命令
- コラム:プレフィックスは省略できる?
- 24.4 lea 命令(アドレス代入命令)
- 24.5 算術演算
- 24.5.1 加減算
- 24.5.2 インクリメント・デクリメント
- 24.5.3 乗算
- 24.5.4 除算
- コラム:imul とidiv
- 24.6 論理演算
- 24.6.1 論理積
- 24.6.2 論理和
- 24.6.3 排他的論理和
- 24.6.4 否定
- 24.7 シフト演算
- 24.7.1 論理シフト
- 24.7.2 算術シフト
- 24.8 比較
- 24.8.1 cmp 命令
- 24.8.2 test 命令
- 24.9 分岐
- 24.9.1 jmp 命令
- 24.9.2 jz 命令、je 命令
- 24.9.3 jnz 命令、jne 命令
- 24.9.4 ja 命令、jae 命令
- 24.9.5 jb 命令、jbe 命令
- 24.9.6 jg 命令、jge 命令
- 24.9.7 jl 命令、jle 命令
- 24.10 スタック操作
- 24.10.1 スタックとは
- 24.10.2 push とpop
- 24.11 関数呼び出し
- 24.11.1 call とret
- 24.11.2 leave 命令
- 24.12 システムコール
- 24.13 実践問題
25 章 アセンブリを読んでみよう
- 25.1 逐次実行
- 25.2 条件分岐
- 25.3 ループ
- 25.4 関数呼び出し
- コラム:7 個以上の引数を取る関数
- 25.5 変数の保存先
- 25.5.1 ローカル変数
- 25.5.2 グローバル変数
- 25.5.3 ヒープ上への動的な領域確保
- 25.6 配列の参照
- 25.7 実践問題
26 章 静的解析に触れてみよう
- 26.1 表層解析する
- 26.2 IDA で開いてみる
- 26.3 静的解析してみよう
- コラム:atoi の処理はどこに?
- 26.4 実践問題
27 章 動的解析を組み合わせよう
- 27.1 表層解析する
- 27.2 IDA で静的解析する
- 27.3 gdb で動的解析する
- 27.4 gdb スクリプトによる自動化
- コラム:gdb の仕組み
- 27.5 実践問題
28 章 より発展的な話題
- 28.1 プログラムにパッチを当てる
- 28.2 アンチデバッグ
- 28.2.1 ptrace の利用
- 28.2.2 procfs の利用
- 28.3 難読化
- 28.3.1 パッカー
- 28.3.2 jmp やcall を利用した難読化
- 28.4 PIE
- 28.5 Z3 で制約を解く
- 28.6 angr によるシンボリック実行
- 28.7 実践問題
29 章 実践問題の解答
- 29.1 24 章の実践問題
- 29.2 25 章の実践問題
- 29.3 26 章の実践問題
- コラム:メモリのアラインメント制約
- 29.4 27 章の実践問題
- 29.5 28 章の実践問題
Part 5 Pwnable
30 章 Pwnable への導入
- 30.1 Pwnable とは
- 30.1.1 Pwnable の流れ
- 30.2 Pwnable 問題の種類
- 30.2.1 Userland exploit
- 30.2.2 Kernel exploit
- 30.2.3 Hypervisor / Emulator exploit
- 30.3 利用するツール群
- 30.3.1 peda
- 30.3.2 gef(未導入)
- 30.3.3 pwndbg(未導入)
- 30.3.4 Pwngdb(angelheap)
- 30.3.5 nasm
- 30.3.6 pwntools
- 30.3.7 checksec
- 30.3.8 ROPgadget
- 30.3.9 rp++
- 30.3.10 Seccomp Tools
- 30.3.11 OneGadget
- 30.3.12 libc6-dbg
- 30.4 本パートについて
- 30.4.1 実行環境
- 30.4.2 理解を深めるために
31 章 シェルコード
- 31.1 シェルコードとは
- 31.1.1 シェルコードを書いてみる
- 31.1.2 特定文字を避ける
- コラム:シェルコードを動かしてデバッグしてみる
- 31.2 システムコール
- 31.2.1 システムコール発行の準備
- 31.2.2 システムコールを呼ぶ
- コラム:システムコールに与える引数を調べる
- 31.3 緩和機構
- 31.3.1 NX
- コラム:NX の原理
- 31.3.2 seccomp
- 31.4 緩和機構の回避
- 31.4.1 チェックの欠如によるseccomp の抜け道
- 31.5 実践問題
32 章 スタックベースエクスプロイト
- 32.1 関数とスタックフレーム
- 32.1.1 局所変数
- 32.1.2 関数の呼び出しと復帰
- コラム:呼び出された関数の道筋
- 32.2 攻撃手法
- 32.2.1 局所変数の改竄
- 32.2.2 リターンアドレスの改竄
- コラム:リターンアドレスまでのオフセットを調べる
- コラム:gdb 配下の標準入力に別プログラムの出力を与える
- 32.2.3 Return-Oriented Programming
- コラム:スタックのアラインメント
- コラム:第3 引数まで設定して関数を呼ぶ
- 32.2.4 Stack Pivot
- 32.3 緩和機構
- 32.3.1 Stack Smash Protection
- コラム:canary 値はどこからやってくる
- 32.3.2 ASLR とPIE
- 32.4 緩和機構の回避
- 32.4.1 canary の特定
- 32.4.2 バイナリのベースアドレスの特定
- 32.5 実践問題
33 章 共有ライブラリと関数呼び出し
- 33.1 ライブラリとリンク
- 33.2 関数の解決と利用
- 33.2.1 PLT とGOT
- 33.2.2 発展:関数シンボルの動的解決
- コラム:Controll Flow Protection 有効下でのPLT の流れ
- 33.3 攻撃手法
- 33.3.1 GOT Overwrite
- 33.3.2 Return to PLT(ret2plt)
- 33.3.3 Return to libc(ret2libc)
- コラム:One-Gadget RCE
- 33.4 緩和機構
- 33.4.1 RELRO と遅延バインド
- コラム:プログラムが実行に至るまでのバインドとRELRO
- 33.5 実践問題
34 章 ヒープベースエクスプロイト
- 34.1 動的メモリ割り当て
- 34.2 ヒープの利用と構造
- 34.2.1 メモリプールの確保
- 34.2.2 チャンクのデータ構造
- 34.3 資源の管理
- 34.3.1 パラメーター
- 34.3.2 アリーナ
- 34.3.3 fastbin
- 34.3.4 unsortedbin
- 34.3.5 smallbin
- 34.3.6 largebin
- 34.3.7 tcache
- 34.3.8 サイズ別チャンクの管理機構
- 34.4 リスト上のチャンク操作
- 34.4.1 tcache
- 34.4.2 fastbin
- 34.4.3 unsortedbin
- 34.4.4 smallbin
- 34.4.5 largebin
- コラム:Safe-Unlinking
- コラム:Safe-Linking
- 34.5 確保:malloc() の動き
- 34.5.1 fastbin から確保
- 34.5.2 smallbin から確保
- 34.5.3 unsortedbin から確保&繋ぎ替え
- 34.5.4 largebin から確保
- 34.5.5 上位サイズのbin から確保
- 34.5.6 top から確保
- 34.5.7 sysmalloc()
- 34.5.8 malloc_consolidate()
- 34.6 解放:free() の動き
- 34.6.1 consolidate backward
- 34.6.2 consolidate forward
- 34.6.3 unlink_chunk()
- 34.6.4 consolidate into top
- 34.6.5 systrim()
- コラム:チャンクのアラインメント
- 34.7 特定の状況下でのヒープの利用
- 34.7.1 巨大な領域
- 34.7.2 複数スレッド実行下
- 34.8 攻撃手法
- 34.8.1 ヒープ・libc のアドレスの取得
- 34.8.2 tcache エントリの重複
- 34.8.3 tcache の汚染
- 34.8.4 mp_.tcache_bins の改竄
- 34.8.5 fastbin チャンクの重複
- 34.8.6 fastbin の汚染
- 34.8.7 global_max_fast の改竄
- 34.8.8 smallbin の汚染
- 34.8.9 largebin の汚染
- 34.8.10 size の改竄
- 34.8.11 制御を奪う
- 34.9 実践問題
35 章 仕様に起因する脆弱性
- 35.1 書式文字列
- 35.1.1 書式文字列の利用
- 35.1.2 書式文字列攻撃
- 35.2 バッファオーバーフロー
- 35.2.1 ユーザからの入力
- 35.2.2 文字列処理
- 35.3 緩和機構
- 35.3.1 Automatic Fortification
- 35.4 実践問題
36 章 実践問題の解法
- 36.1 31 章:シェルコード
- 36.2 32 章:スタックベースエクスプロイト
- 36.3 33 章:共有ライブラリと関数呼び出し
- 36.4 34 章:ヒープベースエクスプロイト
- 36.5 35 章:仕様に起因する脆弱性
付録
- 付録A ASCII コード
- 付録B Linux システムコール(x86-64)
- 付録C 主要な定数値一覧