Comment trouver le décalage de la section d'en-tête de la table des chaînes d'un elfe de fichier?

Je dois écrire un programme C qui permet d'imprimer un fichier ELF. Je vais avoir du mal à déterminer où la section en-tête de tableau de chaînes est.

Disons que j'ai un fichier qui m'a donné le résultat suivant avec:

readelf -h

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
  Type:                              REL (Relocatable file)  
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          17636 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           40 (bytes)
  Number of section headers:         23
  Section header string table index: 20

et avec:

readelf -S:

There are 23 section headers, starting at offset 0x44e4:
Section Headers:
[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
[ 0]                   NULL            00000000 000000 000000 00      0   0  0
[ 1] .text             PROGBITS        00000000 000034 000028 00  AX  0   0  4
[ 2] .rel.text         REL             00000000 0049d0 000018 08     21   1  4
[ 3] .data             PROGBITS        00000000 00005c 000000 00  WA  0   0  4
[ 4] .bss              NOBITS          00000000 00005c 000000 00  WA  0   0  4
[ 5] .rodata           PROGBITS        00000000 00005c 00000a 00   A  0   0  1
[ 6] .debug_info       PROGBITS        00000000 000066 00008f 00      0   0  1
[ 7] .rel.debug_info   REL             00000000 0049e8 0000b0 08     21   6  4
[ 8] .debug_abbrev     PROGBITS        00000000 0000f5 000041 00      0   0  1
[ 9] .debug_loc        PROGBITS        00000000 000136 000038 00      0   0  1
[10] .debug_aranges    PROGBITS        00000000 00016e 000020 00      0   0  1
[11] .rel.debug_arange REL             00000000 004a98 000010 08     21  10  4
[12] .debug_line       PROGBITS        00000000 00018e 0001b3 00      0   0  1
[13] .rel.debug_line   REL             00000000 004aa8 000008 08     21  12  4
[14] .debug_macinfo    PROGBITS        00000000 000341 003fb9 00      0   0  1
[15] .debug_str        PROGBITS        00000000 0042fa 0000bf 01  MS  0   0  1
[16] .comment          PROGBITS        00000000 0043b9 00002b 01  MS  0   0  1
[17] .note.GNU-stack   PROGBITS        00000000 0043e4 000000 00      0   0  1
[18] .eh_frame         PROGBITS        00000000 0043e4 000038 00   A  0   0  4
[19] .rel.eh_frame     REL             00000000 004ab0 000008 08     21  18  4
[20] .shstrtab         STRTAB          00000000 00441c 0000c5 00      0   0  1
[21] .symtab           SYMTAB          00000000 00487c 000130 10     22  16  4
[22] .strtab           STRTAB          00000000 0049ac 000021 00      0   0  1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

Comment pourrais-je être en mesure de calculer l'emplacement de la section d'en-tête de la table des chaînes?

  • Si vous avez trouvé dans ghex, ne pouvez-vous pas voir le décalage en regardant l'adresse dans le fichier là où vous l'avez trouvé? Je ne suis pas familier avec elle, mais quand je l'ai googlé une capture d'écran a suggéré l'adresse de l'affichage dans le fichier est dans la colonne de gauche.
InformationsquelleAutor user2263413 | 2013-04-13