C – 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 stack dans 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 dit que vous voulez montrer 8 chiffres
  • 0 que vous voulez préfixer avec 0 au lieu des espaces vides
  • x que vous souhaitez imprimer en hexadécimal minuscule.

Exemple rapide (merci à Grijesh Chauhan):

 #include  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.

Cela spécifie le nombre de chiffres que vous voulez 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, sur la gauche, si ce dernier est justifié à droite, ou sur la 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, cela se traduit par la largeur du champ – spécifiée et positive.

%08x signifie que chaque nombre doit comporter au moins 8 caractères de largeur et que tous les chiffres manquants sont remplis de zéros. Par exemple, pour «1», la sortie sera 00000001

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

utilisez 0 au lieu d’espaces pour remplir un champ lorsque l’option width est spécifiée. Par exemple, printf("%2d", 3) génère “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 parameters de mise en forme que les variables passées, Vous obtiendrez le même problème avec% d par exemple. % x est utile lorsque vous souhaitez voir ces valeurs en hexadécimal.

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

En utilisant la mise en forme dans votre exemple de code dans printf, sans aucun paramètre supplémentaire:

 printf ("%08x %08x %08x %08x"); 

Va récupérer 4 parameters de la stack et les affiche sous la forme de nombres hexadécimaux capitonnés à 8 chiffres.