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 :

[C] Méthodes détection buffer overflow/overrun


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut [C] Méthodes détection buffer overflow/overrun
    Bonjour à tous,

    Je cherche à savoir s'il existe des méthodes pour détecter les buffers overflows/overrun en C ?

    Je m'explique : voilà un code simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
        int*a = (int*)malloc(10*sizeof(int));
        a[10] = 50; // overflow
    }
    Je surcharge déjà les malloc/free avec des macros pour tracker les fuites de mémoire.

    La seule solution que j'ai trouvée pas très robuste est de "surallouer" la zone mémoire et de la préremplir avec une séquence connue. Et si cette zone est corrompue alors il y a overflow. Exemple : je demande une allocation de 10 entiers mais j'en alloue en fait 20 et je mets dans les cases 10 à 20, une séquence connue donc si je fais un overflow, je risque de détruire cette zone. Mais c'est pas superbe car si je fais un tab[100] = 50; ma solution ne marche pas...

    Je sais qu'il existe de outils (le plus souvent payant pour cela) mais je voudrais avoir ma solution customisée

    Est-il possible de détecter ce type d'erreur ?

    Même question mais pour un tableau statique ?

    Merci beaucoup
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Alors à l'exécution même "hors mode debug", je ne sais pas....

    Mais valgrind (avec les flags de debug à la compilation) pourra te dire quand tu dépasses très légèrement des tableaux, et quand tu dépasses amplement.
    Évidement, ça fonctionne lors de la phase de debug, donc pas possible avec ça de rattraper des cas non-prévus (mais il y aurait un problème de conception à ce moment là ?)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Alors à l'exécution même "hors mode debug", je ne sais pas....

    Mais valgrind (avec les flags de debug à la compilation) pourra te dire quand tu dépasses très légèrement des tableaux, et quand tu dépasses amplement.
    Évidement, ça fonctionne lors de la phase de debug, donc pas possible avec ça de rattraper des cas non-prévus (mais il y aurait un problème de conception à ce moment là ?)
    Oui Valgrind détecte les dépassements de tableaux.
    En fait la question était plutôt comment fait-il cela ?
    A mon avis, ca doit pas être du tout facile mais au cas où une solution m'échappe, je pose quand même la quesiton
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Normalement il override les mallocs en effet...
    Après, hormis ce que tu supposes, il faudrait lire la doc de Valgrind qui explique beaucoup ces choses (et qui est gratuit + open source il me semble) !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    Valgrind ne détecte que les dépassement des «tableaux» mallocés (cf la faq).
    Il y a bien une option -fbounds-check mais elle n'est pas reconnue par le front-end C de gcc.
    Si tu compiles au moins en O2 tu as l'option -Warray-bounds qui sera activée en même temps que -Wall ...
    Mais bon on reste en C et ce que tu demandes ferait se lever les aficionados de la perf qui te traiteraient d'hérétique ...

  6. #6
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par kwariz Voir le message
    Il y a bien une option -fbounds-check mais elle n'est pas reconnue par le front-end C de gcc.
    C'est quoi le front-end C ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  7. #7
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Pour faire simple, gcc signifie Gnu Compiler Collection. gcc peut compiler plusieurs langages (c, c++, ada, fortran, java, ...), il y a un front-end pour chaque langage qui se charge de parser le source et de le transformer en une forme intermédiaire qui sera compilée par un back-end pour une plateforme particulière.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Se protéger contre les buffers overflows
    Par pharaonline dans le forum C
    Réponses: 2
    Dernier message: 11/06/2006, 22h25
  2. Buffer overflow ?
    Par Albator5151 dans le forum Général Java
    Réponses: 6
    Dernier message: 08/02/2006, 01h23
  3. [oracle 9i] ORU-10027: buffer overflow
    Par jejam dans le forum Oracle
    Réponses: 7
    Dernier message: 01/09/2005, 13h05
  4. Erreur ORU-10027 : buffer overflow
    Par valerie90 dans le forum Oracle
    Réponses: 3
    Dernier message: 14/02/2005, 08h40
  5. [Erreur] buffer overflow
    Par cmoulin dans le forum Administration
    Réponses: 8
    Dernier message: 04/08/2004, 14h36

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