http://nicolasj.developpez.com/articles/pieges/
Vous pouvez laisser un commentaire sur cet article à la suite.Dans cet article, je vous expose quelques pièges à éviter lorsque l'on développe en C
http://nicolasj.developpez.com/articles/pieges/
Vous pouvez laisser un commentaire sur cet article à la suite.Dans cet article, je vous expose quelques pièges à éviter lorsque l'on développe en C
Envoyé par wAz
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.
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
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
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.
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é
Cordialement.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,
prints:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int nchar; printf ("%d %s%n\n", 3, "bears", &nchar);
3 bears
and sets nchar to 7, because ‘3 bears’ is seven characters.
"The quieter you become, the more you are able to hear"
"Plus vous êtes silencieux, plus vous êtes capable d'entendre"
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....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:
Cet appel à printf() doit produire la sortie suivante:
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);
Code C : Sélectionner tout - Visualiser dans une fenêtre à part 7th: 70, 4th: 000400
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.
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:
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.
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);
Cordialement.
"The quieter you become, the more you are able to hear"
"Plus vous êtes silencieux, plus vous êtes capable d'entendre"
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager