Al jugar varios juegos de guerra, me di cuenta de que seguía atorándome en las vulnerabilidades de las cadenas de formato, así que decidí dar un paso atrás y volver a aprenderlas desde cero. En el proceso, me di cuenta de que no podía explicarme por qué podemos leer / escribir en ubicaciones arbitrarias al proporcionar una dirección válida.
printf (\x41\x41\x41\x41_%08x_%08x)
Según mi comprensión de las cadenas de formato, se supone que esta llamada de función simplemente imprime AAAA + stack value + stack value
y nada más. En su lugar, pierde dos direcciones comenzando por la dirección provista
De enlace
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
Si la declaración anterior es verdadera, y \x41\x41\x41\x41_%08x_%08x
es el único argumento de printf () asignado en la pila, entonces ¿cómo podemos explicar la lectura / escritura desde / a las ubicaciones de memoria?
EDIT 1:
Esta respuesta sí especifica que podemos filtrar la dirección que queramos, pero no explica cómo comenzar a filtrar desde una ubicación de 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.
Por alguna razón, el OP asume que la parte 'AAAA' es una dirección real.