печатать названия эльфов заголовков разделов - PullRequest
1 голос
/ 02 апреля 2020

У меня есть программа C, в которой я хочу распечатать имена заголовков разделов входного файла. Я сделал все на основе исследования нотации ELF и помог с существующими программами на inte rnet, но это все еще не работает. Он печатал только индексы из для l oop, где также должны быть имена разделов. Кто-нибудь видит что-то, что я пропустил?

1 Ответ

0 голосов
/ 03 апреля 2020

Кто-нибудь видит что-то, что я пропустил?

Скомпилировали ли вы вашу программу в 32-битном режиме?

Обновление:

Существует «очевидная» ошибка, которую я пропустил при первом чтении и которая была обнаружена при сборке с помощью -fsanitize=address:

Elf32_Ehdr elfHdr;
...
fread(&elfHdr, 1, sizeof(Elf64_Ehdr), ElfFile);

Эта ошибка приводит к переполнению стекового буфера. Чтобы предотвратить такие ошибки, всегда безопаснее использовать sizeof(variable) вместо sizeof(Type), например

fread(&elfHdr, 1, sizeof(elfHdr), ElfFile);

У меня работает:

gcc -w -m32 t.c && ./a.out ./a.out
    Version: 0x01
    Entry point address: 0x000010C0
    Program header offset: 0x00000034
    Section header offset: 0x000038B0
    Flags: 0x00000000
    Size of this header: 0x34
    Size of program headers: 0x20
    Number of program headers: 11
    Size of section headers: 0x28
    Number of section headers: 30
    Section header string table index: 0x1D
0
1 .interp
2 .note.gnu.build-id
3 .note.ABI-tag
4 .gnu.hash
5 .dynsym
6 .dynstr
7 .gnu.version
8 .gnu.version_r
9 .rel.dyn
10 .rel.plt
11 .init
12 .plt
13 .plt.got
14 .text
15 .fini
16 .rodata
17 .eh_frame_hdr
18 .eh_frame
19 .init_array
20 .fini_array
21 .dynamic
22 .got
23 .got.plt
24 .data
25 .bss
26 .comment
27 .symtab
28 .strtab
29 .shstrtab

Если вы пытаетесь запустить в 64-битном файле ELF, вам нужно изменить Elf32_Ehdr и Elf32_Shdr с их Elf64_... эквивалентами.

...