Binary Hacks Rebooted

―低レイヤの世界を探検するテクニック89選

[cover photo]
TOPICS
Programming
発行年月日
PRINT LENGTH
660
ISBN
978-4-8144-0085-0
FORMAT
Print PDF EPUB
Ebook
4,400円
Ebookを購入する
Print
4,400円

本書は低レイヤのプログラミングに関するHack集であり、2006年に発行された『Binary Hacks』の再構築版として書かれました。低レイヤとは抽象化の度合いが低く計算機と近いレイヤのことを指し、またHackとは巧妙な方法で問題を解決する手法を指します。現代のコンピュータシステムは重層的です。抽象化のレイヤを重ねることで発展し、無数の機能が実現されています。これらのレイヤは巧みに設計されているため、機能を利用するだけなら各レイヤの動作を詳細に知る必要はありません。それでも私たちは時折、抽象化レイヤを剥がしてシステムの中身を見る必要に駆られます。これは抽象化そのもののメカニズムや、抽象化によって隠蔽されてしまった機能を利用したいことがあるからです。また、何より抽象化レイヤそのものや、その下側を覗いてみるのはとても楽しいことです。今まで開発者たちが積み上げてきた1つ1つの部品やその組み合わせの中には、常に新しい発見があります。この本はそんな低レイヤの世界を探検するためのさまざまな入口―Hackを89(ハック)個提供します。(「はじめに」より)

正誤表

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

第1刷正誤表

2024年9月更新

■p.22 本文9行目
【誤】Position Indepent Code
【正】Position Independent Code

■p.303 「Python連携」の直前の本文
【誤】undispコマンド
【正】undisplayコマンド

目次

本書に寄せて
クレジット
はじめに

1章 イントロダクション
    #1 未知のバイナリの読み方
    #2 アセンブリ入門
    #3 Hello, World!再訪

2章 ELF Hack
    #4 ELFファイルのセグメント
    #5 ld-linux.soの環境変数を利用する
    #6 共有ライブラリを検索するディレクトリ
    #7 dlopenによるライブラリの実行時ロードとその応用テクニック
    #8 IFUNCを使って実行時に実装を切り替える
    #9 ELFのハッシュテーブルのしくみ
    #10 TLSのしくみを理解する
    #11 コアファイルを読む
    #12 補助ベクトルを使ってプロセスに情報を渡す
    #13 静的リンクとASLRの関係
    #14 soldを使って依存する共有ライブラリを後からリンクする
    #15 glibcをHackする
    #16 patchelfでELFバイナリのフィールドを書き換える
    #17 LIEFを使ってELFバイナリを書き換える
    #18 PT_NOTEを利用したバイナリパッチ
    #19 DWARF Expressionを実行する:DWARFⅠ
    #20 DWARFで数式を評価する:DWARFⅡ
    #21 DWARFで標準出力に出力する:DWARFⅢ

3章 OS Hack
    #22 実行可能ファイルとその起動方法
    #23 LinuxでHuge Pageを使う
    #24 CRIUを使ってプロセスを保存、再開する
    #25 procfs / sysfsの基本を把握する
    #26 用途に合わせたファイルシステムを選ぶ
    #27 特定のプロセスに見せるファイルを差し替える
    #28 FUSEを使ってファイルシステムを自作する
    #29 特殊なメモリ領域vsyscallとvDSO
    #30 KVMを使ってハイパーバイザを作成する
    #31 LinuxカーネルHack入門
    #32 Unikernel:アプリケーションをOSとして動かす
    #33 UEFIとSecure Boot
    #34 GNUツールチェインで機械語ファイルを出力する
    #35 QEMU上で動くファームウェアを作る
    #36 Chromebook上で自作のファームウェアを動かす

4章 コンテナHack
    #37 Linuxネームスペースでプロセスを分離する
    #38 cgroupでプロセスのリソースを管理する
    #39 chroot/pivot_rootでルートディレクトリを切り替える
    #40 一般ユーザーがrootのように振る舞う方法3選
    #41 rootlessコンテナの使い方とそのしくみ
    #42 ユーザーネームスペース内で各種のネームスペースを作成する
    #43 /proc/PID/rootからコンテナ内のファイルに直接アクセスする

5章 デバッガ・トレーサHack
    #44 gdb Tips
    #45 rrを使ってRecord and Replayデバッグを行う
    #46 サニタイザで低レイヤのバグを見つける:サニタイザⅠ
    #47 Address Sanitizerのしくみ:サニタイザⅡ
    #48 Linuxパフォーマンス解析ことはじめ
    #49 ftraceを使ってカーネル内で起こっていることをトレースする
    #50 eBPFを使ったトレーシング入門
    #51 DBIで実行命令をトレース・改変する
    #52 Intel PTで高速にトレースを取得する

6章 セキュリティHack
    #53 seccompでプロセスの使えるシステムコールを制限する
    #54 Landlockで非特権プロセスサンドボックスを作る
    #55 ASLR:不正なメモリアクセスに対するセキュリティ機構
    #56 ROP:メモリ破壊を悪用するスタンダードな攻撃手法
    #57 Intel CET:ROPに対するセキュリティ機構
    #58 Clang CFIによって不正な制御フローを検知する
    #59 スタックフレームの変化を観察する
    #60 ファジングの概要と分類
    #61 グレイボックスファジングでバグや脆弱性を探す
    #62 LibAFLでファザーを実装する
    #63 LibAFLで実装したファザーを改良する
    #64 angrでシンボリック実行する
    #65 BadUSB:使用者を騙すUSBデバイス
    #66 Row Hammer:DRAMの脆弱性に対する攻撃手法
    #67 MeltdownとSpectre:CPUの脆弱性に対する攻撃手法

7章 数値表現とデータ処理Hack
    #68 整数表現の基礎知識
    #69 さまざまな整数表現
    #70 浮動小数点数のビット列表現を理解する
    #71 浮動小数点例外
    #72 浮動小数点数の丸め方を変える
    #73 浮動小数点環境を触るコードに対するコンパイラの最適化と戦う
    #74 NaNを深掘りする
    #75 浮動小数点数のアーキテクチャごとの差異に触れる
    #76 SIMD命令セットの基礎知識
    #77 SIMD並列化したコードを書く
    #78 SIMD命令を使ったさまざまなテクニック

8章 言語処理系Hack
    #79 NaNを活用して64ビット値にタグ付きの値を格納する
    #80 ucontext.hでコルーチンを実装する
    #81 Profile Guided Optimization
    #82 LD_PRELOADを使ってメモリアロケータを入れ替える
    #83 ABIと呼び出し規約を理解する
    #84 libffiで実行時までシグネチャがわからない関数を呼び出す
    #85 実行時に機械語を生成する
    #86 GCC/Clangの組み込み関数を利用する

9章 そのほかのHack
    #87 用語集
    #88 Binary Hacksに必要なツール
    #89 文献案内

索引