Giocando su vari wargames ho notato che continuavo a rimanere bloccato sulle vulnerabilità delle stringhe di formato, così ho deciso di fare un passo indietro e riapprenderli da zero. Nel processo ho capito che non potevo spiegare a me stesso perché possiamo leggere / scrivere in posizioni arbitrarie fornendo un indirizzo valido.
printf (\x41\x41\x41\x41_%08x_%08x)
In base alla mia comprensione delle stringhe di formato, questa chiamata di funzione dovrebbe semplicemente stampare AAAA + stack value + stack value
e nient'altro. Invece, perde due indirizzi a partire dall'indirizzo fornito
Da link
The format function now parses the format string ‘A’, by reading a
character a time. If it is not ‘%’, the character is copied to the output. In
case it is, the character behind the ‘%’ specifies the type of parameter that
should be evaluated. The string “%%” has a special meaning, it is used to print
the escape character ‘%’ itself. Every other parameter relates to data, which
is located on the stack
Se l'affermazione precedente è vera e \x41\x41\x41\x41_%08x_%08x
è l'unico argomento di printf () allocato nello stack, come possiamo spiegare la lettura / scrittura da / a posizioni di memoria?
MODIFICA 1:
Questa risposta in realtà specifica che possiamo diffondere qualsiasi indirizzo che vogliamo, ma non va oltre come iniziare a perdere da una posizione di memoria arbitraria.
So you're asking how printf can find the string because there is a
different parameter count than the % signs say? Two thought problems here: a)
Before printf can count the % at all, it has to find the string. Wrong string
content can't prevent finding this string. b) Without attacks: printf supports
variable parameter counts, and it always can find the string. Last parameter
etc. doesn't matter.
Per qualche motivo l'OP presuppone che la parte 'AAAA' sia un vero indirizzo.