Supposons que je le programme suivant:vulnérabilité chaîne de format et les chaînes d'entrée
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char buf [100];
snprintf (buf, sizeof buf, argv [1]) ;
buf [ sizeof buf -1 ] = 0;
printf ("%s \n" , buf) ;
return 0 ;
}
Si je compile et exécutez-le:
gcc test.c -o test
./test %p%p%p
(nil)0x4006d00x7f67e05b7ab0
Je peux voir les valeurs de la pile, ce qui signifie qu'elle est affectée par la vulnérabilité de format de chaîne.
Maintenant, modifions légèrement le code ci-dessus:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char buf [100];
printf ("%s \n" , argv[1]) ;
return 0 ;
}
Si je recompiler et re-exécuter, la vulnérabilité a disparu:
gcc test.c -o test
./test %p%p%p
%p%p%p
Pourquoi cela se produit, ce changé du premier exemple?
En outre, dans le premier exemple, ne devrait pas les % s dans le printf considérer buf comme une chaîne? Pourquoi un tel code est-il toujours affecté par la vulnérabilité de format de chaîne?
'% p% p% p' est boiteux, essayez'% n% n% n% n' – Jasen
ces espaces supplémentaires sembler terrible.ils rendent * plus difficile * de lire ce qui se passe –
Eh bien, vous avez complètement supprimé la partie vulnérable, pour une chose. – user2357112