Elfフォーマットのシンボル情報を取得したい


gnuのツールでは、objdump や readelf, nm といったツールで実行体の情報を出力することができます。これはElfバイナリにセクションやシンボルの情報がどのように格納されているかがセクションヘッダとして格納されているために表示できます。
そのため、stripコマンドでセクションヘッダを削除してしまうと、これらの情報が表示されなくなってしまいます。
またセクションヘッダはElfバイナリの末尾についているため、そもそも削除されることを想定しています。このセクションヘッダはツールによる解釈のために存在するようで、実行時には不要な物です。そのためローダーはこの部分をロードしません。(正確にはストリングテーブルからロードしないようだ…)

しかしここではこのセクションヘッダが存在するとして、話を進めたいと思います。
セクションヘッダは Elf32_Shdr の配列として存在しています。これを読み込んでいくと、sh_typeメンバの値が SHT_DYNSYM というものが見つかります。そしてこのセクションの内容(sh_addrで示される場所において)が、Elf32_Symの配列となっています。
このとき、セクションヘッダに示されている sh_linkのセクションヘッダを参照して文字列が格納されているテーブルも取得しておきます。名前はこのテーブル先頭からのオフセットで格納されているためです。

  1. セクションヘッダを読み込む
  2. 読み込んだセクションヘッダのリストから、SHT_DYNSYM, SHT_SYMTAB のものを抽出
  3. SHT_SYMTABのsh_addrによりストリングテーブルを取得
  4. SHT_DYNSYMの中身は Elf32_Symの配列.
  5. ストリングテーブルのアドレス+Elf32_Sym.sh_name で文字列を得る

このような手順で、含まれているシンボル情報を見ることができます。

冒頭で述べた、セクションヘッダを削除すると情報がみれない話ですが、バイナリエディタで見るとストリングテーブルは残っていたりします。実行にはこのテーブルもロードされないので削除してしまっても正常に動きます。実行体elfになるべく情報を残さないというポリシーならばこのストリングテーブルの削除も忘れずにやっておきたいところです。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする