C-le spécificateur de format %x
J'ai une petite question. Je sais que le spécificateur de format % x peut être utilisé pour lire les valeurs de la pile dans une attaque de chaîne de format.
J'ai trouvé le code suivant:
%08x%08x%08x%08x
Que signifie le 08? C'est quoi exactement? Merci :)
5 réponses
Répartition:
-
8
indique que vous voulez afficher 8 chiffres -
{[3] } que vous voulez préfixer avec
0
' s au lieu de seulement des espaces vides -
x
que vous souhaitez imprimer en minuscules hexadécimales.
Exemple rapide (grâce à 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 Aussi http://www.cplusplus.com/reference/cstdio/printf/ pour référence.
Qui spécifie le nombre de chiffres que vous voulez qu'il affiche.
Valeur entière ou * qui spécifie la largeur minimale du champ. Le résultat est rempli de caractères d'espace (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 avec la largeur de champ-flag spécifiée et positive.
%08x
signifie que chaque nombre doit être imprimé au moins 8 caractères de large avec remplir tous les chiffres manquants avec des zéros, par exemple pour' 1 ' sortie sera 00000001
À Partir de http://en.wikipedia.org/wiki/Printf_format_string
Utilisez 0 au lieu d'espaces pour remplir un champ lorsque l'option largeur est spécifiée. Par exemple, printf("%2d", 3)
donne "3", tandis que printf("%02d", 3)
donne "03".
L'attaque de chaîne de format sur printf que vous avez mentionnée n'est pas spécifique au formatage "%x" - dans tous les cas où printf a plus de paramètres de formatage que de variables passées, il lira 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 voulez voir ces valeurs hex.
Comme expliqué dans les réponses précédentes, % 08x produira un nombre hexadécimal à 8 chiffres, complété par des zéros précédents.
Utilisation du formatage dans votre code exemple dans printf, sans paramètres supplémentaires:
printf ("%08x %08x %08x %08x");
Récupère 4 paramètres de la pile et les affiche sous forme de nombres hexadécimaux rembourrés à 8 chiffres.