Bonsoir tout le monde.

Je suis entrain de faire un projet portant sur le décodage de trames Ethernet/TCP-IP et son diagnostic de vulnérabilité.

Bon pour faire simple je vais vous copier/coller le "travail à réaliser"

Travail à réaliser:

Pour établir les connexions et enregistrer les trames de réponse les programmes "portscan2" et "wiredump" sont mis à votre disposition. Ils s'occupent de sauvegarder les trames dans les fichiers "dump.txt" et "dump.pcap". Normalement le programme "portscan2" est appelé par le script "scriptdelancement". Vous n'avez donc pas à l'utiliser directement. En fait vous devez écrire l'équivalent du programme "decode" (appelé lui aussi dans le "scriptdelancement") qui lit les trames dans le fichier "dump.txt" et les décode afin de savoir si c'est une trame indiquant une connexion acceptée sur le port spécifié. Ce fichier est au format texte, il se compose d'une trame par ligne, chaque octet est écrit sous sa forme hexadécimale et séparé des autres par un espace.

Fichier dump.txt :

00 0c 29 80 83 2f 00 50 56 f8 98 7c 08 00 45 00 00 28 60 8f 00 00 80 06 9b 2b 4a 7d 4d 68 c0 a8 e6 87 00 4f 8d f4 2c 06 3b a5 f7 4d 97 c8 50 10 fa f0 f0 c8 00 00 00 00 00 00 00 00
00 0c 29 80 83 2f 00 50 56 f8 98 7c 08 00 45 00 00 28 60 90 00 00 80 06 9b 2a 4a 7d 4d 68 c0 a8 e6 87 00 4f 8d f4 2c 06 3b a5 f7 4d 97 c8 50 10 fa f0 f0 c8 00 00 00 00 00 00 00 00
00 0c 29 80 83 2f 00 50 56 f8 98 7c 08 00 45 00 00 28 60 91 00 00 80 06 9b 29 4a 7d 4d 68 c0 a8 e6 87 00 4f 8d f4 2c 06 3b a5 f7 4d 97 c8 50 14 fa f0 f0 c4 00 00 00 00 00 00 00 00


VOILA MON TRAVAIL QUE J'AI COMMENCE AUJOURD'HUI (et que je dois rendre demain dans l'apres midi ) :

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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*Procedure qui enleve les espaces*/
void enleveespaces (const char trameAvecEspace[])
{
    int i,j,n = strlen(trameAvecEspace);
    for (i = 0 ; i <= n ; i++)
    {
        if (trameAvecEspace[i]==' ')
        {
            for(j = i ; j <= n ; j++)
            {
                trameAvecEspace[j]=trameAvecEspace[j+1];
                 }
            }
     }
}
 
/*Fonction "decoupe" qui d\u00e9coupe "trame"*/
 
char *decoupe (const char *trameAvecEspace, unsigned int debut, unsigned int fin)
{
    char *new_trameAvecEspace = NULL;
    int i;
    if (trameAvecEspace != NULL && debut< fin)
    {
 
        new_trameAvecEspace = malloc (sizeof (*new_trameAvecEspace) * (fin - debut * 2));
 
        if (new_trameAvecEspace != NULL)
        {
            for (i = debut; i <=fin; i++)
            {
                new_trameAvecEspace[i-debut] = trameAvecEspace[i];
             }
        new_trameAvecEspace[i-debut] = '\0';
        }
    }
 
    return new_trameAvecEspace;
}
 
 
int main()
{
    const char *IP, *TCP, *ethernet;
    const char *trameAvecEspace;
 
/*Partie ethernet*/
    const char  *Adresse_source1, *Adresse_destination1, *Protocole1;
 
 
/*Partie IP*/
    const char *Version_IP, *Long_entete, *Type_service, *Long_total, *Identification, *Flag1, *TTL, *Protocole2, *Checksum1, *Adresse_source2, *Adresse_destination2;
 
 
/*Partie TCP*/
    const char *Port_source, *Port_destination, *Num_sequence, *Num_acquittement, *Taille_entete, *Flag2, *Taille_fenetre, *Checksum2;
    const char *ACK;
 
 
 
 
/*decoupage de la trame*/
    ethernet = decoupe(trameAvecEspace, 0, 42);
    IP = decoupe(trameAvecEspace,42 , 102);
    TCP = decoupe(trameAvecEspace,102 , 180);
 
 
 
 
/*decoupage des champs*/
 
/*Ethernet*/
    Adresse_destination1 = decoupe(ethernet, 0,18);
    Adresse_source1 = decoupe(ethernet, 18,36);
    Protocole1 = decoupe(ethernet, 36,42);
 
    printf(">>Partie Ethernet<<\n\n");
    printf("Adresse de destination : %s\n", Adresse_destination1);
    printf("Adresse source : %s\n" , Adresse_source1);
    printf("Protocole : %s\n\n", Protocole1);
 
/*Partie IP*/
    Version_IP = decoupe(IP, 0,1);
    Long_entete = decoupe(IP, 2,3);
    Type_service = decoupe(IP, 3,6);
    Long_total = decoupe(IP, 6,12);
    Identification = decoupe(IP, 12,18);
    Flag1 = decoupe(IP, 18,24);
    TTL = decoupe(IP, 24,26);
    Protocole2 = decoupe(IP, 27,30);
    Checksum1 = decoupe (IP, 30,36);
    Adresse_source2 = decoupe(IP, 36,48);
    Adresse_destination2 = decoupe(IP, 48,60);
 
/*Partie TCP*/
    Port_source = decoupe(TCP, 0,6);
    Port_destination = decoupe(TCP, 6,12);
    Num_sequence = decoupe(TCP, 12,24);
    Num_acquittement = decoupe(TCP, 24,36);
    Taille_entete = decoupe(TCP, 36,39);
    Flag2 = decoupe(TCP, 39,42);
    Taille_fenetre = decoupe(TCP, 43,48);
    Checksum2 = decoupe(TCP, 48,54);
 
 
 
/*Convertir en d\u00e9cimal*/
unsigned long decPort_source, decPort_destination, decFlag2, decTaille_fenetre;
 
    decPort_source = strtoul(Port_source,0,16);
    decPort_destination = strtoul(Port_destination,0,16);
    decFlag2 = strtoul(Flag2,0,16);
    decTaille_fenetre = strtoul(Taille_fenetre,0,16);
 
 
 
/*Convertir en binaire Flag2*/
int i;
int bin[8] = {0};
 
    for (i=0; i<8 ; i++)
    {
        bin[i] = decFlag2 % 2;
        decFlag2 = decFlag2 /2;
    }
 
 
    printf(">>Partie TCP<<\n\n");
    printf("Port source : %d\n", decPort_source);
    printf("Port destination : %d\n" , decPort_destination);
    printf("Numero de sequence : %s\n", Num_sequence);
    printf("Numero d'acquittement : %s\n", Num_acquittement);
    printf("Taille de l'entete : %s\n" , Taille_entete);
    printf("Taille de la fenetre : %d\n", decTaille_fenetre);
    printf("Checksum : %s\n\n\n", Checksum2);
 
 
 
 
 
 
 
 
 
 
 
const int MTU = 1500;
const int MAXchar = 1500*2+1500+2;
 
typedef char t_filename[1024];
 
 
void lecture(t_filename fichier){
    FILE *fd;
    char str[MAXchar];
    if ((fd = fopen(fichier,"r")) == NULL)
      fprintf(stderr,"ERREUR DE CHARGEMENT DE FICHIER\n");
    else {
      while (!feof(fd)){
        fgets(str,MAXchar,fd);
        printf("%s <BR>\n",str);
      }
      fclose(fd);
    }
}
 
 
#define TAILLE_MAX 1000
 
int main(int argc, char *argv[])
{
    FILE* fichier = NULL;
    char chaine[TAILLE_MAX] = "";
    char new_chaine[TAILLE_MAX];
    fichier = fopen("dump.txt", "r");
 
    if (fichier != NULL)
    {
        while(!feof(fichier))
        {
    fgets(chaine, TAILLE_MAX, fichier);
                enleveespaces(chaine);     
            printf("%s", chaine);
}
 
        fclose(fichier);
    }
 
    return 0;
}
Mais voilà il y a un probleme avec ma procédure "eneleveespaces"...
Voila ce que ca m'affiche en le compilant:

In function 'enleveespaces':
ligne 16:erreur: assignment of read-only location
Je pense que c'est mon "trameAvecEspace" qui pose problème...(en espérant qu'il soit résolu rapidement!! )

PS: mince!! je viens de voir que la mise en page n'était pas terrible,avec un manque de couleur et une mauvaise pagination :s(surement du à un mauvais copier/coller )