Binary Hacks Hack#5 ELF入門 memo

・オブジェクトファイルや実行ファイルはELF(Executable and Linking Format) というフォーマットで規定される。

・ELFフォーマットのファイルは、ELFヘッダテーブルが先頭にあり、プログラムヘッダテーブル・セクションヘッダテーブルがその後にある。

ELFフォーマットのプログラムの構造は下を参照。とてもわかりやすい。

ELF Format

まず、プログラムは複数の「セグメント」から成り、セグメントは複数の「セクション」から成る。

readelf -l 

するとプログラムヘッダを表示できる。各セグメントのタイプやアドレスなどの情報と、それぞれのセグメントがどのセクションを持っているかが表示される。

readelf -S

で各セクションのタイプ、アドレス、etc……の情報を表示できる。

ストリングテーブル

セクションのタイプの一つ。名前が格納されているテーブル。試しに

 $ od --skip-bytes 0x0001a5fc --read-bytes 0xfe -t x1z /bin/ls

すると、

0322774 00 2e 73 68 73 74 72 74 61 62 00 2e 69 6e 74 65  >..shstrtab..inte<
0323014 72 70 00 2e 6e 6f 74 65 2e 41 42 49 2d 74 61 67  >rp..note.ABI-tag<
0323034 00 2e 6e 6f 74 65 2e 67 6e 75 2e 62 75 69 6c 64  >..note.gnu.build<
0323054 2d 69 64 00 2e 67 6e 75 2e 68 61 73 68 00 2e 64  >-id..gnu.hash..d<
0323074 79 6e 73 79 6d 00 2e 64 79 6e 73 74 72 00 2e 67  >ynsym..dynstr..g<
0323114 6e 75 2e 76 65 72 73 69 6f 6e 00 2e 67 6e 75 2e  >nu.version..gnu.<
0323134 76 65 72 73 69 6f 6e 5f 72 00 2e 72 65 6c 61 2e  >version_r..rela.<
0323154 64 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 00 2e 69  >dyn..rela.plt..i<
0323174 6e 69 74 00 2e 74 65 78 74 00 2e 66 69 6e 69 00  >nit..text..fini.<
0323214 2e 72 6f 64 61 74 61 00 2e 65 68 5f 66 72 61 6d  >.rodata..eh_fram<
0323234 65 5f 68 64 72 00 2e 65 68 5f 66 72 61 6d 65 00  >e_hdr..eh_frame.<
0323254 2e 69 6e 69 74 5f 61 72 72 61 79 00 2e 66 69 6e  >.init_array..fin<
0323274 69 5f 61 72 72 61 79 00 2e 6a 63 72 00 2e 64 79  >i_array..jcr..dy<
0323314 6e 61 6d 69 63 00 2e 67 6f 74 00 2e 67 6f 74 2e  >namic..got..got.<
0323334 70 6c 74 00 2e 64 61 74 61 00 2e 62 73 73 00 2e  >plt..data..bss..<
0323354 67 6e 75 5f 64 65 62 75 67 6c 69 6e 6b 00        >gnu_debuglink.<
0323372

と表示される。

改行のせいで非常にごちゃついているけれど、gnu.version とか gnu.version_rとか、そういう名前がこのテーブルに全て格納されていて、たぶん名前を使う際はこのテーブルへのアドレスで参照するのだと思われる。

ここまで(4/24)

調べたいこと

・ストリングテーブルの作られ方。プログラムに使用した変数名とかもここに格納されているという認識でいいんだろうか。そうなるとストリングテーブルの大きさは可変長なんだろうか。それとも十分な大きさのメモリを確保していて、うん千万という変数を作らない限り平気ということなんだろうか?

・e_shstrndxで指定されるセクションに名前が格納されている(e_shstrndxはELFヘッダのメンバ)。ところで、

readelf -S /bin/ls

すると、ストリングテーブルであることを指すタイプ=STRTABであるセクションが、e_shstrndxで指定された".shstrtab”の他にもう一つあるのが分かる。”.dynstr”というセクションだ。これは何のためのストリングテーブルなのか?

気になった記事

qiita.com