P. 1
Occams Razor 04 01

Occams Razor 04 01

|Views: 93|Likes:
Publicado porCoopsolpy

More info:

Published by: Coopsolpy on May 13, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

05/13/2011

pdf

text

original

Para poder implementar nuestro escáner de media co-
nexión tendremos que hacer algunas modificaciones a
nuestro programa. Lo primero que necesitamos es un
nuevo fichero de cabecera, y una mínima modificación
de nuestras estructuras de datos.

#include

typedef struct {

struct tcphdr tcp ;

} PKT;

typedef struct {

struct iphdr ip ;

struct tcphdr tcp ;
} PKT_RX;

Como podéis comprobar, simplemente hemos substi-
tuido la cabecera ICMP de nuestro ejemplo anterior
por la nueva cabecera TCP (para eso necesitamos el
fichero .h adicional). También hemos eliminado el blo-
que de datos que no vamos a necesitar para nuestro
escáner. Volveremos sobre estas estructuras un poco
más tarde.

43| OCCAM’s Razor

REVERSO TENEBROSO

La siguiente parte que tenemos que modificar es el
programa principal, que quedaría de esta guisa.

int

main (int argc , char ∗argv [ ] ) {
int s , data_size ;

PKT_RX pkt ;
PKT

syn ;
char tmp[1024];

struct sockaddr_in dest ;

s = crea_socket (IPPROTO_TCP);

/∗ Construimos paquete ∗/

dest . sin_family = AF_INET;
inet_aton (argv [1] , &dest . sin_addr );
dest . sin_port = htons( atoi (argv [2] )) ;

memset (&syn , 0, sizeof (PKT));
data_size = tcp_pkt (&syn , argv [1] , atoi (argv [2]) ,
argv [3] , atoi (argv [ 4]) ) ;

/∗ Enviamos el paquete ∗/

sendto (s , &syn , data_size , 0,
(struct sockaddr∗) &dest ,
sizeof (struct sockaddr_in ));

/∗ Empezamos la captura ∗/

while (1)
{

read(s , &pkt , sizeof (PKT_RX));
printf ("Paquete␣desde␣%s:%d␣ACK:%d␣SYN:%d\n" ,
inet_ntoa(∗((struct in_addr∗)&pkt . ip . saddr )) ,
ntohs(pkt . tcp . source ) ,
pkt . tcp . ack , pkt . tcp . syn );

if (!memcmp (&pkt . ip . saddr ,

&dest . sin_addr ,
sizeof (struct in_addr))) break;

}
close (s );

return 0;

}

El primer cambio que observamoses que ahoranuestro
socket RAW va a utilizar un protocolo diferente. En
lugar del anterior IPPROTO_ICMP, ahora nos encontra-
mos un interesante IPPRPTO_TCP, que enviamos como
parámetro a nuestra función de creación del socket.

El segundo cambio importante que nos encontramos
es que, ahora, nuestro programa va a recibir cuatro pa-
rámetros. Los dos primeros identificarán la dirección
ip y puerto de la máquina remota, y los dos segundos
identificarán la dirección ip y puerto de la máquina
local... Esto último debería pareceros interesante ;).

En tercer lugar, obviamente, tenemos que utilizar una
función distinta para crear nuestro paquete. En esta
ocasión le hemos dado el original nombre de tcp_pkt.

No hay grandes diferencias en-
tre la construcción de un paquete
ICMP y de un paquete TCP.

Para terminar, hemos mejorado un poco nuestro bu-
cle principal. Ahora mostramos información específica
del protocolo TCP (como por ejemplo los valores de
los flags SYN y ACK) y hemos añadido un test sencillo
para terminar la aplicación.

Como enseguida comprobaréis, el test para terminar
la aplicación no es completo. El test completo os lo

dejamos a vosotros para que os entretengáis y así el
listado nos queda más corto y centrado en el tema que
nos ocupa.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->