Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: soyloqbuskas en 28 Septiembre 2012, 00:14 am



Título: funcion getPayloadTcp() en C
Publicado por: soyloqbuskas en 28 Septiembre 2012, 00:14 am
¡Buenas a todos!

Necesito hacer una funcion que me permita sacar el payload (campo de datos) de un paquete TCP.
La funcion seria asi....
Código
  1. char * getPayloadTcp(char* buffer){
  2.  
  3.      //separar la cabecera del campo de datos....
  4.      //¿como puedo hacer esto? no quiero codigo, solo el nombre de funciones que me permita hacerlo
  5.  
  6.  
  7.     return payload;
  8. }
  9.  

Estoy trabajando con C en linux.

Un saludo.


Título: Re: funcion getPayloadTcp() en C
Publicado por: soyloqbuskas en 28 Septiembre 2012, 01:05 am
Estoy probando ha hacer lo siguiente, pero no me sale bien....me da fallo de segmentacion

Código
  1.  
  2. char* getPayloadTcp(char* buffer){
  3.        int i=0;
  4.        int f=0;
  5.        int longitud=strlen((char*)buffer); //tamaño total del paquete
  6.  
  7.        struct iphdr *iph = (struct iphdr *)(buffer  + sizeof(struct ethhdr));
  8.        int iphdrlen = iph->ihl*4;  //tamaño de la cabecera ip
  9.        int ethhdrlen= sizeof(struct ethhdr); //tamaño de la cabecera ethernet
  10.        int tcphdrlen= sizeof(struct tcphdr); //tamaño de la cabecera tcp
  11.        int totalhdrlen=(tcphdrlen + iphdrlen + ethhdrlen); //suma de todas las cabeceras
  12.        char * datos="";
  13.  
  14.        for(f=totalhdrlen;f<longitud;f++){  
  15.                datos[i]=buffer[f];
  16.                i++;
  17.        }
  18.        datos[i]='\0';
  19.        printf("datos: %s\n", datos);
  20.  
  21.        return datos;
  22. }
  23.  


Título: Re: funcion getPayloadTcp() en C
Publicado por: 0xDani en 28 Septiembre 2012, 12:48 pm
El fallo de segmentacion creo que te lo da por la forma en que usas la variable datos. Prueba a reservarle memoria.

Saludos.


Título: Re: funcion getPayloadTcp() en C
Publicado por: soyloqbuskas en 29 Septiembre 2012, 18:32 pm
¡Buenas 0xDani !

He probado con un malloc y diclarandome la variable datos como un array de caracteres, y de ambas formas no me da fallo de segmentacion. El tema esta en que la variable datos se queda vacia, cuando deberia contener datos de la capa de aplicacion.

Código
  1. char* getPayloadTcp(char* buffer){
  2.        int i=0;
  3.        int f=0;
  4.        int longitud=sizeof((char*)buffer); //tamaño total del paquete (tambien he probado con strlen(buffer))
  5.  
  6.        struct iphdr *iph = (struct iphdr *)(buffer  + sizeof(struct ethhdr));
  7.        int iphdrlen = iph->ihl*4;  //tamaño de la cabecera ip
  8.        int ethhdrlen= sizeof(struct ethhdr); //tamaño de la cabecera ethernet
  9.        int tcphdrlen= sizeof(struct tcphdr); //tamaño de la cabecera tcp
  10.        int totalhdrlen=(tcphdrlen + iphdrlen + ethhdrlen); //suma de todas las cabeceras
  11.        char  *datos=(char *) malloc(65565);
  12.        printf("cabecera: %d\npaquete: %d\n",totalhdrlen, longitud);
  13.        for(f=totalhdrlen;f<longitud;f++){
  14.                datos[i]=buffer[f];
  15.                i++;
  16.        }
  17.        datos[i]='\0';
  18.        printf("datos: %s\n", datos);
  19.  
  20.        return datos;
  21. }
  22.  

He hecho unos printf() de la variable totalhdrlen y de longitud y el resultado es 54 y 4 respectivamente....Cuando en realidad longitud deberia ser siempre mayor que totalhdrlen...algo debo estar haciendo mal...


Título: Re: funcion getPayloadTcp() en C
Publicado por: 0xDani en 29 Septiembre 2012, 20:19 pm
¿Que quieres hacer en esta linea?

Código
  1. struct iphdr *iph = (struct iphdr *)(buffer  + sizeof(struct ethhdr));

Le asignas a un puntero a iphdr buffer (que es un puntero a char) mas el tamaño de otra estructura?


Título: Re: funcion getPayloadTcp() en C
Publicado por: soyloqbuskas en 29 Septiembre 2012, 22:50 pm
Uuuups! vaya fallo.

otra cosa mas....
la variable buffer es un puntero a un malloc(). ¿Como puedo imprimir el contenido del malloc?

ejemplo:

Código
  1. int data_size=0;
  2. char * buffer=(char *)malloc(65536);
  3. data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , (socklen_t*)&saddr_size);
  4. printf("data_size: %d\n", data_size);
  5. printf("strlen: %d\n",strlen(buffer));
  6. printf("sizeof: %d\n",sizeof(buffer)); // sizeof strlen y datasize no son iguales....por que?
  7. printf("buffer: \n%s\n", buffer); //aqui me imprime el puntero buffer, pero no el contenido del malloc
  8.  


Título: Re: funcion getPayloadTcp() en C
Publicado por: 0xDani en 30 Septiembre 2012, 13:38 pm
¿A que te refieres con imprimir el contenido del malloc()? ¿Que es lo que te imprime?


Título: Re: funcion getPayloadTcp() en C
Publicado por: soyloqbuskas en 30 Septiembre 2012, 16:25 pm
Pues....haber supuestamente al hacer el printf(buffer); deberia imprimirme el paquete completo...se que lo va a imprimir mal porque va intentar imprimir en ascii todo el buffer, pero si el tamaño del bufer es de 208 bytes, deberia imprimirme 208 caracteres ascii. Pêro no es asi....cuando hago un printf(buffer) solo me imprime 7 caracteres:
Citar
L���puܸ"

Y esto no deberia ser asi porque la funcion rcevfrom(); me retorna 208 bytes.
Código
  1. data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , (socklen_t*)&saddr_size);

Por tanto si data_size=208 pero al hacer un printf(buffer); no imprime 208 caracteres...es porque algo falla.....y no doy con ello...


Título: Re: funcion getPayloadTcp() en C
Publicado por: 0xDani en 30 Septiembre 2012, 16:40 pm
Yo creo que va bien, lo que pasa es que algunos caracteres te los va a imprimir y otros no. No estoy seguro pero creo que algunos caracteres la consola directamente no los imprime.


Título: Re: funcion getPayloadTcp() en C
Publicado por: soyloqbuskas en 4 Octubre 2012, 13:55 pm
¡Buenas!

La funcion getPayload ya la tengo bien hecha solo tengo una duda. Para calcular la suma de todas las cabeceras y que funcione correctamente debo hacer lo siguiente.
Código
  1. int hdrSize=( sizeof (struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr) + 12 );

¿El 12 magico porque debo sumarselo?

Creo que esos 12 bytes son 8 de la cabecera ethernet y 4 de la cabecera tcp. Cocretamente son:

7 bytes del preambulo de la cabecera ethernet
1 byte del delimitador del inicio de trama de la cabecera ethernet
4 bytes del campo de opciones de la cabera tcp.

Esto creo que se debe a que el struct ethhdr solo tiene los campos srcMAC destMAC y protocolo, y el strcut tcphdr no inculye el campo de opciones....

¿mis sospechas son correctas?

Un saludo.