Bonjour a tous.

Je suis en ce moment en train de developper un petit binaire s'amusant avec le format elf32. Mais j ai un problème: Je n'arrive pas a récuperer mon header de section.

Voici mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
 
** Developped by syl
** contact : syl@evilkittens.org, ccna.syl@gmail.com
** THE BEER-WARE LICENSE
**
** syl@evilkittens.org wrote this file.  As long as you retain this notice you
** can do whatever you want with this stuff.  If we meet some day, and you
** think this stuff is worth it, you can buy me a beer in return.
**
** Sylvestre Gallon
*/
 
#include <sys/exec_elf.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
 
const char      *archtype[] = {
        "No Machine",
        "AT&T WE 32100",
        "SPARC",
        "Intel 80386",
        "Motorola 68000",
*/
 
#include <sys/exec_elf.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
 
const char      *archtype[] = {
        "No Machine",
        "AT&T WE 32100",
        "SPARC",
        "Intel 80386",
        "Motorola 68000",
        "Motorola 88000",
        "Intel 80486 - unused?",
        "Intel 80860",
        "MIPS R3000 Big-Endian only",
        "unknow",
        "unknow",
        "MIPS R4000 Big-Endian",
        "SPARC v9 64-bit unoffical"
        "",
        "",
        "",
        "HPPA"};
 
const char      *version[] = {
        "Invalid",
        "Current"
        };
 
const char      *filetype[] = {
        "No file type",
        "relocatable file",
        "executable file",
        "shared object file",
        "core file"
        };
 
 
int     myerror(char *str)
{
        perror(str);
        exit(EXIT_FAILURE);
}
 
int     elf_search_section(void *mem)
{
        Elf32_Ehdr      *bin;
        Elf32_Shdr      *sec;
 
        bin = mem;
        printf("file                    ==> %s\n", filetype[bin->e_type]);
        printf("arch                    ==> %s\n", archtype[bin->e_machine]);
        printf("vers                    ==> %s\n", version[bin->e_version]);
        printf("nb section header       ==> %i\n", bin->e_shnum);
        printf("Section header offset   ==> %08x\n", bin->e_shoff);
        printf("Section header size     ==> %i\n", bin->e_shentsize);
        memcpy(sec,mem+bin->e_shoff, bin->e_shentsize);
        printf("First Section name      ====>%s\n", sec->sh_name);
        printf("First Section type      ====>%i\n", sec->sh_type);
        return (EXIT_SUCCESS);
}
 
int     main(int ac, char **av)
{
        int             fd;
        struct  stat    s;
        void            *mem;
 
        if (ac < 2)
                myerror("usage: ./bite file");
        if ((fd = open(av[1], O_RDONLY)) < 0)
                myerror("open error");
        if (fstat(fd, &s) < 0)
                myerror("stat error");
        if ((mem = mmap(NULL, s.st_size, PROT_READ, MAP_FILE, fd, 0)) == MAP_FAILED)
                myerror("mmap error");
        printf("mmap(%s): %08x\n", av[1], mem);
        elf_search_section(mem);
        if (munmap(mem, s.st_size) != 0)
                myerror("munmap error");
        if (close(fd) != 0)
                myerror("close error"); 
        return (EXIT_SUCCESS);
}
Le probleme se situe donc au niveau du memcpy. sec ne recupere pas le header de section. En esperant votre aide précieuse, je vous remercie.