Ir para conteúdo

ELF32: Estrutura do Section Header


Kellvin Romano

Posts Recomendados

Eai, Galera. Estou com dúvidas quanto ao array da estrutura de um Section Header.
A Estrutura é a seguinte (segundo a Linux Foundation):

typedef struct {
    Elf32_Word sh_name;
    Elf32_Word sh_type;
    Elf32_Word sh_flags;
    Elf32_Addr sh_addr;
    Elf32_Off sh_offset;
    Elf32_Word sh_size;
    Elf32_Word sh_link;
    Elf32_Word sh_info;
    Elf32_Word sh_addralign;
    Elf32_Word sh_entsize;
} Elf32_Shdr;

Criei um hello em C, compilei com param para m32 e no-pie, e usei o hd (hexdump) para acompanhar a estrutura.
Seguindo a estrutura, encontrei a primeira variável (sh_name), que no caso é o valor para um índice da Section String Table. E minha dúvida é justamente em cima dessa String Table, pois no Elf Header, há uma variável chamada chamada e_shstrndx, quê é um índice do Section Header Table p/ o Section String Table, onde contém o nome de cada seção. Como é calculado, e onde se encontra uma forma ou variável(dentro da estrutura) que aponte para o offset dessa String Table?

[edit1]

Tinha pedido para fechar, mas a dúvida ressurgiu.

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois...
  • Fernando Mercês changed the title to ELF32: Estrutura do Section Header
  • 2 semanas depois...
  • 2 semanas depois...

Opa, na verdade ele não mostra a quantidade de strings distintas não. Peguei um binário qualquer aqui como exemplo e rodei readelf -h arquivo pra pegar as informações do ELF Header:

Cabeçalho ELF:
  Magia:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Classe:                            ELF64
  Dados:                             complemento 2, little endian
  Versão:                            1 (current)
  OS/ABI:                            UNIX - System V
  Versão ABI:                        0
  Tipo:                              EXEC (ficheiro executável)
  Máquina:                           Advanced Micro Devices X86-64
  Versão:                            0x1
  Endereço do ponto de entrada:      0x453140
  Início dos cabeçalhos do programa: 64 (bytes no ficheiro)
  Início dos cabeçalhos de secção:   456 (bytes no ficheiro)
  Bandeiras:                         0x0
  Tamanho deste cabeçalho:           64 (bytes)
  Tamanho dos cabeçalhos do programa:56 (bytes)
  Nº de cabeçalhos do programa:      7
  Tamanho dos cabeçalhos de secção:  64 (bytes)
  Nº dos cabeçalhos de secção:       24
  Índice de tabela de cadeias da secção: 3


Como podemos ver o valor do campo e_shstrndx ali é 3 (última linha). Agora para printar os Section Headers usei readelf -S arquivo:

Há 24 cabeçalhos de secção, começando no desvio 0x1c8:

Cabeçalhos de secção:
  [Nr] Nome              Tipo             Endereço          Desvio
       Tam.              Tam.Ent          Bands  Lig.  Info  Alinh
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .text             PROGBITS         0000000000401000  00001000
       00000000000b140b  0000000000000000  AX       0     0     16
  [ 2] .rodata           PROGBITS         00000000004b3000  000b3000
       000000000004fa5d  0000000000000000   A       0     0     32
  [ 3] .shstrtab         STRTAB           0000000000000000  00102a60
       0000000000000193  0000000000000000           0     0     1
  [ 4] .typelink         PROGBITS         0000000000502c00  00102c00
       0000000000000d2c  0000000000000000   A       0     0     32
  [ 5] .itablink         PROGBITS         0000000000503930  00103930
       0000000000000080  0000000000000000   A       0     0     8
  [ 6] .gosymtab         PROGBITS         00000000005039b0  001039b0
       0000000000000000  0000000000000000   A       0     0     1
  [ 7] .gopclntab        PROGBITS         00000000005039c0  001039c0
       0000000000086003  0000000000000000   A       0     0     32
  [ 8] .noptrdata        PROGBITS         000000000058a000  0018a000

...

Omiti a saída completa, mas já deu pra ver que tem mais de 3 seções, como estava dizendo no primeiro comando rodado.

O que rola na verdade é que campo e_shstrndx possui o índice da Section Header Table de uma seção chamada .shstrtab (da pra ver ali na saída do segundo comando), que por sua vez possui dentro dela a Section String Table. Quanto ao sh_name, é simplesmente o índice (offset em hexa) da respectiva seção dentro da Section String Table.

Pra ficar mais claro vou fazer igual você disse que estava fazendo, ver os bytes diretamente. Deu pra ver pela saída do comando que o array de Section Headers começa no offset 0x1c8. Cada Section Header possui 64 bytes de tamanho e podemos ver que o primeiro elemento deste array está todo zerado, então vou pular 0x1c8 + 0x40 (64 em hexa) com o comando hd -s 0x208 arquivo e ver no que da:
 

00000208  01 00 00 00 01 00 00 00  06 00 00 00 00 00 00 00  |................|
00000218  00 10 40 00 00 00 00 00  00 10 00 00 00 00 00 00  |..@.............|
00000228  0b 14 0b 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000238  10 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...

Os primeiros 4 bytes (lembrando do endianess) representam o índice (isto é, o offset em hexa) do nome desta seção dentro da Section String Table. Se formos até esta suposta table (offset 0x102a60 segundo readelf -S), veremos o seguinte:

00102a60  00 2e 74 65 78 74 00 2e  6e 6f 70 74 72 64 61 74  |..text..noptrdat|
00102a70  61 00 2e 64 61 74 61 00  2e 62 73 73 00 2e 6e 6f  |a..data..bss..no|
00102a80  70 74 72 62 73 73 00 2e  6e 6f 74 65 2e 67 6f 2e  |ptrbss..note.go.|
00102a90  62 75 69 6c 64 69 64 00  2e 65 6c 66 64 61 74 61  |buildid..elfdata|
...

De fato, no índice 00 00 00 01 (ou simplesmente 1, em hexa) está o nome da nossa seção .text na Section String Table.


Abs.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...