vulnerabilidad attack c string security format

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 con 0 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