Ik heb een kleine vraag. Ik weet dat de %x-indelingsspecificatie kan worden gebruikt om waarden van de stapel te lezen in een indelingsreeksaanval.
Ik heb de volgende code gevonden:
%08x%08x%08x%08x
Wat betekent de 08? Wat doet het precies? Bedankt 🙂
Antwoord 1, autoriteit 100%
Uitsplitsing:
8
zegt dat je 8 cijfers wilt weergeven0
die u wilt laten voorafgaan met0
‘s in plaats van alleen spatiesx
die u in kleine letters hexadecimaal wilt afdrukken.
Snel voorbeeld (met dank aan 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;
}
Uitvoer:
1d
1d
1d
0000001d
Zie ook http://www.cplusplus.com/reference/cstdio/printf/voor referentie .
Antwoord 2, autoriteit 4%
%08x
betekent dat elk nummer minimaal 8 tekens breed moet worden afgedrukt en dat alle ontbrekende cijfers met nullen moeten worden ingevuld, b.v. voor ‘1’ is de uitvoer 00000001
Antwoord 3, autoriteit 2%
De indelingsstringaanval op printf die u hebt genoemd, is niet specifiek voor de opmaak “% x” – in elk geval waar PrintF meer opmaakparameters heeft dan gepasseerde variabelen, het zal waarden van de stapel lezen die er niet van horen. Je krijgt bijvoorbeeld hetzelfde probleem met% d.
% X is handig wanneer u die waarden als hex wilt zien.
Zoals uitgelegd in eerdere antwoorden, produceert% 08x een zescijferig hex-nummer, gewatteerd door voorgaande nullen.
Gebruik van de opmaak in uw CODE-voorbeeld in PrintF, zonder extra parameters:
printf ("%08x %08x %08x %08x");
haalt 4 parameters van de stapel op en toont ze als 8-cijferige gevoerde hex-nummers.
Antwoord 4
Dat geeft aan hoeveel cijfers u wilt dat het wordt weergegeven.
Integer-waarde of * die de minimumveldbreedte aan geeft. Het resultaat is gevoerd met ruimtetekens (standaard), indien nodig, aan de linkerkant wanneer rechts-gerechtvaardigd of rechts indien niet gerechtvaardigd is. In het geval wanneer * wordt gebruikt, wordt de breedte gespecificeerd door een extra argument van type int. Als de waarde van het argument negatief is, resulteert dit met de opgegeven en positieve veldbreedte – vlag.
Antwoord 5
van http://en.wikipedia.org/wiki/printf_Format_string
Gebruik 0 in plaats van spaties om een veld op te lossen wanneer de optie Breedte is opgegeven. Bijvoorbeeld, printf("%2d", 3)
resulteert in “3”, terwijl printf("%02d", 3)
resulteert in “03”.