【ELF形式】.dynsym セクション
セクションヘッダおよびセクションの内容をダンプしてみます。
# # .dynsym # # セクションヘッダ $ od -x -A x -j0x1214 -N0x28 sample 001214 004e 0000 000b 0000 0002 0000 81cc 0804 001224 01cc 0000 0040 0000 0006 0000 0001 0000 001234 0004 0000 0010 0000 00123c
セクションヘッダの内容は、以下の通り。
Elf32_Shdr | バイナリ | 項目 | バイナリの意味 |
---|---|---|---|
.sh_name | 0x0000004e | セクション名 | ".dynsym" |
.sh_type | 0x0000000b | セクションのタイプ | 動的リンクシンボルテーブル(SHT_DYNSYM) |
.sh_flags | 0x00000002 | 各種フラグ | ロード時にメモリ上に領域確保するセクション(SHF_ALLOC) |
.sh_addr | 0x080481cc | ロード先アドレス | 0x080481cc |
.sh_offset | 0x000001cc | ELF形式中でのセクションの位置 | 0x1cc |
.sh_size | 0x00000040 | セクションのバイトサイズ | 64バイト |
.sh_link | 0x00000006 | 関連付けられているシンボルテーブルのセクションヘッダインデックス | 第6セクション(.dynsym)に関連付け |
.sh_info | 0x00000001 | 最後の局所シンボルのシンボルテーブルインデックスより1大きい | - |
.sh_addralign | 0x00000004 | セクションがメモリにロードされる際のバイトアラインメント | 4バイト |
.sh_entsize | 0x00000010 | 構造体配列になっているセクションで利用される。配列要素のサイズ | 16バイト |
セクション本体はオフセット「0x1cc」サイズ「0x40」なので、その領域をダンプしてみます。
# セクション $ od -x -A x -j0x1cc -N0x40 sample 0001cc 0000 0000 0000 0000 0000 0000 0000 0000 0001dc 002c 0000 0000 0000 0000 0000 0020 0000 0001ec 001a 0000 0000 0000 0000 0000 0012 0000 0001fc 000b 0000 848c 0804 0004 0000 0011 000f 00020c $ readelf -x5 sample セクション '.dynsym' の 十六進数ダンプ: 0x080481cc 00000000 00000000 00000000 00000000 ................ 0x080481dc 2c000000 00000000 00000000 20000000 ,........... ... 0x080481ec 1a000000 00000000 00000000 12000000 ................ 0x080481fc 0b000000 8c840408 04000000 11000f00 ................
シンボルテーブル構造体は、/usr/include/elf.hで定義されています。
378 /* Symbol table entry. */ 379 380 typedef struct 381 { 382 Elf32_Word st_name; /* Symbol name (string tbl index) */ 383 Elf32_Addr st_value; /* Symbol value */ 384 Elf32_Word st_size; /* Symbol size */ 385 unsigned char st_info; /* Symbol type and binding */ 386 unsigned char st_other; /* Symbol visibility */ 387 Elf32_Section st_shndx; /* Section index */ 388 } Elf32_Sym;
Elf32_Sym構造体は16バイトなので、要素数4の配列ということのようです。Elf32_Sym構造体配列を当てはめてみると、こうなります。
.st_name | .st_value | .st_size | .st_info | .st_other | .st_shndx |
---|---|---|---|---|---|
0x00000000 | 0x00000000 | 0x00000000 | 0x00 | 0x00 | 0x0000 |
0x0000002c | 0x00000000 | 0x00000000 | 0x20 | 0x00 | 0x0000 |
0x0000001a | 0x00000000 | 0x00000000 | 0x12 | 0x00 | 0x0000 |
0x0000000b | 0x0804848c | 0x00000004 | 0x11 | 0x00 | 0x000f |
まず、st_nameを明らかにします。
st_nameは、.dynstrセクションの先頭からのオフセットアドレスを格納しているので、.dynstrセクションヘッダの内容をダンプします。
$ od -x -A x -j0x123c -N0x28 sample 00123c 0056 0000 0003 0000 0002 0000 820c 0804 00124c 020c 0000 0045 0000 0000 0000 0000 0000 00125c 0001 0000 0000 0000 001264
セクションのオフセットアドレスが「0x0000020c」、セクションサイズが「0x00000045」なので、その領域をダンプしてみます。
$ od -x -A x -j0x020c -N0x45 sample 00020c 6c00 6269 2e63 6f73 362e 5f00 4f49 735f 00021c 6474 6e69 755f 6573 0064 5f5f 696c 6362 00022c 735f 6174 7472 6d5f 6961 006e 5f5f 6d67 00023c 6e6f 735f 6174 7472 5f5f 4700 494c 4342 00024c 325f 302e 0000 000251 $ readelf -x6 sample セクション '.dynstr' の 十六進数ダンプ: 0x0804820c 006c6962 632e736f 2e36005f 494f5f73 .libc.so.6._IO_s 0x0804821c 7464696e 5f757365 64005f5f 6c696263 tdin_used.__libc 0x0804822c 5f737461 72745f6d 61696e00 5f5f676d _start_main.__gm 0x0804823c 6f6e5f73 74617274 5f5f0047 4c494243 on_start__.GLIBC 0x0804824c 5f322e30 00 _2.0.
セクションヘッダの情報に、シンボル名を紐付けます。
シンボル名 | .st_name | .st_value | .st_size | .st_info | .st_other | .st_shndx |
---|---|---|---|---|---|---|
"\0" | 0x00000000 | 0x00000000 | 0x00000000 | 0x00 | 0x00 | 0x0000 |
"__gmon_start__" | 0x0000002c | 0x00000000 | 0x00000000 | 0x20(STB_WEAK STT_NOTYPE) | 0x00 | 0x0000(SHN_UNDEF) |
"__libc_start_main" | 0x0000001a | 0x00000000 | 0x00000000 | 0x12(STB_GLOBAL STT_FUNC) | 0x00 | 0x0000(SHN_UNDEF) |
"_IO_stdin_used" | 0x0000000b | 0x0804848c | 0x00000004 | 0x11(STB_GLOBAL STT_OBJECT) | 0x00 | 0x000f(.rodata) |
__gmon_start__、__libc_start_main、_IO_stdin_usedはいずれもglibcの共有ライブラリをロードする際の関数なのでしょうが、調べても情報は見つかりませんでした。今後、調査します。
$ readelf -s sample シンボルテーブル '.dynsym' は 4 個のエントリから構成されています: 番号: 値 サイズ タイプ Bind Vis 索引名 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 2: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.0 (2) 3: 0804848c 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used シンボルテーブル '.symtab' は 72 個のエントリから構成されています: 番号: 値 サイズ タイプ Bind Vis 索引名 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 08048154 0 SECTION LOCAL DEFAULT 1 2: 08048168 0 SECTION LOCAL DEFAULT 2 3: 08048188 0 SECTION LOCAL DEFAULT 3 4: 080481ac 0 SECTION LOCAL DEFAULT 4 5: 080481cc 0 SECTION LOCAL DEFAULT 5 6: 0804820c 0 SECTION LOCAL DEFAULT 6 7: 08048252 0 SECTION LOCAL DEFAULT 7 8: 0804825c 0 SECTION LOCAL DEFAULT 8 9: 0804827c 0 SECTION LOCAL DEFAULT 9 10: 08048284 0 SECTION LOCAL DEFAULT 10 11: 08048294 0 SECTION LOCAL DEFAULT 11 12: 080482c0 0 SECTION LOCAL DEFAULT 12 13: 080482f0 0 SECTION LOCAL DEFAULT 13 14: 08048474 0 SECTION LOCAL DEFAULT 14 15: 08048488 0 SECTION LOCAL DEFAULT 15 16: 08048490 0 SECTION LOCAL DEFAULT 16 17: 080484bc 0 SECTION LOCAL DEFAULT 17 18: 08049f08 0 SECTION LOCAL DEFAULT 18 19: 08049f0c 0 SECTION LOCAL DEFAULT 19 20: 08049f10 0 SECTION LOCAL DEFAULT 20 21: 08049f14 0 SECTION LOCAL DEFAULT 21 22: 08049ffc 0 SECTION LOCAL DEFAULT 22 23: 0804a000 0 SECTION LOCAL DEFAULT 23 24: 0804a014 0 SECTION LOCAL DEFAULT 24 25: 0804a01c 0 SECTION LOCAL DEFAULT 25 26: 00000000 0 SECTION LOCAL DEFAULT 26 27: 00000000 0 SECTION LOCAL DEFAULT 27 28: 00000000 0 SECTION LOCAL DEFAULT 28 29: 00000000 0 SECTION LOCAL DEFAULT 29 30: 00000000 0 SECTION LOCAL DEFAULT 30 31: 00000000 0 SECTION LOCAL DEFAULT 31 32: 00000000 0 SECTION LOCAL DEFAULT 32 33: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 34: 08049f10 0 OBJECT LOCAL DEFAULT 20 __JCR_LIST__ 35: 08048330 0 FUNC LOCAL DEFAULT 13 deregister_tm_clones 36: 08048360 0 FUNC LOCAL DEFAULT 13 register_tm_clones 37: 080483a0 0 FUNC LOCAL DEFAULT 13 __do_global_dtors_aux 38: 0804a01c 1 OBJECT LOCAL DEFAULT 25 completed.6339 39: 08049f0c 0 OBJECT LOCAL DEFAULT 19 __do_global_dtors_aux_fin 40: 080483c0 0 FUNC LOCAL DEFAULT 13 frame_dummy 41: 08049f08 0 OBJECT LOCAL DEFAULT 18 __frame_dummy_init_array_ 42: 00000000 0 FILE LOCAL DEFAULT ABS sample.c 43: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 44: 08048568 0 OBJECT LOCAL DEFAULT 17 __FRAME_END__ 45: 08049f10 0 OBJECT LOCAL DEFAULT 20 __JCR_END__ 46: 00000000 0 FILE LOCAL DEFAULT ABS 47: 08049f0c 0 NOTYPE LOCAL DEFAULT 18 __init_array_end 48: 08049f14 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC 49: 08049f08 0 NOTYPE LOCAL DEFAULT 18 __init_array_start 50: 0804a000 0 OBJECT LOCAL DEFAULT 23 _GLOBAL_OFFSET_TABLE_ 51: 08048470 2 FUNC GLOBAL DEFAULT 13 __libc_csu_fini 52: 00000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab 53: 08048320 4 FUNC GLOBAL HIDDEN 13 __x86.get_pc_thunk.bx 54: 0804a014 0 NOTYPE WEAK DEFAULT 24 data_start 55: 0804a01c 0 NOTYPE GLOBAL DEFAULT 24 _edata 56: 08048474 0 FUNC GLOBAL DEFAULT 14 _fini 57: 0804a014 0 NOTYPE GLOBAL DEFAULT 24 __data_start 58: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 59: 0804a018 0 OBJECT GLOBAL HIDDEN 24 __dso_handle 60: 0804848c 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used 61: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_ 62: 08048400 97 FUNC GLOBAL DEFAULT 13 __libc_csu_init 63: 0804a020 0 NOTYPE GLOBAL DEFAULT 25 _end 64: 080482f0 0 FUNC GLOBAL DEFAULT 13 _start 65: 08048488 4 OBJECT GLOBAL DEFAULT 15 _fp_hw 66: 0804a01c 0 NOTYPE GLOBAL DEFAULT 25 __bss_start 67: 080483ec 10 FUNC GLOBAL DEFAULT 13 main 68: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses 69: 0804a01c 0 OBJECT GLOBAL HIDDEN 24 __TMC_END__ 70: 00000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 71: 08048294 0 FUNC GLOBAL DEFAULT 11 _init