Linux objdump コマンド
objdump は GNU Binutils ツールセットの重要なコマンドラインツールであり、オブジェクトファイルと実行可能ファイルのさまざまな情報を表示するために使用されます。これは Linux システムでバイナリ解析、リバースエンジニアリング、デバッグを行うための強力なツールです。
objdump の主な機能は次のとおりです:
- バイナリファイルの逆アセンブル
- ファイルヘッダー情報の表示
- セクション内容の表示
- シンボルテーブルの表示
- 再配置情報の表示
- ファイル構造の分析
基本構文
objdump の基本コマンド形式は次のとおりです:
objdump [选项] 文件名
オプションを指定しない場合、objdump はファイルのセクションヘッダー情報を表示します。
よく使うオプションの詳細
逆アセンブル関連オプション
例
-d, --disassemble # コードを含むセクションを逆アセンブル
-D, --disassemble-all # すべてのセクションを逆アセンブル
-S, --source # ソースコードとアセンブリコードを混在表示(コンパイル時に-gオプションが必要)
--prefix-addresses # 逆アセンブル時に完全なアドレスを表示
--no-addresses # アドレス情報を表示しない
-D, --disassemble-all # すべてのセクションを逆アセンブル
-S, --source # ソースコードとアセンブリコードを混在表示(コンパイル時に-gオプションが必要)
--prefix-addresses # 逆アセンブル時に完全なアドレスを表示
--no-addresses # アドレス情報を表示しない
セクション情報オプション
例
-h, --section-headers # セクションヘッダー情報を表示
-j, --section=名前# 指定したセクションの内容のみを表示
-j, --section=名前# 指定したセクションの内容のみを表示
シンボルテーブルオプション
例
-t, --syms # シンボルテーブルを表示
-T, --dynamic-syms # 動的シンボルテーブルを表示
-T, --dynamic-syms # 動的シンボルテーブルを表示
ファイルヘッダー情報
-f, --file-headers # 显示文件头部信息
その他の便利なオプション
例
-l, --line-numbers # 行番号情報を表示(デバッグ情報が必要)
-r, --reloc # 再配置エントリを表示
-R, --dynamic-reloc # 動的再配置エントリを表示
-s, --full-contents # すべてのセクションの完全な内容を表示
-r, --reloc # 再配置エントリを表示
-R, --dynamic-reloc # 動的再配置エントリを表示
-s, --full-contents # すべてのセクションの完全な内容を表示
実用的な例
例1:実行可能ファイルの構造を表示
objdump -h /bin/ls
出力例:
/bin/ls: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
...
例2:実行可能ファイルを逆アセンブル
objdump -d /bin/ls
出力例(一部):
0000000000405a50 : 405a50: 31 ed xor %ebp,%ebp 405a52: 49 89 d1 mov %rdx,%r9 405a55: 5e pop %rsi 405a56: 48 89 e2 mov %rsp,%rdx 405a59: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp ...
例3:シンボルテーブルを表示
objdump -t myprogram.o
出力例:
myprogram.o: file format elf64-x86-64 SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 myprogram.c 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 g F .text 0000000000000015 main 0000000000000000 *UND* 0000000000000000 printf
例4:ソースコードとアセンブリコードを混在表示
objdump -S myprogram
出力例:
例
int main() {
400526: 55 push %rbp
400527: 48 89 e5 mov %rsp,%rbp
printf("Hello, World!n");
40052a: bf d4 05 40 00 mov $0x4005d4,%edi
40052f: e8 cc fe ff ff callq 400400
return 0;
400534: b8 00 00 00 00 mov $0x0,%eax
}
400526: 55 push %rbp
400527: 48 89 e5 mov %rsp,%rbp
printf("Hello, World!n");
40052a: bf d4 05 40 00 mov $0x4005d4,%edi
40052f: e8 cc fe ff ff callq 400400
return 0;
400534: b8 00 00 00 00 mov $0x0,%eax
}
実際の応用シーン
シーン1:プログラムのクラッシュをデバッグ
プログラムがクラッシュした場合、objdump を使用してクラッシュアドレス付近のコードを確認できます:
objdump -d --start-address=0x400526 --stop-address=0x400536 myprogram
シーン2:ライブラリ関数呼び出しの分析
プログラムがどの動的ライブラリ関数を呼び出しているかを確認:
objdump -T myprogram | grep UND
シーン3:アセンブリ言語を学ぶ
単純なCプログラムを逆アセンブルしてアセンブリ言語を学習する:
例
gcc -o simple simple.c
objdump -d simple
objdump -d simple
注意事項
- デバッグ情報:ソースコードレベルの情報を取得するには、コンパイル時に追加する必要があります
-gオプション - 最適化の影響:コンパイラの最適化は生成されるアセンブリコードに影響を与えるため、分析時には注意が必要です
- アーキテクチャの差異:CPUアーキテクチャごとにアセンブリ命令が異なるため、正しい逆アセンブルオプションを使用してください
- 権限の問題:システムファイルの分析にはroot権限が必要な場合があります
- ファイル形式:objdump は主にELF形式のファイルを対象としています。他の形式は特別な処理が必要な場合があります
上級テクニック
他のツールと組み合わせて使用
例
# grepを使用して特定の関数をフィルタリング
objdump -d myprogram | grep -A20 "main>:"
# 関数のサイズを統計
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'
objdump -d myprogram | grep -A20 "main>:"
# 関数のサイズを統計
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'
逆アセンブルスクリプトの作成
例
#!/bin/bash
# 逆アセンブルスクリプトの例
if [ $# -ne 1 ]; then
echo "Usage: $0 "
exit 1
fi
echo === ファイルヘッダー情報 ===
objdump -f $1
echo -e n=== セクション情報 ===
objdump -h $1
echo -e n=== 逆アセンブルコード ===
objdump -d $1
# 逆アセンブルスクリプトの例
if [ $# -ne 1 ]; then
echo "Usage: $0 "
exit 1
fi
echo === ファイルヘッダー情報 ===
objdump -f $1
echo -e n=== セクション情報 ===
objdump -h $1
echo -e n=== 逆アセンブルコード ===
objdump -d $1
まとめ
objdump は Linux システム上で強力なバイナリ解析ツールであり、これをマスターすることで次のことができます:
- プログラムの実行メカニズムを深く理解する
- プログラムの問題を迅速に特定する
- アセンブリ言語とシステム知識を学ぶ
- 基本的なリバースエンジニアリング分析を行う
本記事で紹介した基本的な使い方と実用的な例を通じて、objdump を使用した基本的なバイナリファイル解析を始めることができるはずです。実践的な経験を積むにつれて、システムプログラミングやデバッグにおけるさらなる活用方法が見つかるでしょう。
その他の拡張