Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42524
  • 博文数量: 11
  • 博客积分: 415
  • 博客等级: 下士
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-24 23:47
文章存档

2012年(1)

2010年(10)

我的朋友

分类:

2010-03-17 23:30:21

ELF简单解析(后续扩充)

ELF Header: 

Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00         (魔数--操作系统在加载可执行文件时,判断该魔数是否正确)
  Class:                             ELF32                (机器字节长度)
  Data:                              2's complement, little endian    (数据存储方式)
  Version:                           1 (current)            (版本)
  OS/ABI:                            UNIX - System V            (运行平台)
  ABI Version:                       0                    (ABI版本)
  Type:                              EXEC (Executable file)        (ELF重定位类型--可重定位.o,可执行ELF,共享目标文件.so)
  Machine:                           Intel 80386            (硬件平台)
  Version:                           0x1                (硬件平台版本)
  Entry point address:               0x8048360                (入口地址)
  Start of program headers:          52 (bytes into file)        (程序头的入口)
  Start of section headers:          5192 (bytes into file)        (段表的位置)
  Flags:                             0x0                (ELF标志位)
  Size of this header:               52 (bytes)                (程序头的长度)
  Size of program headers:           32 (bytes)                (段表的长度)
  Number of program headers:         8
  Size of section headers:           40 (bytes)
  Number of section headers:         36                    (段表描述符数量)
  Section header string table index: 33

其他:
 ELF(Common Object File Format)
 COFF(Common Object File Format)
 PE COFF(Portable指的是文件格式相同,不是代表能够在多个平台上运行)
 .out类似于ELF,缺乏对共享库的支持
///////////////////////////////////////////////////////////////////////////////////


Section Headers:

There are 36 section headers, starting at offset 0x1448:(注意:0x1448=5192 (也就是上面的start of section headers))

Name:    段名

Type:    段类型             含义

         NULL:            无效段
         PROGBIT:           程序段,代码段数据段
         SYMTAB:            段内容为符号表
         STRTAB:            字符串表
         RELA:              重定位表
         HASH:              希哈表
         DYNAMIC:           动态链接信息
         NOTE:              提示性信息
         NOBITS:            表示该段在文件中没有内容,比如.bss段
         REL:               重定位信息
         SHLIB:             保留
         DNYSYM:            动态链接到符号表

Flg:               表示该段在进程虚拟空间中到属性

    WRITE:             可写
    ALLOC:             在进程空间中须分配空间
    EXECINSTR:         可被执行
            

Addr:    段虚拟地址

Lk,Inf:    如果段到类型与链接相关的,比如重定位表,符号表等。则Lk,Inf包含一定到意义。

    类型:        sh_link                    sh_info
    符号表        操作系统相关                0
    重定位表        该段所使用的对应符号表在段表中到下标        该重定位表所作用的段在段表中到下标
   

关于重定位表:

链接器在处理目标文件时,需要对目标文件中到某些部位进行重定位,即代码段和数据段中那些对绝对地址的引用到位置。
比如,[.rel.plt]所示用到的符号表下标为6,也就是用到的符号表是.dynsym.Inf为13,表示该重定位作用于.plt段表。

关于字符串表:

ELF文件中用到了许多字符串,比如段名,变量名等,长度不定,通常使用字符串表来存放,并使用字符串在表中的
偏移来引用字符传串。字符串表在ELF文件中也以段表到形式保存,常见段名为.strtab或.shstrtab.
前者字符串表(存放普通到字符串),后者段表字符串表(存放段表中用到的字符串),ELF header到最后一项标明
段表字符串表在段表中的位置,本例子为33.

  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        08048134 000134 000013 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            08048148 000148 000020 00   A  0   0  4
  [ 3] .note.gnu.build-i NOTE            08048168 000168 000024 00   A  0   0  4
  [ 4] .hash             HASH            0804818c 00018c 00002c 04   A  6   0  4
  [ 5] .gnu.hash         GNU_HASH        080481b8 0001b8 000020 04   A  6   0  4
  [ 6] .dynsym           DYNSYM          080481d8 0001d8 000060 10   A  7   1  4
  [ 7] .dynstr           STRTAB          08048238 000238 000054 00   A  0   0  1
  [ 8] .gnu.version      VERSYM          0804828c 00028c 00000c 02   A  6   0  2
  [ 9] .gnu.version_r    VERNEED         08048298 000298 000020 00   A  7   1  4
  [10] .rel.dyn          REL             080482b8 0002b8 000008 08   A  6   0  4
  [11] .rel.plt          REL             080482c0 0002c0 000020 08   A  6  13  4
  [12] .init             PROGBITS        080482e0 0002e0 000030 00  AX  0   0  4
  [13] .plt              PROGBITS        08048310 000310 000050 04  AX  0   0  4
  [14] .text             PROGBITS        08048360 000360 0001bc 00  AX  0   0 16
  [15] .fini             PROGBITS        0804851c 00051c 00001c 00  AX  0   0  4
  [16] .rodata           PROGBITS        08048538 000538 000011 00   A  0   0  4
  [17] .eh_frame         PROGBITS        0804854c 00054c 000004 00   A  0   0  4
  [18] .ctors            PROGBITS        08049f0c 000f0c 000008 00  WA  0   0  4
  [19] .dtors            PROGBITS        08049f14 000f14 000008 00  WA  0   0  4
  [20] .jcr              PROGBITS        08049f1c 000f1c 000004 00  WA  0   0  4
  [21] .dynamic          DYNAMIC         08049f20 000f20 0000d0 08  WA  7   0  4
  [22] .got              PROGBITS        08049ff0 000ff0 000004 04  WA  0   0  4
  [23] .got.plt          PROGBITS        08049ff4 000ff4 00001c 04  WA  0   0  4
  [24] .data             PROGBITS        0804a010 001010 000008 00  WA  0   0  4
  [25] .bss              NOBITS          0804a018 001018 000008 00  WA  0   0  4
  [26] .comment          PROGBITS        00000000 001018 000046 01  MS  0   0  1
  [27] .debug_aranges    PROGBITS        00000000 001060 000020 00      0   0  8
  [28] .debug_pubnames   PROGBITS        00000000 001080 000025 00      0   0  1
  [29] .debug_info       PROGBITS        00000000 0010a5 0000f2 00      0   0  1
  [30] .debug_abbrev     PROGBITS        00000000 001197 00005f 00      0   0  1
  [31] .debug_line       PROGBITS        00000000 0011f6 000082 00      0   0  1
  [32] .debug_str        PROGBITS        00000000 001278 000092 01  MS  0   0  1
  [33] .shstrtab         STRTAB          00000000 00130a 00013e 00      0   0  1
  [34] .symtab           SYMTAB          00000000 0019e8 000490 10     35  52  4
  [35] .strtab           STRTAB          00000000 001e78 000219 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x08048134 0x08048134 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x00550 0x00550 R E 0x1000
  LOAD           0x000f0c 0x08049f0c 0x08049f0c 0x0010c 0x00114 RW  0x1000
  DYNAMIC        0x000f20 0x08049f20 0x08049f20 0x000d0 0x000d0 RW  0x4
  NOTE           0x000148 0x08048148 0x08048148 0x00044 0x00044 R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4
  GNU_RELRO      0x000f0c 0x08049f0c 0x08049f0c 0x000f4 0x000f4 R   0x1

 Section to Segment mapping:
  Segment Sections...
   00    
   01     .interp
   02     .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame
   03     .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
   04     .dynamic
   05     .note.ABI-tag .note.gnu.build-id
   06    
   07     .ctors .dtors .jcr .dynamic .got

Dynamic section at offset 0xf20 contains 21 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x80482e0
 0x0000000d (FINI)                       0x804851c
 0x00000004 (HASH)                       0x804818c
 0x6ffffef5 (GNU_HASH)                   0x80481b8
 0x00000005 (STRTAB)                     0x8048238
 0x00000006 (SYMTAB)                     0x80481d8
 0x0000000a (STRSZ)                      84 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x8049ff4
 0x00000002 (PLTRELSZ)                   32 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x80482c0
 0x00000011 (REL)                        0x80482b8
 0x00000012 (RELSZ)                      8 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x8048298
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x804828c
 0x00000000 (NULL)                       0x0

Relocation section '.rel.dyn' at offset 0x2b8 contains 1 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049ff0  00000106 R_386_GLOB_DAT    00000000   __gmon_start__

Relocation section '.rel.plt' at offset 0x2c0 contains 4 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0804a000  00000107 R_386_JUMP_SLOT   00000000   __gmon_start__
0804a004  00000207 R_386_JUMP_SLOT   00000000   putchar
0804a008  00000307 R_386_JUMP_SLOT   00000000   __libc_start_main
0804a00c  00000407 R_386_JUMP_SLOT   00000000   printf

There are no unwind sections in this file.

Symbol table '.dynsym' contains 6 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     2: 00000000     0 FUNC    GLOBAL DEFAULT  UND putchar@GLIBC_2.0 (2)
     3: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.0 (2)
     4: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.0 (2)
     5: 0804853c     4 OBJECT  GLOBAL DEFAULT   16 _IO_stdin_used

Symbol table '.symtab' contains 73 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 08048134     0 SECTION LOCAL  DEFAULT    1
     2: 08048148     0 SECTION LOCAL  DEFAULT    2
     3: 08048168     0 SECTION LOCAL  DEFAULT    3
     4: 0804818c     0 SECTION LOCAL  DEFAULT    4
     5: 080481b8     0 SECTION LOCAL  DEFAULT    5
     6: 080481d8     0 SECTION LOCAL  DEFAULT    6
     7: 08048238     0 SECTION LOCAL  DEFAULT    7
     8: 0804828c     0 SECTION LOCAL  DEFAULT    8
     9: 08048298     0 SECTION LOCAL  DEFAULT    9
    10: 080482b8     0 SECTION LOCAL  DEFAULT   10
    11: 080482c0     0 SECTION LOCAL  DEFAULT   11
    12: 080482e0     0 SECTION LOCAL  DEFAULT   12
    13: 08048310     0 SECTION LOCAL  DEFAULT   13
    14: 08048360     0 SECTION LOCAL  DEFAULT   14
    15: 0804851c     0 SECTION LOCAL  DEFAULT   15
    16: 08048538     0 SECTION LOCAL  DEFAULT   16
    17: 0804854c     0 SECTION LOCAL  DEFAULT   17
    18: 08049f0c     0 SECTION LOCAL  DEFAULT   18
    19: 08049f14     0 SECTION LOCAL  DEFAULT   19
    20: 08049f1c     0 SECTION LOCAL  DEFAULT   20
    21: 08049f20     0 SECTION LOCAL  DEFAULT   21
    22: 08049ff0     0 SECTION LOCAL  DEFAULT   22
    23: 08049ff4     0 SECTION LOCAL  DEFAULT   23
    24: 0804a010     0 SECTION LOCAL  DEFAULT   24
    25: 0804a018     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 init.c
    34: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    35: 08049f0c     0 OBJECT  LOCAL  DEFAULT   18 __CTOR_LIST__
    36: 08049f14     0 OBJECT  LOCAL  DEFAULT   19 __DTOR_LIST__
    37: 08049f1c     0 OBJECT  LOCAL  DEFAULT   20 __JCR_LIST__
    38: 08048390     0 FUNC    LOCAL  DEFAULT   14 __do_global_dtors_aux
    39: 0804a018     1 OBJECT  LOCAL  DEFAULT   25 completed.6990
    40: 0804a01c     4 OBJECT  LOCAL  DEFAULT   25 dtor_idx.6992
    41: 080483f0     0 FUNC    LOCAL  DEFAULT   14 frame_dummy
    42: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    43: 08049f10     0 OBJECT  LOCAL  DEFAULT   18 __CTOR_END__
    44: 0804854c     0 OBJECT  LOCAL  DEFAULT   17 __FRAME_END__
    45: 08049f1c     0 OBJECT  LOCAL  DEFAULT   20 __JCR_END__
    46: 080484f0     0 FUNC    LOCAL  DEFAULT   14 __do_global_ctors_aux
    47: 00000000     0 FILE    LOCAL  DEFAULT  ABS comline.c
    48: 08049ff4     0 OBJECT  LOCAL  HIDDEN   23 _GLOBAL_OFFSET_TABLE_
    49: 08049f0c     0 NOTYPE  LOCAL  HIDDEN   18 __init_array_end
    50: 08049f0c     0 NOTYPE  LOCAL  HIDDEN   18 __init_array_start
    51: 08049f20     0 OBJECT  LOCAL  HIDDEN   21 _DYNAMIC
    52: 0804a010     0 NOTYPE  WEAK   DEFAULT   24 data_start
    53: 08048480     5 FUNC    GLOBAL DEFAULT   14 __libc_csu_fini
    54: 08048360     0 FUNC    GLOBAL DEFAULT   14 _start
    55: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    56: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    57: 08048538     4 OBJECT  GLOBAL DEFAULT   16 _fp_hw
    58: 0804851c     0 FUNC    GLOBAL DEFAULT   15 _fini
    59: 00000000     0 FUNC    GLOBAL DEFAULT  UND putchar@@GLIBC_2.0
    60: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
    61: 0804853c     4 OBJECT  GLOBAL DEFAULT   16 _IO_stdin_used
    62: 0804a010     0 NOTYPE  GLOBAL DEFAULT   24 __data_start
    63: 0804a014     0 OBJECT  GLOBAL HIDDEN   24 __dso_handle
    64: 08049f18     0 OBJECT  GLOBAL HIDDEN   19 __DTOR_END__
    65: 08048490    90 FUNC    GLOBAL DEFAULT   14 __libc_csu_init
    66: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf@@GLIBC_2.0
    67: 0804a018     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    68: 0804a020     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    69: 0804a018     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    70: 080484ea     0 FUNC    GLOBAL HIDDEN   14 __i686.get_pc_thunk.bx
    71: 08048414   106 FUNC    GLOBAL DEFAULT   14 main
    72: 080482e0     0 FUNC    GLOBAL DEFAULT   12 _init

Histogram for bucket list length (total of 3 buckets):
 Length  Number     % of total  Coverage
      0  0          (  0.0%)
      1  1          ( 33.3%)     20.0%
      2  2          ( 66.7%)    100.0%

Histogram for `.gnu.hash' bucket list length (total of 2 buckets):
 Length  Number     % of total  Coverage
      0  1          ( 50.0%)
      1  1          ( 50.0%)    100.0%

Version symbols section '.gnu.version' contains 6 entries:
 Addr: 000000000804828c  Offset: 0x00028c  Link: 6 (.dynsym)
  000:   0 (*local*)       0 (*local*)       2 (GLIBC_2.0)     2 (GLIBC_2.0) 
  004:   2 (GLIBC_2.0)     1 (*global*)  

Version needs section '.gnu.version_r' contains 1 entries:
 Addr: 0x0000000008048298  Offset: 0x000298  Link: 7 (.dynstr)
  000000: Version: 1  File: libc.so.6  Cnt: 1
  0x0010:   Name: GLIBC_2.0  Flags: none  Version: 2

Notes at offset 0x00000148 with length 0x00000020:
  Owner        Data size    Description
  GNU        0x00000010    NT_GNU_ABI_TAG (ABI version tag)

Notes at offset 0x00000168 with length 0x00000024:
  Owner        Data size    Description
  GNU        0x00000014    NT_GNU_BUILD_ID (unique build ID bitstring)
阅读(1919) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~