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.