it-swarm.com.de

C - Der Formatbezeichner% x

Ich habe eine kleine Frage. Ich weiß, dass der Formatbezeichner% x verwendet werden kann, um Werte aus dem Stapel in einem Formatstring-Angriff auszulesen.

Ich habe folgenden Code gefunden:

%08x%08x%08x%08x

Was bedeutet die 08? Was macht es genau? Vielen Dank :)

50
Matthew

Nervenzusammenbruch:

  • 8 sagt, dass Sie 8 Ziffern anzeigen möchten
  • 0, dem Sie 0 anstelle von Leerzeichen voranstellen möchten
  • x, die Sie in Hexadezimalzeichen in Kleinbuchstaben drucken möchten.

Schnelles Beispiel (Dank an 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;
}

Ausgabe: 

1d
1d
      1d
0000001d

Siehe auch http://www.cplusplus.com/reference/cstdio/printf/ als Referenz.

102
sonicwave

Dies gibt an, wie viele Stellen Sie anzeigen möchten.

ganzzahlwert oder *, der die minimale Feldbreite angibt. Das Ergebnis wird mit Leerzeichen (standardmäßig) aufgefüllt, falls erforderlich links, wenn es rechts ausgerichtet ist, oder rechts, wenn linksbündig. Bei Verwendung von * wird die Breite durch ein zusätzliches Argument vom Typ int angegeben. Wenn der Wert des Arguments negativ ist, wird er mit dem - Flag und der positiven Feldbreite angegeben. 

2
Tony The Lion

%08x bedeutet, dass jede Zahl mindestens 8 Zeichen lang sein sollte, wobei alle fehlenden Ziffern mit Nullen gefüllt werden sollten, z. für '1' wird 00000001 ausgegeben

2
Vladimir

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

verwenden Sie 0 anstelle von Leerzeichen, um ein Feld aufzufüllen, wenn die Option width angegeben wird. Beispielsweise ergibt printf("%2d", 3) "3", während printf("%02d", 3) "03" ergibt.

1
Keine Lust

Der Format-String-Angriff auf printf, den Sie erwähnt haben, ist nicht spezifisch für die "% x" -Formatierung. In jedem Fall, in dem printf mehr Formatierungsparameter als übergebene Variablen hat, liest es Werte aus dem Stack, die nicht dazu gehören. Mit% d erhalten Sie dasselbe Problem, zum Beispiel .% X ist nützlich, wenn Sie diese Werte als Hexadezimalwerte anzeigen möchten.

Wie in den vorherigen Antworten erläutert, wird mit% 08x eine 8-stellige Hexadezimalzahl erzeugt, die durch vorangestellte Nullen aufgefüllt wird.

Verwenden Sie die Formatierung in Ihrem Codebeispiel in printf ohne zusätzliche Parameter:

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

Holt 4 Parameter aus dem Stack und zeigt sie als 8-stellige aufgefüllte Hex-Zahlen an.

0
IamTheWalrus