ハッカーの基礎知識 Linuxの実行ファイル「ELF」の中身を見てみよう

コンピューターがプログラムを読み込んで実行するために、どこに何が書かれているかを教えるためのルールブックです。
※イメージです。
目次
ELF形式とは
ELF(エルフ)とは、LinuxなどのUnix系OSで使われている実行ファイルやライブラリのファイル形式のことです。
正式名称は、Executable and Linkable Format(実行可能かつリンク可能な形式)と言います。
どんなときに使われているの
たとえば、Linux上で以下のようなコマンドを実行すると。
$ ./hello
この"hello"という実行ファイルの中身は、たいてい「ELF形式」になっています。
また、共有ライブラリ(.soファイル)も同じELF形式です。
ELF形式の構造について
ELFはいくつかのセクション(部品)に分かれている構造をしています。
主な構成は以下のとおり。
・ELFヘッダ
ファイルの種類・アーキテクチャ(32bit/64bit)などの情報
・プログラムヘッダ
OSがプログラムを実行するために必要なロード情報
・セクションヘッダ
各セクション(コード・データ・シンボルなど)の一覧
・テキストセクション (.text)
実行されるコード本体
・データセクション (.data)
初期化された変数データ
・BSSセクション (.bss)
初期化されていない変数領域(ゼロクリアされる)
・シンボルテーブル (.symtab)
関数名や変数名などの情報
・文字列テーブル (.strtab)
関数名・変数名などの文字列
ハッカーの基礎知識として、なぜELFが必要なのか
ELFの構造を理解すると、以下のような状況で強くなれます。
・リバースエンジニアリングでバイナリの中身を解析するとき。
・GDBでデバッグするときのアドレスやセクションの意味が理解できる。
・エクスプロイト開発で、どこにコードを書き込むかを正確に判断できる。
・スタックオーバーフローやASLR回避などで、ELFの位置やサイズを理解できる。
ELFの確認方法について
LinuxにはELFを解析するコマンドがたくさんあります。
・file ./a.out
ELF形式かどうか確認。
・readelf -h ./a.out
ELFヘッダの中身を見る。
・objdump -d ./a.out
アセンブリコードを見る。
・nm ./a.out
シンボル(関数・変数)一覧を見る。
・strings ./a.out
埋め込まれた文字列を抽出。
※「a.out」は"assembler output"(アセンブラの出力)の略です。
ハッカーの基礎知識 Linuxの実行ファイル「ELF」の中身を見てみようのまとめ
ELF形式は、Linuxなどで使われる実行ファイルや共有ライブラリのファイル形式です。
実行可能なコードや変数、関数名などをセクションごとに整理した構造を持ちます。ELFを理解すると、GDBによるデバッグ、リバースエンジニアリング、エクスプロイト開発などで、バイナリの中身を深く解析できるようになります。
readelf や objdump などのツールを使えば、中身をのぞくこともでき、実践的な学習に役立つと考えます。