Кто-нибудь видит что-то, что я пропустил?
Скомпилировали ли вы вашу программу в 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_...
эквивалентами.