attack - format string python
C: el especificador de formato% x (5)
De http://en.wikipedia.org/wiki/Printf_format_string
use 0 en lugar de espacios para rellenar un campo cuando se especifique la opción de ancho. Por ejemplo, printf("%2d", 3)
da como resultado "3", mientras que printf("%02d", 3)
da como resultado "03".
Tengo una pequeña pregunta. Sé que el especificador de formato% x se puede usar para leer valores de la pila en un ataque de cadena de formato.
Encontré el siguiente código:
%08x%08x%08x%08x
¿Qué significa el 08? ¿Qué está haciendo exactamente? Gracias :)
Descompostura:
-
8
dice que quieres mostrar 8 dígitos -
0
que desea prefijar con0
en lugar de solo espacios en blanco -
x
que desea imprimir en minúsculas hexadecimales.
Ejemplo rápido (gracias a 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;
}
Salida:
1d
1d
1d
0000001d
También vea http://www.cplusplus.com/reference/cstdio/printf/ para referencia.
El ataque de cadena de formato en printf que mencionó no es específico del formato "% x"; en cualquier caso en que printf tenga más parámetros de formato que las variables pasadas, leerá valores de la pila que no le pertenecen. Obtendrá el mismo problema con% d, por ejemplo. % x es útil cuando quieres ver esos valores como hexadecimales.
Como se explicó en las respuestas anteriores,% 08x producirá un número hexadecimal de 8 dígitos, rellenado por ceros precedentes.
Usando el formateo en su ejemplo de código en printf, sin parámetros adicionales:
printf ("%08x %08x %08x %08x");
Obtendrá 4 parámetros de la pila y los mostrará como números hexadecimales de 8 dígitos.
Eso especifica cuántos dígitos quieres que muestre.
valor entero o * que especifica el ancho mínimo del campo. El resultado se rellena con caracteres de espacio (por defecto), si es necesario, a la izquierda cuando está justificado a la derecha, o a la derecha si está justificado a la izquierda. En el caso en que se usa *, el ancho se especifica mediante un argumento adicional de tipo int. Si el valor del argumento es negativo, se obtiene con la bandera especificada y el ancho de campo positivo.
%08x
significa que cada número debe imprimirse con al menos 8 caracteres de ancho con el llenado de todos los dígitos que faltan con ceros, por ejemplo, para ''1'' la salida será 00000001