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

45
demandé sur Grijesh Chauhan 2013-02-27 13:50:53

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.

93
répondu sonicwave 2013-02-27 10:11:18

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.

2
répondu Tony The Lion 2013-02-27 09:52:29

%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

2
répondu Vladimir 2013-02-27 09:53:41

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

1
répondu Keine Lust 2013-02-27 09:54:34

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.

0
répondu IamTheWalrus 2018-04-04 09:20:13