IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Raw socket "bogus tcp header length"


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut Raw socket "bogus tcp header length"
    Bonjour,
    Voila j'ai voulu coder un petit programme qui envoie un paquet tcp/ip , quand je sniffe l envoie du paquet je peux voir sa dans l entete tcp :
    Header length : bogus, must be at least 20
    Et je ne vois pas d'ou cela pourrais venire , voila le code , si vous pourriez me donner une piste ... .
    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
     
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <pthread.h>
    #include <errno.h>
    #include <linux/if_ether.h>
    #include <linux/if_arp.h>
    #include <sys/ioctl.h>
     
    typedef struct iphdr_s {
    	unsigned int 		ihl:4;
    	unsigned int 		version:4;
    	unsigned char 		tos;
    	unsigned short int 	tot_len;
    	unsigned short int 	id;
    	unsigned short int	 offset;
    	unsigned char 		ttl;
    	unsigned char 		protocol; 
    	unsigned short int 	checksum;
    	unsigned int 		src;
    	unsigned int 		dst;
    } iphdr_t;
     
    typedef struct tcphdr_s {
    	unsigned short psrc;
    	unsigned short pdst;
    	unsigned int   seq;
    	unsigned int   ack;
    	unsigned char  doffset;
    	unsigned char  flags;
    	unsigned short win;
    	unsigned short checksum;
    	unsigned short urgp;
    } tcphdr_t;
     
    typedef struct fakehdr_s {
           unsigned long saddr;
           unsigned long daddr;
           char useless;
           unsigned char protocol;
           unsigned short length;
    } fakehdr_t;
     
     
    unsigned short		in_cksum(unsigned short * addr,int len);
     
     
    int main(int argc, char *argv[]) {
     
     
    	iphdr_t *iphdr = NULL;
    	tcphdr_t *tcphdr = NULL;
    	fakehdr_t *fakehdr = NULL;
    	char *pkt_send = NULL;
    	char *pkt_recv = NULL;
     
    	int res;
    	int sock;
    	struct sockaddr_in to;
     
     
    	pkt_send = (char *) malloc(sizeof(iphdr_t) + sizeof(tcphdr_t));
    	if ( pkt_send == NULL ) {
    		fprintf(stderr, "malloc on pkt_send failed\n");
    		return -1;
    	}
     
    	fakehdr = (fakehdr_t *) malloc(sizeof(fakehdr_t));
    	if ( fakehdr == NULL ) {
    		fprintf(stderr, "malloc on fakehdr failed\n");
    		return -1;
    	}
    	iphdr = (iphdr_t *) pkt_send;
    	tcphdr = (tcphdr_t *) (pkt_send + sizeof(iphdr_t));
     
     
    	iphdr->ihl = 5;
    	iphdr->version = 4;
    	iphdr->tos = 0;
    	iphdr->tot_len = (sizeof(iphdr_t) + sizeof(tcphdr_t));
    	iphdr->id = 0;
    	iphdr->ttl = 255;
    	iphdr->protocol = IPPROTO_TCP;
    	iphdr->checksum = 0;
    	iphdr->src = inet_addr("192.168.1.100");
    	iphdr->dst = inet_addr("192.168.1.1");
    	iphdr->checksum = in_cksum((unsigned short *)iphdr, sizeof(iphdr_t));
     
    	tcphdr->psrc = htons(5000);
    	tcphdr->pdst = htons(80);
    	tcphdr->seq = 7;
    	tcphdr->ack = 0;
    	tcphdr->doffset = 5;
    	tcphdr->flags = 0x02;
    	tcphdr->win = 550;
    	tcphdr->checksum = 0;
    	tcphdr->urgp = 0;
     
    	fakehdr->saddr = inet_addr("192.168.1.100");
    	fakehdr->daddr = inet_addr("192.168.1.1");
    	fakehdr->useless = htons(0);
    	fakehdr->protocol = IPPROTO_TCP;
    	fakehdr->length = sizeof(tcphdr_t);
     
    	tcphdr->checksum = in_cksum((unsigned short *)fakehdr, sizeof(tcphdr_t)+sizeof(fakehdr_t));
     
    	sock = socket(AF_INET,SOCK_RAW, IPPROTO_TCP);
    	if ( sock == -1 ) {
    		fprintf(stderr, "function socket() failed\n");
    		free(fakehdr);
    		free(pkt_send);
     
    		fakehdr = NULL;
    		pkt_send = NULL;
    		return -1;
    	}
     
    	to.sin_family = AF_INET;
    	to.sin_port = htons(80);
    	to.sin_addr.s_addr = inet_addr("192.168.1.1");
     
    	if ( setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (void *)&res, (socklen_t) sizeof(int)) == 1 ) {
    		fprintf(stderr, "setsockopt() failed\n");
    		free(fakehdr);
    		free(pkt_send);
     
    		fakehdr = NULL;
    		pkt_send = NULL;
    		return -1;
    	}
     
     
    	if ( sendto(sock, pkt_send, iphdr->tot_len, 0, (struct sockaddr *)&to, sizeof(to)) == -1 ) {
    		fprintf(stderr, "sendto() failed\n");
    		free(fakehdr);
    		free(pkt_send);
     
    		fakehdr = NULL;
    		pkt_send = NULL;
    		return -1;
    	}
     
     
    	free(fakehdr);
    	free(pkt_send);
     
    	fakehdr = NULL;
    	pkt_send = NULL;
    	return 0;
    }
     
    unsigned short
    in_cksum(unsigned short * addr,int len)
    {
    /* pas de moi */
     
    	register int sum = 0;
    	u_short answer = 0;
    	register u_short * w = addr;
    	register int nleft = len;
     
    	while(nleft > 1) {
    		sum += *w++;
    		nleft -= 2;
    	}
     
    	if(nleft == 1) {
    		*(u_char *)(&answer) = *(u_char *) w;
    		sum += answer;
    	}
     
    	sum = (sum >> 16) + (sum & 0xffff);
    	sum += (sum >> 16);
    	answer = ~sum;
     
    	return answer;
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    es tu sûr que tu n'a pas de problèmes de taille de structure ?

    est-ce que tu peux afficher et nous donner les résultats de :
    sizeof(iphdr_t)
    sizeof(tcphdr_t)
    sizeof(fakehdr_t)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Je ne suis pas allé très loin dans la lecture du code, première chose qui me saute aux yeux, c'est ta définition des différents entêtes (TCP, IP, etc), clairement, tu ne peux pas faire ça, tu dois reprendre celles définies dans les headers de ton système pour la simple et bonne et raison qu'en C standard, tu ne peux pas controller l'alignement dans ta structure hors les entêtes doivent avoir des tailles bien déterminés. Sous GCC tu as des extensions comme packed qui t'aident à cela, mais comme je l'ai dis, rien de standard.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut
    Merci , il fallai bien que j alle fire un tour du coté du header pour avoir la bonne structure tcp, donc sa "marche" encore un petit problème avec le calcul du checksum mais sa ira ! merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tcp syn sans reponse raw socket winpcap (c)
    Par Shark9 dans le forum Développement
    Réponses: 35
    Dernier message: 20/08/2012, 08h54
  2. requêtes http en pur raw socket TCP et UDP
    Par pam76 dans le forum Réseau
    Réponses: 2
    Dernier message: 27/10/2011, 13h13
  3. TCP Raw Socket
    Par Ekroz dans le forum Réseau
    Réponses: 1
    Dernier message: 08/04/2009, 21h14
  4. raw socket et protocole TCP/IP
    Par robertmouac dans le forum Développement
    Réponses: 3
    Dernier message: 09/03/2005, 23h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo