本文へスキップ
AZ Tools

ELF バイナリ検査ツール

ELF バイナリを readelf と同じようにバイト列から、ブラウザー内だけで読み取ります。ヘッダーからワードサイズとバイト順、OS/ABI、アーキテクチャ、エントリーポイント、そしてファイルが再配置可能オブジェクトか、通常の実行ファイルか、位置独立実行ファイルか、共有ライブラリかが分かります。PIE と .so はどちらも DYN なのでヘッダーだけでは区別できず、インタープリターの有無か DF_1_PIE フラグが決め手になります。プログラムヘッダーはローダーがマップする対象を、動的配列はインタープリターのパス、DT_NEEDED のすべてのライブラリ、ライブラリが名乗る SONAME、ファイルに埋め込まれた RPATH や RUNPATH を示します。最後のものは自分でビルドしていないファイルなら確認する価値があります。ローダーがライブラリを探す場所を変えるからです。ハードニングの行は checksec が答える問いに同じ根拠で答えます。PIE は種別と DF_1_PIE から、NX は PT_GNU_STACK が書き込み・実行可能かどうかから、RELRO は PT_GNU_RELRO の有無と BIND_NOW の設定によって、なし・部分・完全のいずれかになります。シンボル削除とは SHT_SYMTAB がないという意味です。動的シンボルテーブルは残るので、削除済みのライブラリでも公開する名前は見えます。しない事も二つあります。逆アセンブルはせず、スタック保護や FORTIFY_SOURCE の有無も示しません。どちらもヘッダーのフラグではなくシンボル名を調べて初めて分かるためです。32 ビットやビッグエンディアンも正しく読むので、ルーターや組み込みイメージから取り出した ARM・MIPS・PowerPC のバイナリも x86-64 と同じように開けます。

使い方

  1. バイナリを枠にドロップします。拡張子のない実行ファイル、.so、.o、コアファイルのいずれも扱えます。
  2. ヘッダーの行でアーキテクチャと種別を確認します。PIE 実行ファイルと共有オブジェクトはどちらも DYN で、下のインタープリター行が区別してくれます。
  3. ハードニングのチップを確認します。ディストリビューションのビルドなら通常は PIE・NX・完全 RELRO で、橙色のチップは配布前に説明が要る項目です。
  4. 必要なライブラリでローダーが探す共有ライブラリを、RUNPATH でバイナリが加えた非標準の探索先を確認します。
  5. サイズが要るときはセクション一覧を開きます。コードは .text、定数は .rodata、デバッグ情報を残していれば .debug_* が見えます。

よくある質問

PIE 実行ファイルと共有ライブラリの違いは何ですか。どちらも DYN と出ます。
ELF の種別は実際に同じで、ローダーが任意のアドレスにマップできる位置独立コードです。違いは、実行ファイルには動的ローダーを指す PT_INTERP プログラムヘッダー(通常は /lib64/ld-linux-x86-64.so.2)があってカーネルが起動方法を知っているのに対し、ライブラリにはそれがなく他のプログラムから読み込まれるだけ、という点です。近年のツールチェーンは実行ファイルの動的フラグに DF_1_PIE も設定します。readelf が報告する値であり、この道具が最初に見る値でもあります。古いリンカーがフラグを付けていない場合はインタープリターの有無で判断します。
PIE、NX、RELRO は実際に何を防ぐのですか。
PIE はカーネルがバイナリを無作為なベースアドレスに読み込めるようにし、ライブラリだけでなくプログラム自身のコードにも ASLR を効かせます。なければガジェットのアドレスは固定で既知です。NX はスタックを実行不可にし、注入したシェルコードへ単純に飛べないようにします。RELRO は起動後に再配置テーブルを読み取り専用にします。部分は main より前に解決される分だけを守り、完全はすべての関数を先に解決して GOT も読み取り専用にし、古典的な GOT 書き換えを塞ぎます。三つともリンク時の性質なので、実行せずにファイルから読み取れます。
シンボルが削除済みと出ますが、関数名はまだ見えます。
シンボルテーブルが二つあるからです。ここでいう削除済みとは、デバッガーが使う SHT_SYMTAB がないという意味で、strip が消すのはこちらです。動的シンボルテーブル SHT_DYNSYM は、シンボルを公開または参照するファイルには残っていなければなりません。なければ動的リンクができないからです。そのため削除済みのライブラリでも公開する名前はすべて並び、削除済みの実行ファイルでも参照する名前は見えます。nm がシンボルなしと言うのに nm -D は一覧を出すのはこのためです。
他のアーキテクチャやビッグエンディアンのバイナリも読めますか。
読めます。ヘッダー冒頭のクラスバイトとデータバイトが 32 ビットか 64 ビットか、どのバイト順かを示し、以降のフィールドはすべてその二つを通して読むので、AArch64、ARM、MIPS、RISC-V、ビッグエンディアンの PowerPC も x86-64 と同じ精度で読めます。アーキテクチャはよくある機種は名前で、それ以外は生のコードで表示します。できないのは、そのバイナリがあなたの機械で動くかどうかの判断です。ヘッダーだけでなくカーネルや ABI、ライブラリ次第だからです。
ビルド ID は何に使いますか。
リンカーがノートセクションに入れるハッシュで、そのビルドを特定します。ディストリビューションはこれでバイナリと別配布のデバッグシンボルを対応付けます。デバッグファイルは /usr/lib/debug/.build-id/xx/yyyy.debug に置かれ、コアダンプを渡されたデバッガーはバイナリが削除済みでも正しいシンボルを見つけられます。コンパイル結果が少しでも変われば ID も変わるので、二つのファイルが本当に同じビルドかを確かめるのにも使えます。
バイナリはどこかにアップロードされますか。
されません。ブラウザーの File API で読み、ページ内の JavaScript が解析します。サーバーに送りませんし、送る先の仕組みもありません。この道具では特に重要です。調べたいバイナリがアップロードしてよいものとは限らないからです。ページを開いたあとネットワークを切っても動作します。

関連ツール

Mach-O バイナリ検査ツール

macOS・iOS のバイナリをブラウザで解析。ユニバーサルの各アーキテクチャ、セグメントとセクション、依存 dylib、rpath、UUID、コード署名を表示します。

ファイル 0 0

PE インスペクター: Windows EXE・DLL ビューア

Windows の .exe、.dll、.sys、.efi をブラウザで開きます。アーキテクチャ、サブシステム、インポート、エクスポート、セクション、ASLR・DEP・CFG の有無まで。

ファイル 0 0

Java クラスファイル解析ツール

コンパイル済みの .class ファイルをブラウザーで解析します。クラスファイルバージョンと Java リリース、アクセスフラグ、定数プール、フィールド、メソッド、参照クラスを表示します。

ファイル 0 0

WebAssembly モジュールインスペクタ

ブラウザ内で .wasm を解析し、セクションのサイズ、型付きのインポートとエクスポート、メモリのページ数、start 関数、name と producers セクションを表示します。

開発 0 0

Mbox アーカイブビューア

mbox アーカイブをブラウザーで分割。メッセージ境界、デコード済みヘッダー、MIME 構造、スレッド、重複 Message-ID を表示し、アップロードはしません。

ファイル 0 0

SQLite データベース検査ツール

.sqlite や .db をブラウザーで開いて構造を読み取ります。ページサイズ、エンコーディング、ジャーナルモード、各テーブルの実際の行数まで。

ファイル 0 0