【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