IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Erreur de segmentation avec fgets


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    securité
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : securité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Par défaut Erreur de segmentation avec fgets
    Bonjour à tous,

    J'ai un programme en C que j'arrive pas à debugger depuis plusieurs jours. J'ai une erreur de segmentation à la ligne 6 avec gdb (fonction fgets).

    Je m'explique:

    c'est un TP que je dois réaliser. Le code a été écris par quelqu'un d'autre et moi j'ai qu'un droit de lecture sur le fichier source (le fichier étant déjà compilé) et je peux aussi le debugger.

    Le but pour moi c'est de pouvoir retrouver le contenu du "buffer" sachant que je ne peux pas lire le fichier ".passwd"

    Or nul été le fait que j'ai une erreur de segmentation à la ligne 6, j'aurai pu faire un break avec gdb sur la ligne 7 et faire un "print buffer" pour voir le contenu du buffer.

    Or là j'ai un problème de segmentation sur la ligne et je ne peux modifier le fichier.

    Si quelqu'un a une idée, merci

    Merci pour votre aide et voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <unistd.h>
    int main(int argc, char *argv[]){
            FILE *secret = fopen("/challenge/binary/binary5/.passwd", "rt");
            char buffer[32];
            fgets(buffer, sizeof(buffer), secret);
            printf(argv[1]);
            fclose(secret);
            return 0;
    }

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut

    C'est du C, ce n'est pas le bon forum.

    Sinon, tu devrais commencer par tester le pointeur secret avant de lire dedans, car l'ouverture de ton fichier peut avoir échoué.

  3. #3
    Membre averti
    Homme Profil pro
    securité
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : securité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Par défaut
    Salut

    C'est du C, ce n'est pas le bon forum.

    Sinon, tu devrais commencer par tester le pointeur secret avant de lire dedans, car l'ouverture de ton fichier peut avoir échoué.
    Salut jblecanard
    et merci de répondre

    Quand, je fais un print avec gdb sur le pointeur secret, il me ramène une adresse en hexadécimale.

    Ps: comment ramener l'article dans la rubrique C

    Merci

  4. #4
    Membre averti
    Homme Profil pro
    securité
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : securité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Par défaut
    Autre chose: en faite, j'ai pas de droit de modification sur le fichier source, que droit de lecture sur le fichier et je peux juste le debugger avec gdb

  5. #5
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par momoski Voir le message
    Tu passes bien un argument au programme ?

  6. #6
    Membre averti
    Homme Profil pro
    securité
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : securité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Par défaut
    Je m'explique:

    c'est un TP que je dois réaliser. Le code a été écris par quelqu'un d'autre et moi j'ai qu'un droit de lecture sur le fichier source (le fichier étant déjà compilé) et je peux aussi le debugger.

    Le but pour moi c'est de pouvoir retrouver le contenu du "buffer" sachant que je ne peux lire le fichier ".passwd"

    Or nul été le fait que j'ai une erreur de segmentation à la ligne 6, j'aurai pu faire un break avec gdb sur la ligne 7 et faire un "print buffer" pour voir le contenu du buffer.

    Or là j'ai un problème de segmentation sur la ligne et je ne peux modifier le fichier.

    Si quelqu'un a une idée, merci

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Si tu as le code source, rien ne t'empêche de le modifier toi même avant de le recompiler!

    Et comme gdb te permet de lire le fichier source, c'est que tu as ce fichier quelque part, et donc que tu peux le modifier

    Fais attention au fait que la chaine de caractères "/challenge/binary/binary5/.passwd" est un chemin (absolu et non relatif) vers un fichier se trouvant sur un système linux.

    Cela signifie :
    1. que le fichier .pasword doit se trouver dans un dossier /challenge/binary/binary5 et non dans un éventuel dossier /home/momoski/(xxx)/challenge/binary/binary5
    2. que, si tu es sous windows, il n'y a strictement aucune chance pour que le système arrive à retrouver le fichier en question, les éparateurs de dossiers étant le back slash (\)
    Tout cela fait qu'il est plus que probable que le programme ne trouve effectivement pas le fichier .password, et que secret a donc effectivement de fortes chances d'être nul.

    Pour au minimum corriger ce problème, il faut, comme jblecanard l'a fait remarquer, tester la valeur de secret sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <unistd.h>
    int main(int argc, char *argv[]){
            FILE *secret = fopen("/challenge/binary/binary5/.passwd", "rt");
            if(secret == NULL) {// d'autre formes sont possibles ;)
                printf("cannot open .secret file")
                return 1;
            }
            char buffer[32];
            fgets(buffer, sizeof(buffer), secret);
            printf(argv[1]);
            fclose(secret);
            return 0;
    }
    Ps: comment ramener l'article dans la rubrique C
    Je m'en suis occupé
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Note: "t" n'est pas un spécificateur de format reconnu par la norme C, et même sur les plate-formes où il est reconnu, il est le plus souvent redondant: L'absence de "b" suffit.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre averti
    Homme Profil pro
    securité
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : securité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Par défaut
    Salut,

    Si tu as le code source, rien ne t'empêche de le modifier toi même avant de le recompiler!

    Et comme gdb te permet de lire le fichier source, c'est que tu as ce fichier quelque part, et donc que tu peux le modifier

    Fais attention au fait que la chaine de caractères "/challenge/binary/binary5/.passwd" est un chemin (absolu et non relatif) vers un fichier se trouvant sur un système linux.

    Cela signifie :
    que le fichier .pasword doit se trouver dans un dossier /challenge/binary/binary5 et non dans un éventuel dossier /home/momoski/(xxx)/challenge/binary/binary5
    que, si tu es sous windows, il n'y a strictement aucune chance pour que le système arrive à retrouver le fichier en question, les éparateurs de dossiers étant le back slash (\)
    Tout cela fait qu'il est plus que probable que le programme ne trouve effectivement pas le fichier .password, et que secret a donc effectivement de fortes chances d'être nul.

    Pour au minimum corriger ce problème, il faut, comme jblecanard l'a fait remarquer, tester la valeur de secret sous la forme de
    J'ai accès au code source en lecture seule (r). le fichier se trouve sur un serveur linux auquel j'accède à distance par ssh. le code source a été compilé par l'admin du serveur avec gcc avec l'option -g. Le fichier ".passwd" existe bien et bien sur le serveur sauf que je ne peux pas l'ouvrir avec vi ou autre (permission denied).

    Le but est de m'obliger à passer par un désembuage pour connaitre le contenu du ".passwd"

Discussions similaires

  1. Erreur de segmentation avec delete
    Par ValyGator dans le forum C++
    Réponses: 13
    Dernier message: 11/02/2009, 20h44
  2. Erreur de segmentation avec fclose
    Par sylvanus35 dans le forum Débuter
    Réponses: 7
    Dernier message: 09/08/2008, 05h33
  3. Erreur de segmentation avec libxml2
    Par DevMg dans le forum XML
    Réponses: 0
    Dernier message: 18/02/2008, 14h44
  4. Erreur de segmentation avec RSA_verify
    Par LorDjidane dans le forum C
    Réponses: 7
    Dernier message: 14/06/2007, 11h29
  5. Erreur de segmentation avec un main vide
    Par matique dans le forum Réseau
    Réponses: 10
    Dernier message: 22/04/2007, 07h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo