Kellvin Romano Posted August 8, 2019 at 07:21 PM Share Posted August 8, 2019 at 07:21 PM 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 to comment Share on other sites More sharing options...
Willm Posted September 13, 2019 at 09:48 PM Share Posted September 13, 2019 at 09:48 PM Seria interessante estudar o código fonte dos programas que exibem a String Table. Eu percebi que tem alguns programas no github que mostram a ela Se eu tiver tempo e paciência talvez eu ajude! Link to comment Share on other sites More sharing options...
Willm Posted September 13, 2019 at 10:20 PM Share Posted September 13, 2019 at 10:20 PM Eu achei esse https://github.com/eliben/pyelftools/ Eu não testei e dei apenas uma olhada rápida no código, mas eu acho que ele pode te ajudar Tem outros também se você procurar Link to comment Share on other sites More sharing options...
HelderPereira Posted September 25, 2019 at 11:50 PM Share Posted September 25, 2019 at 11:50 PM e_shstrndx representa apenas a quantidade de strings distintas que representam nomes de seções Link to comment Share on other sites More sharing options...
Moderators Leandro Fróes Posted October 7, 2019 at 12:03 AM Moderators Share Posted October 7, 2019 at 12:03 AM 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 to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.