Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

PortableBinaryHacks

Portable Binary Hacks

Binary Hacks は GNU/Linux & x86 メインですが、 それ以外だとどんな感じだろうってことを書くところです。

私が個人的にいじってるものですが、 他の人にいじってもらっても問題ありません、 というか知らないことだらけなのでありがたいです。

1. イントロダクション

  • Binary Hack入門
  • Binary Hack用語の基礎知識
  • file でファイルの種類をチェックする
  • od でバイナリファイルをダンプする

2. オブジェクトファイルHack

  • C と C++ のプログラムをリンクするときの注意点
  • リンク時のシンボルの衝突に注意する
  • Linux の共有ライブラリを作るとき PIC でコンパイルするのはなぜか
  • statifier で動的リンクの実行ファイルを擬似的に静的リンクにする

3. GNUプログラミングHack

  • GCC の GNU 拡張入門
  • GCC で inline アセンブラを使う
  • GCCのビルトイン関数による最適化を活用する
  • glibcを使わないでHello Worldを書く
  • TLS(スレッドローカルストレージ)を使う
  • glibcでロードするライブラリをシステムに応じて切り替える
  • リンクされているライブラリによってプログラムの動作を変える
  • ライブラリの外に公開するシンボルを制限する
  • ライブラリの外に公開するシンボルにバージョンをつけて動作を制御する
  • main() の前に関数を呼ぶ
  • GCCが生成したコードによる実行時コード生成
  • スタックに置かれたコードの実行を許可/禁止する
  • ヒープ上に置いたコードを実行する
  • PIE (位置独立実行形式) を作成する
  • C++でsynchronized methodを書く
  • C++ でシングルトンを生成する
  • G++ の例外処理を理解する throw 編
  • G++ の例外処理を理解する SjLj?
  • G++ の例外処理を理解する Dwarf2 編
  • G++ 例外処理のコストを理解する

4. セキュアプログラミングHack

  • GCCセキュアプログラミング入門
  • -ftrapv で整数演算のオーバーフローを検出する
  • Mudflap でバッファオーバーフローを検出する
  • -D_FORTIFY_SOURCE でバッファオーバフローを検出する
  • -fstack-protector でスタックを保護する
  • bitmaskする定数は符号なしにする
  • 大きすぎるシフトに注意
  • 64ビット環境で 0 と NULL の違いに気をつける
  • POSIXのスレッドセーフな関数
  • シグナルハンドラを安全に書く方法
  • sigwaitで非同期シグナルを同期的に処理する
  • sigsafeでシグナル処理を安全にする
  • Valgrind でメモリリークを検出する
  • Valgrind でメモリの不正アクセスを検出する
  • Helgrind でマルチスレッドプログラムのバグを検出する
  • fakeroot で擬似的な root 権限でプロセスを実行する

5. ランタイム Hack

  • 実行中のプロセスのパス名をチェックする
  • ロードしている共有ライブラリをチェックする
  • プロセスや動的ライブラリがマップされているメモリを把握する
  • libbfd でシンボルの一覧を取得する
  • C++ のシンボルを実行時にデマングルする
  • ffcall でシグネチャを動的に決めて関数を呼ぶ
  • libdwarf でデバッグ情報を取得する
  • dumper で構造体のデータを見やすくダンプする
  • オブジェクトファイルを自力でロードする
  • libunwind でコールチェインを制御する
  • GNU lightning でポータブルに実行時コード生成する
  • スタック領域のアドレスを取得する
  • sigaltstack でスタックオーバーフローに対処する
  • 関数へのenter/exitをフックする
  • シグナルハンドラからプログラムの文脈を書き換える
  • プログラムカウンタの値を取得する
  • 自己書き換えでプログラムの動作を変える
  • SIGSEGVを使ってアドレスの有効性を確認する
  • strace でシステムコールをトレースする
  • ltrace で共有ライブラリの関数呼び出しをトレースする
  • Jockey で Linux のプログラムの実行を記録・再生する
  • prelink でプログラムの起動を高速化する
  • livepatch で実行中のプロセスにパッチをあてる

6. プロファイラ・デバッガHack

  • gprof でプロファイルを調べる
  • sysprof でお手軽にシステムプロファイルを調べる
  • oprofile で詳細なシステムプロファイルを得る
  • GDB で実行中のプロセスを操る
  • ハードウェアのデバッグ機能を使う
  • Cのプログラムの中でブレークポイントを設定する

7. その他のHack

  • Boehm GC の仕組み
  • プロセッサのメモリオーダリングに注意
  • Portable Coroutine Library で軽量な並行処理を行う
  • CPU のクロック数をカウントする
  • 浮動小数点数のビット列表現
  • x86が持つ浮動小数点演算命令の特殊性
  • 結果が無限大やNaNになる演算でシグナルを発生させる
  • 文献案内

その他

  • 各種オブジェクトフォーマット

SandBox

Last modified:2016/09/09 01:54:20
Keyword(s):
References:[FrontPage]