Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Funzione inaccessibile da GDB

    Ciao
    Sto scrivendo un programma, ma arrivato ad un certo punto esso fa cose inappropriate. Da ciò che sono riuscito a capire usando il debugger GDB, questo comportamento anormale è dovuto, molto probabilmente, ad una funzione che chiamo nella funzione principale, ovvero compare(), la quale "modifica", in un certo senso, il comportamento della stringa _ipstr che le passo quando questa successivamente interagisce in altri modi nel programma. In particolare, quando faccio il debug del mio programma, passo-passo, con GDB, e arrivato al punto di compare(), se premo s (il comando skip), GDB non accede alla funzione e non continua neance il debug riga per riga, bensì fa continuare il programma da solo fino alla fine.

    Ecco il codice di compare(), se vi dovessero essere dei problemi:

    codice:
    int compare(char *_ipstr, char *_filename)
    {
    
        char _ipbuf[IPBUFSIZ+1];
    
        	while (1) {		
    		if (fgets(_ipbuf, IPBUFSIZ+1, list) != NULL) {
    			if (!strcmp(_ipbuf, _ipstr))
    				return -1;
    		} else if (ferror(list)) {
    			fprintf(stderr, "Cannot read %s.\n", _filename);
    			exit(2);
    		} else
    			return 0;
    	}
    	
    }
    Ultimi chiarimenti: uso Linux, con compilatore GCC (ho specificato l'opzione -g per il debug). Quest'ultimo non mi dà nessun errore nella compilazione, e tra l'altro ho già testato le altre parti del programma (tra cui l'integrità del file segnato da list), che sono a posto. IPBUFSIZ nel programma ha valore 15.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Nella funzione non mi sembra ci siano problemi ...

    A parte il problema del debugger, non ho capito se hai malfunzionamenti del codice.

    E da quale codice viene chiamata questa funzione?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Io ho già verificato che non ci siano malfunzionamenti nel codice del programma, sia nel programma client che nell'interfaccia e nell'implementazione del tipo di dato di prima categoria ip.

    Comunque metto qui il codice del file main.c, il programma client, che comprende le funzioni main(), compare() e un'altra, result(), che verrà usata sempre da main().
    L'intestazione common.h comprende le intestazioni della libreria standard comuni a più file, ovvero stdio.h, stdlib.h e string.h .

    codice:
    #include "common.h"
    #include <time.h>
    #include "ip.h"
    
    int compare(char *_ipstr, char *_filename);
    int result(void);
    
    FILE *list, *res;
    
    char *nmap_out = "/tmp/.ftpscan";
    
    #define IPBUFSIZ 15
    
    main(int argc, char **argv)
    {
    
    	if (argc != 3)
    		exit(1);
    
    	if ((list = fopen(argv[1], "a+")) == NULL) {
    		fprintf(stderr, "Cannot open file %s.\n", argv[1]);
    		exit(1);
    	}
    
    	if ((res = fopen(argv[2], "a")) == NULL) {
    		fprintf(stderr, "Cannot open file %s.\n", argv[2]);
    		exit(1);
    	}
    
        ip _ip = ipcreate();
    
        	srand(time(NULL));
    
    	while (1) {
       		iprand(_ip); /* L'ip ha un valore casuale */
    
        		char _ipstr[IPBUFSIZ+1];
            	ip2str(_ip, _ipstr); /* l'ip viene trasformato in una stringa */
    		if (compare(_ipstr, argv[1]) == -1)
    			continue;
    
    		char check[] = "ping ";
    
    		strcat(check, _ipstr);
    
    		if (system(check)) {
    			fprintf(stderr, "\x1B[1mUnknown host %s\x1B[0m\n\n", _ipstr);
    			continue;
    		}
    
    		char cmd[] = "nmap --script ftp-bounce -n -Pn -p 21 ";
    
    		strcat(cmd, _ipstr);
    		strcat(cmd, " > ");
    		strcat(cmd, nmap_out);
    
    		printf("Scanning host %s  ...\n", _ipstr);
    
    		system(cmd);
    
    		char case0[] = "Bounce supported!\n";
    		char case1[] = "Bounce only supported on >1024 ports.\n";
    		char case2[] = "Bounce not supported.\n";
    
    		switch (result()) {
    			case 0:
    				printf("\x1B[4m%s\x1B[0m: \x1B[32%s\x1B[0m\n", _ipstr, case0);
    				if (fputs(strcat(strcat(_ipstr, " : "), case0), res) == EOF) {
    					fprintf(stderr, "Error in logging IP %s in %s\n.", _ipstr, argv[1]);
    					exit(5);
    				}
    				break;
    			case 1:
    				printf("\x1B[4m%s\x1B[0m: \x1B[33%s\x1B[0m\n", _ipstr, case1);
    				if (fputs(strcat(strcat(_ipstr, " : "), case1), res) == EOF) {
    					fprintf(stderr, "Error in logging IP %s in %s\n.", _ipstr, argv[1]);
    					exit(5);
    				}
    				break;
    			case 2:
    				printf("\x1B[4m%s\x1B[0m: \x1B[31%s\x1B[0m\n", _ipstr, case2);
    				break;
    		}
    
    		strcat(_ipstr, "\n");
    
    		if (fputs(_ipstr, list) == EOF) {
    			fprintf(stderr, "Error in logging IP %s in %s\n.", _ipstr, argv[1]);
    			exit(6);
    		}
    
    	}
    
        
    
    }
    
    int compare(char *_ipstr, char *_filename)
    {
    
        char _ipbuf[IPBUFSIZ+1];
    
        	while (1) {		
    		if (fgets(_ipbuf, IPBUFSIZ+1, list) != NULL) {
    			if (!strcmp(_ipbuf, _ipstr))
    				return -1;
    		} else if (ferror(list)) {
    			fprintf(stderr, "Cannot read %s.\n", _filename);
    			exit(2);
    		} else
    			return 0;
    	}
    	
    }
    
    int result(void) {
    
        FILE *tmp;
    
    	if ((tmp = fopen(nmap_out, "r")) == NULL) {
    		fprintf(stderr, "Cannot open file %s.\n", nmap_out);
    		exit(3);
    	}
    
        long pos = ftell(tmp);
         	
        	fseek(tmp, 0, SEEK_END);
    
        int size = ftell(tmp);
    
        	fseek(tmp, pos, SEEK_SET);
    
        char *tmpbuf;
    
        	if ((tmpbuf = malloc(size)) == NULL) {
    		fprintf(stderr, "Not enough memory.\n");
    		exit(4);
    	}
    
        int rcode;
    
    	if (strstr(tmpbuf, "ftp-bounce: no banner") != NULL)
    		rcode = 2;
    	else if (strstr(tmpbuf, "ftp-bounce: server forbids bouncing to low ports <1025") != NULL)
    		rcode = 1;
    	else if (strstr(tmpbuf, "ftp-bounce: bounce working") != NULL)
    		rcode = 0;
    	else
    		rcode =  2;
    
    	free(tmpbuf);
    
    	return rcode;
    
    }

  4. #4
    Il file main.c è corretto, scorretto, inappropriato, disordinato, o è semplicemente talmente lungo da non motivarvi a provare una soluzione al mio problema?

  5. #5
    il comando skip
    Scusate, è il comando step.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.