web-dev-qa-db-fra.com

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 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 :)

50
Matthew

Panne:

  • 8 indique que vous souhaitez afficher 8 chiffres
  • 0 que vous voulez préfixer avec 0 au lieu d'espaces vides
  • x 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.

102
sonicwave

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. 

2
Tony The Lion

%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

2
Vladimir

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".

1
Keine Lust

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.

0
IamTheWalrus