Newsgroup: it.comp.os.linux.development
Titolo: ARP e programmazione di rete

Salve, ho voluto provare a forgiare un pacchetto ARP reply (per studiare 
l'arp spoofing) e inviarlo su una rete ethernet, ho creato un frame 
ethernet completo (header ethernet + header arp) utilizzando le librerie 
di linux (if_ether.h - if_arp.h), credo di aver realizzato bene il frame 
campo per campo, il programma compila senza errori ma al momento di 
essere eseguito da un segmentation fault. Credo che la parte di codice 
che da problemi sia la seguente:
// Creiamo un socket ed associamolo all'interfaccia di rete ethernet
// (eth1)
	int sd;
	if ( sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) < 0 ) {
		perror("socket: ");
		exit(EXIT_FAILURE);
	}
	struct sockaddr addr;
	memset(&addr, 0x0, sizeof(struct sockaddr));
	addr.sa_family = AF_INET;
	memcpy(addr.sa_data, "eth1", 4);
 
	if ( bind(sd, &addr, sizeof(struct sockaddr)) < 0 ) {	
		perror("bind: ");
		exit(EXIT_FAILURE);
	}
	if ( write(sd, spacket, sizeof(struct packet)) < 0 ) {
		perror("send: ");
		exit(EXIT_FAILURE);
	}
Infatti se commento le funzioni bind() e write(), ricompilo ed eseguo il 
programma non ottengo il segmentation fault.
Potete aiutarmi? E' questa la maniera corretta di inviare il frame 
ethernet in rete?

 che da problemi sia la seguente:
]zac[
Compila il programma con le informazioni di debug, carica il programma con '
gdb nomeprogramma ' poi lo lanci con ' r ' o ' run ', all'errore con ' 
where ' puoi sapere in che punto (ed eventualmente la funzione che lo ha
lanciato) il programma è andato in crash.
Se ti sembra troppo astruso, installa e usa uno dei tanti front-end grafici
a ' gdb ', kdevelop, kdebug (se mi ricordo bene), DDD, ecc., che sono già
presenti nei pacchetti della tua distribuzione.
P.S. ci sarebbe anche emacs, ma direi che non lo hai mai usato e  che
probabilmente lo troveresti poco digeribile.

 memcpy(addr.sa_data, "eth1", 4);
Ma queste operazioni te le sei inventate tu o le hai viste da quache parte?
Non dovresti usare la struct 'sockaddr_ll'? E poi che c'entra AF_INET? Hai 
letto man packet?
Max


Hai perfettamente ragione! Ho letto PACKET(7) ed è stato illuminante, 
adesso il programma funziona (invia l'arp reply, lo vedo con "tcpdump -i 
eth1 arp"). Però ottengo ancora un "segmentation fault".
Posto il backtrace di gdb (comunque non sono pratico del debugger):
Program received signal SIGSEGV, Segmentation fault.
0x01000608 in ?? ()
(gdb) backtrace
#0  0x01000608 in ?? ()
#1  0x080484cb in __do_global_dtors_aux ()
#2  0x0804887b in _fini ()
#3  0x0804882a in __libc_csu_fini ()
#4  0xb7ec45d7 in exit () from /lib/tls/i686/cmov/libc.so.6
#5  0xb7eadeac in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
#6  0x08048485 in _start () at ../sysdeps/i386/elf/start.S:119
(gdb)
Sinceramente non so come possano essermi utili queste informazioni.
Se volete posto il codice.

 Se volete posto il codice.
A spanne il tuo programma va in crash quando termina (qualche cosa che non è
stato bloccato o distrutto prima di terminare il programma).
O forse non hai compilato con le informazioni per debug (per verificarlo
basta mettere un break-point in un punto del codice, e vedere se il
debugger si ferma il quel punto).

 
Ho compilato il programma con il comando gcc -g


Risolto. Avevo scritto le seguenti istruzioni:
struct packet *spacket;					
spacket = memset(spacket, 0x0, sizeof(struct packet));
Mentre adesso:
struct packet *spacket;					
spacket = malloc(sizeof(struct packet));   // ho aggiunto questa!
spacket = memset(spacket, 0x0, sizeof(struct packet));
Adesso niente più "segmentation fault".