C – De %x-indelingsspecificatie

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:

  • 8zegt dat je 8 cijfers wilt weergeven
  • 0die u wilt laten voorafgaan met 0‘s in plaats van alleen spaties
  • xdie 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%

%08xbetekent 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”.

Other episodes