91 votes

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 des 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 ? Que fait-il exactement ? Merci :)

156voto

sonicwave Points 4769

La décomposition :

  • 8 dit que vous voulez montrer 8 chiffres
  • 0 que vous voulez préfixer avec 0 au lieu de simples espaces vides
  • x que vous voulez imprimer en minuscules hexadécimales.

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;
}

Salida:

1d
1d
      1d
0000001d

Voir aussi http://www.cplusplus.com/reference/cstdio/printf/ pour référence.

7voto

Vladimir Points 110327

%08x signifie que chaque nombre doit être imprimé avec une largeur d'au moins 8 caractères et que tous les chiffres manquants doivent être remplis de zéros, par exemple, pour '1', la sortie sera la suivante 00000001

3voto

IamTheWalrus Points 246

L'attaque de la 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 des valeurs de la pile qui ne lui appartiennent pas. Vous aurez le même problème avec %d par exemple. %x est utile lorsque vous voulez voir ces valeurs en hexadécimal.

Comme expliqué dans les réponses précédentes, %08x produira un nombre hexagonal de 8 chiffres, complété par des zéros précédents.

En utilisant le formatage de votre exemple de code 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 à 8 chiffres.

2voto

Tony The Lion Points 28208

Cela spécifie le nombre de chiffres que vous souhaitez voir apparaître.

Valeur entière ou * qui spécifie la largeur minimale du champ. Le résultat est complété par des caractères d'espacement (par défaut), si nécessaire, à gauche s'il est justifié à droite, ou à droite s'il est 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 que l'indicateur - est spécifié et que la largeur du champ est positive.

2voto

Alter Mann Points 10564

De http://en.wikipedia.org/wiki/Printf_format_string

utiliser 0 au lieu des espaces pour remplir un champ lorsque l'option de largeur est spécifiée. Par exemple, printf("%2d", 3) donne le résultat " 3 ", tandis que printf("%02d", 3) aboutit à "03".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X