Lecture de trame

Fermé
anjali26 Messages postés 4 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010 - 13 janv. 2010 à 18:30
anjali26 Messages postés 4 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010 - 13 janv. 2010 à 22:55
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 ) :


/*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 )
A voir également:

5 réponses

jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 8
13 janv. 2010 à 18:43
je ne sais pas si c'est ça mais :

dans ta procedure il y a :
for (i = 0 ; i <= n ; i++)

ça ne serait pas <n plutot et non <= car je crois que tu vas un peut trop loins dans ta chaine ... a voir en affichant n et le comparer a taille_max
0
anjali26 Messages postés 4 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 20:14
Ok je prend en note (je n'ai pas de quoi compiler,ni de machine virtuelle pour le voir :s)
crois tu que si au bout d'un moment i = n cela perturbe le bon fonctionnement...je ne comprend pas trop le message d'erreur que ca m'affiche :"assignment of read-only location"
0
anjali26 Messages postés 4 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 22:30
up!!!
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
13 janv. 2010 à 22:36
new_trameAvecEspace = malloc (sizeof (*new_trameAvecEspace) * (fin - debut * 2));


je n'y connais rien dans ce que tu veux faire, mais tu n'aurais pas fait une faute ici ? ce ne serait pas plutot :

new_trameAvecEspace = malloc (sizeof (*new_trameAvecEspace) * ((fin - debut) * 2));
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
anjali26 Messages postés 4 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 22:55
oui...

enfin le probleme se situe sur la procédure...
j'ai un peu cherché et c'est enfaite le "const char" de "void enleveespaces (const char trameAvecEspace[])" qui va pas... faut que je le mette en "char" uniquement!

mais j'ai peur que ca me complique les choses dans la partie "découpage de trame"...
0