J'ai une petite question. Je sais que le spécificateur de format% x peut être utilisé pour lire les valeurs de la pile lors d'une attaque par format.
J'ai trouvé le code suivant:
%08x%08x%08x%08x
Que signifie le 08? Que fait-il exactement? Merci :)
Panne:
8
indique que vous souhaitez afficher 8 chiffres0
que vous voulez préfixer avec 0
au lieu d'espaces videsx
que vous souhaitez imprimer en hexadécimal minuscule.Exemple rapide (merci à Grijesh Chauhan):
#include <stdio.h>
int main() {
int data = 29;
printf("%x\n", data); // just print data
printf("%0x\n", data); // just print data ('0' on its own has no effect)
printf("%8x\n", data); // print in 8 width and pad with blank spaces
printf("%08x\n", data); // print in 8 width and pad with 0's
return 0;
}
Sortie:
1d
1d
1d
0000001d
Voir également http://www.cplusplus.com/reference/cstdio/printf/ pour référence.
Cela spécifie le nombre de chiffres que vous souhaitez afficher.
valeur entière ou * spécifiant la largeur minimale du champ. Le résultat est complété par des espaces (par défaut), si nécessaire, à gauche lorsque justifié à droite ou à droite si justifié à gauche. Dans le cas où * est utilisé, la largeur est spécifiée par un argument supplémentaire de type int. Si la valeur de l'argument est négative, il en résulte l'option - flag spécifiée et la largeur du champ positif.
%08x
signifie que chaque numéro doit être imprimé avec au moins 8 caractères de large, en remplissant tous les chiffres manquants par des zéros, par exemple pour '1' sortie sera 00000001
De http://en.wikipedia.org/wiki/Printf_format_string
utilisez 0 au lieu d'espaces pour remplir un champ lorsque l'option width est spécifiée. Par exemple, printf("%2d", 3)
donne "3", alors que printf("%02d", 3)
donne "03".
L'attaque de la chaîne de format sur printf que vous avez mentionnée n'est pas spécifique à la mise en forme "% x" - dans tous les cas où printf a plus de paramètres de mise en forme que de variables transmises, il lit les valeurs de la pile qui ne lui appartiennent pas. Vous obtiendrez le même problème avec% d, par exemple .% X est utile lorsque vous souhaitez afficher ces valeurs au format hexadécimal.
Comme expliqué dans les réponses précédentes,% 08x générera un nombre hexadécimal à 8 chiffres, complété par des zéros précédents.
Utilisation de la mise en forme dans votre exemple de code dans printf, sans paramètre supplémentaire:
printf ("%08x %08x %08x %08x");
Va récupérer 4 paramètres de la pile et les afficher sous forme de nombres hexadécimaux à 8 chiffres.