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 :

Les pièges du C [Tutoriel]


Sujet :

C

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Les pièges du C
    http://nicolasj.developpez.com/articles/pieges/

    Dans cet article, je vous expose quelques pièges à éviter lorsque l'on développe en C
    Vous pouvez laisser un commentaire sur cet article à la suite.

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par wAz
    Merci pour ce premier tutoriel sur la securite, j'aurais toutefois souhaite savoir si vous aviez des conseils supplementaires pour le "completer" ou des liens reidirigents vers des tutoriels sur la securite langage C.

    Merci d'avance

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut precisions sur le depassement de tampon
    Bonjour,

    Il serait intéressant de savoir pourquoi dans votre article vous passez une chaine de 45 octets avant l'adresse de la fonction pirate.

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Citation Envoyé par erebos007 Voir le message
    Il serait intéressant de savoir pourquoi dans votre article vous passez une chaine de 45 octets avant l'adresse de la fonction pirate.
    Parce qu'il faut suffisamment déborder pour écraser la valeur du registre qui nous intéresse.

    Sur wikipedia tu trouvera des schémas qui clarifies cela : http://en.wikipedia.org/wiki/Stack_b...ffer_overflows

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    Bonjour,



    Parce qu'il faut suffisamment déborder pour écraser la valeur du registre qui nous intéresse.

    Sur wikipedia tu trouvera des schémas qui clarifies cela : http://en.wikipedia.org/wiki/Stack_b...ffer_overflows

    Merci, pour le lien.
    Je connais les concepts des buffers overflow, ma remarque est qu'a mon sens, dans votre article votre façon de faire apparaît comme magique, vous n'expliquez pas comment vous avez calcule le dépassement nécessaire.

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par erebos007 Voir le message
    Je connais les concepts des buffers overflow, ma remarque est qu'a mon sens, dans votre article votre façon de faire apparaît comme magique, vous n'expliquez pas comment vous avez calcule le dépassement nécessaire.
    Dans ce cas c'est à la main, mais il possible de le calculer à partir de l'adresse du premier argument de la fonction et l'adresse du registre (généralement eip).

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Salut,

    J'aimerais savoir sous quelle version de GCC tu compiles.

    J'aimerais de plus savoir si sous les récentes version (~4.4) avec -fno-stack-protector (-fno-stack-all n'existe plus sous 4.4) on peut effectué les :

    III. Format de chaîne de caractères

    et les

    IV. Dépassement de capacité d'entier

    Merci,

    RedSword

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Peut-être devrais-tu mentionner, dans le cas des formats de printf(), l'extension GNU qui rend %n encore plus dangereux sous *n*x: La possibilité de spécifier un offset.
    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 émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Peut-être devrais-tu mentionner, dans le cas des formats de printf(), l'extension GNU qui rend %n encore plus dangereux sous *n*x: La possibilité de spécifier un offset.
    Bonjour Médinoc, pourrais tu apporter plus de précision sur ce point s'il te plaît, ma documentation de la glibc ne mentionne pas cette possiblité
    The ‘%n’ conversion is unlike any of the other output conversions. It uses an argument which must be a pointer to an int, but instead of printing anything it stores the number of characters printed so far by this call at that location. The ‘h’ and ‘l’ type modifiers are permitted to specify that the argument is of type short int * or long int * instead of int *, but no flags, field width, or precision are permitted.

    For example,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int nchar;
         printf ("%d %s%n\n", 3, "bears", &nchar);
    prints:

    3 bears
    and sets nchar to 7, because ‘3 bears’ is seven characters.
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    OK. Je ressors mon Techniques de Hacking, par Jon Erikson, chapitre 0x300, verset 0x354, page 187:
    L'accès direct à un paramètre est une technique qui simplifie l'exploitation des chaînes de format. Dans les exploits précédents, chaque argument d'un paramètre de format devait être traité séquentiellement. Nous avions donc besoin de plusieurs paramètres de format %x pour passer par tous les arguments des paramètres, jusqu'à atteindre le début de la chaîne de format. Par ailleurs, la nature séquentielle de la méthode imposait trois mots factices de quatre octets pour écrire correctement une adresse complète à un emplacement de mémoire quelconque.

    L'expression l'indique clairement, l'accès direct à un paramètre permet d'accéder directement aux paramètres, en utilisant le symbole dollar. Par exemple, %n$d accède au paramètre n et l'affiche comme un nombre décimal:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("7th: %7$d, 4th: %4$05d\n", 10, 20, 30, 40, 50, 60, 70, 80);
    Cet appel à printf() doit produire la sortie suivante:
    Bon en fait, ça ne précise pas d'où vient l'extension: Je pensais que c'était du GNU, mais si ça se trouve c'est du BSD. Enfin, tu vois tout de suite le bordel que ça peut causer quand on le combine à %n....
    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.

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    OK. Je ressors mon Techniques de Hacking, par Jon Erikson, chapitre 0x300, verset 0x354, page 187:

    Bon en fait, ça ne précise pas d'où vient l'extension: Je pensais que c'était du GNU, mais si ça se trouve c'est du BSD. Enfin, tu vois tout de suite le bordel que ça peut causer quand on le combine à %n....
    Je me doutais que tu parlais de ça, c'est simplement l'emploi du mot offset qui m'a fait douter. C'est une extension POSIX pour information. Il faut néanmoins bien remettre cette extension dans son contexte, elle a une grande utilité dans le domaine de l'internationalisation (i18n). un exemple vaut mieux qu'un long discours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char const * noun = "car";
    char const * adjective = "white";
    char const * format = "I have a %1$s %2$s \n";
     
    printf(format, adjective, noun);
     
    noun = "voiture";
    adjective = "blanche";
    format = "j'ai une %2$s %1$s \n";
     
    printf(format, adjective, noun);
    Encore une fois, je pense que le problème ne vient pas de l'extension mais du programmeur, on ne passe jamais une chaîne venant de l'utilisateur comme premier argument d'une fonction type printf(). C'est un peu le même principe que les SQL injections.
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je me doutais que ça avait une utilité, et je suis au courant que la faute revient à celui qui passe la chaîne. Mais ça augmente quand même la vulnérabilité existante.
    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.

  13. #13
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Mais ça augmente quand même la vulnérabilité existante.
    de grands pouvoirs impliquent de grandes responsabilitées
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

Discussions similaires

  1. [Tutoriel]Les pièges de l'Internet
    Par pi-2r dans le forum Sécurité
    Réponses: 20
    Dernier message: 24/08/2010, 15h15

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