[C] Problema core dump

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Dclaudio1990
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 624
Iscrizione: sabato 11 aprile 2015, 14:31
Distribuzione: openSUSE
Sesso: Maschile
Località: Roma

[C] Problema core dump

Messaggio da Dclaudio1990 »

Salve ho creato per giocare un po con i socket uno sniffer:

Codice: Seleziona tutto

#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include "inet_structures.h"
#define IFACE "eth0"
//prototipi
int Inet_OpenRawSock(void);
int Inet_SetPromisc(char *iface);
int main() {
int sock, bytes_recieved, fromlen;
char buffer[65535];
struct sockaddr_in from;
struct hostent *site;
IP_Header *ip;
TCP_Header *tcp;
//Creiamo la socket e mettiamola in promiscuo
sock=Inet_SetPromisc(IFACE);
while(1)
{
fromlen = sizeof from;
bytes_recieved = recvfrom(sock, buffer, sizeof(buffer),
0, (struct sockaddr *)&from, &fromlen);
if (bytes_recieved < 0){
printf("sock=%d",sock);
perror("Errore recv");
exit(1);
}
site=gethostbyaddr((char*)&from.sin_addr.s_addr,sizeof(from.sin_addr.s_addr),AF_INET);
printf("\nBytes received ::: %5d\n",bytes_recieved);
if(site!=(struct hostent*)0){
printf("Host name : %s\n",site->h_name);
}else{
printf("Host address : %s \n",from.sin_addr.s_addr);
}
ip = (IP_Header *)buffer;
//Guardo se e’ un paccheto TCP
if(ip->proto == 6) {
printf("Lunghezza Header = %d\n",ip->h_len);
printf("Protocollo = %d\n",ip->proto);
printf("Buffer:%s\n",buffer);
tcp = (TCP_Header *)(buffer + (4*ip->h_len));
printf("Porta Sorgente = %d\n",ntohs(tcp->source));
printf("Porta Destinazione = %d\n",ntohs(tcp->dest));
}
}
}
int Inet_OpenRawSock() {
int sock;
if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
perror("Errore creazione socket");
exit(0);
};
return(sock);
}


int Inet_SetPromisc(char *iface) {
int sock;
struct ifreq ifr;
sock = Inet_OpenRawSock();
printf("sock promisc=%d",sock);
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
if((ioctl(sock, SIOCGIFFLAGS, &ifr) < 0)) {
perror("Errore Interfaccia\n");
exit(0);
}
printf("Interfaccia: %s\n", iface);
//Setto l’interfaccia in modalita’ promiscua
if (!(ifr.ifr_flags & IFF_PROMISC))
{
ifr.ifr_flags |= IFF_PROMISC;
if ( ioctl(sock, SIOCSIFFLAGS, &ifr) < 0 ){ // promisc mode
perror("Errore non riesco a settare la modalita’ promiscua");
exit(0);
}
}
printf("Interfaccia %s settata in modo promiscuo", iface);
return(sock);
}
Il problema è che i primi dati me li riceve e va tutto bene ma dopo uno quando deve scrivere l'host di provenienza , mi da un core dump creato , E non riesco a capire perche . Grazie in anticipo per la risposta
"Io penso, dunque sono, ossia esisto."
-René Descartes
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: [C] Problema core dump

Messaggio da cortinico »

Potresti allegare anche "inet_structures.h"?
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
Avatar utente
Dclaudio1990
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 624
Iscrizione: sabato 11 aprile 2015, 14:31
Distribuzione: openSUSE
Sesso: Maschile
Località: Roma

Re: [C] Problema core dump

Messaggio da Dclaudio1990 »

Si:

Codice: Seleziona tutto

typedef struct {
unsigned short source;//Porta sorgente
unsigned short dest;//Porta destinazione
unsigned int seq;//Numero della sequenza
unsigned int ack_seq;//Numero di Acnowledge
unsigned char unused;//Non utilizzato
unsigned char doff:4;
//Se avete una macchina "Big Endian" invertite i due campi precedenti
unsigned char flags;//Flags TCP
unsigned short checksum;//Checksum pacchetto TCP
unsigned short urg_ptr;//Urgent Pointer
}TCP_Header;
typedef struct {
unsigned int h_len:4; //Lunghezza Header ip
unsigned int ip_version:4; //Versione protocollo IP
//Se avete una macchina "Big Endian" invertite i due campi precedenti
unsigned char tos; //Tipo del servizio
unsigned short t_len; //Lunghezza totale
unsigned short ident; //IP Ident
unsigned short frag_and_flags; //Frammenti e Flags
unsigned char ttl; //Time To Live
unsigned char proto; //Protocollo di Trasporto
unsigned short checksum; //Checksum pacchetto IP
unsigned int source_ip;//IP sorgente
unsigned int dest_ip;//IP destinazione
}IP_Header;
"Io penso, dunque sono, ossia esisto."
-René Descartes
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: [C] Problema core dump

Messaggio da cortinico »

Potresti provare con questo

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include "inet_structures.h"
#define IFACE "eth0"
//prototipi
int Inet_OpenRawSock(void);
int Inet_SetPromisc(char *iface);
int main() {
    int sock, bytes_recieved;
    char buffer[65535];
    struct sockaddr_in from;
    struct hostent *site;

    socklen_t fromlen = sizeof(from);

    IP_Header *ip;
    TCP_Header *tcp;
//Creiamo la socket e mettiamola in promiscuo
    sock=Inet_SetPromisc(IFACE);
    while(1)
    {
        fromlen = sizeof from;
        bytes_recieved = recvfrom(sock, buffer, sizeof(buffer),
            0, (struct sockaddr *)&from, &fromlen);
        if (bytes_recieved < 0){
            printf("sock=%d",sock);
            perror("Errore recv");
            exit(1);
        }
        site=gethostbyaddr((char*)&from.sin_addr.s_addr,sizeof(from.sin_addr.s_addr),AF_INET);
        printf("\nBytes received ::: %5d\n",bytes_recieved);
        if(site!=(struct hostent*)0){
            printf("Host name : %s\n",site->h_name);
        }else{
            printf("Host address : %d \n",from.sin_addr.s_addr);
        }
        ip = (IP_Header *)buffer;
//Guardo se e’ un paccheto TCP
        if(ip->proto == 6) {
            printf("Lunghezza Header = %d\n",ip->h_len);
            printf("Protocollo = %d\n",ip->proto);
            printf("Buffer:%s\n",buffer);
            tcp = (TCP_Header *)(buffer + (4*ip->h_len));
            printf("Porta Sorgente = %d\n",ntohs(tcp->source));
            printf("Porta Destinazione = %d\n",ntohs(tcp->dest));
        }
    }
}
int Inet_OpenRawSock() {
    int sock;
    if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
        perror("Errore creazione socket");
        exit(0);
    };
    return(sock);
}


int Inet_SetPromisc(char *iface) {
    int sock;
    struct ifreq ifr;
    sock = Inet_OpenRawSock();
    printf("sock promisc=%d",sock);
    memset(&ifr, 0, sizeof(ifr));
    strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
    if((ioctl(sock, SIOCGIFFLAGS, &ifr) < 0)) {
        perror("Errore Interfaccia\n");
        exit(0);
    }
    printf("Interfaccia: %s\n", iface);
//Setto l’interfaccia in modalita’ promiscua
    if (!(ifr.ifr_flags & IFF_PROMISC))
    {
        ifr.ifr_flags |= IFF_PROMISC;
if ( ioctl(sock, SIOCSIFFLAGS, &ifr) < 0 ){ // promisc mode
    perror("Errore non riesco a settare la modalita’ promiscua");
    exit(0);
}
}
printf("Interfaccia %s settata in modo promiscuo", iface);
return(sock);
}
Anche se dubito risolva il tuo problema.
Potresti descrivere meglio lo scenario che ti porta al core dump?
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
Avatar utente
Dclaudio1990
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 624
Iscrizione: sabato 11 aprile 2015, 14:31
Distribuzione: openSUSE
Sesso: Maschile
Località: Roma

Re: [C] Problema core dump

Messaggio da Dclaudio1990 »

In verità ha risolto , mi puoi spiegare a cosa era dovuto il core dump?
"Io penso, dunque sono, ossia esisto."
-René Descartes
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: [C] Problema core dump

Messaggio da cortinico »

Codice: Seleziona tutto

bytes_recieved = recvfrom(sock, buffer, sizeof(buffer),
            0, (struct sockaddr *)&from, &fromlen);
Il problema era nell'ultimo parametro. Te passavi un puntatore ad intero mentre lui vuole un puntatore a socklen_t *
Se vedi poco sopra ho cambiato la variabile fromlen:

Codice: Seleziona tutto

socklen_t fromlen = sizeof(from);
Era questo che generava il coredump.
Inoltre avevi dimenticato degli include (stdlib.h e string.h)
Infine c'era un errore qui:

Codice: Seleziona tutto

printf("Host address : %s \n",from.sin_addr.s_addr);
In quanto non puoi usare %s ma devi usare %d. Questo e' dovuto al fatto che il campo s_addr e' di fatto un uint32.
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
Avatar utente
Dclaudio1990
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 624
Iscrizione: sabato 11 aprile 2015, 14:31
Distribuzione: openSUSE
Sesso: Maschile
Località: Roma

Re: [C] Problema core dump

Messaggio da Dclaudio1990 »

Utilissimo.Grazie mille
"Io penso, dunque sono, ossia esisto."
-René Descartes
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti