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 :)
Nervenzusammenbruch:
8
sagt, dass Sie 8 Ziffern anzeigen möchten0
, dem Sie 0
anstelle von Leerzeichen voranstellen möchtenx
, 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.
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.
%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
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.
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.