¿Vulnerabilidad de cadena de caracteres utilizada para mostrar datos fuera del marco de la pila de funciones?

0

si ejecutamos el siguiente código usando la entrada "hi", la salida simplemente será "hi"

main(int argc, char **argv)
{
          char *secret = "This is a secret 1\n";
          char *secret2 = "This is secret 2\n";

          printf(argv[1]);
}

sin embargo, si ejecutamos el programa con la entrada "% s", la salida será "Esto es un secreto 1"

por lo que entiendo, la razón de esto es que cuando printf se alimenta con la cadena de formato% s, no comprueba si se ha insertado un dato de cadena en la pila, por lo tanto, si no se suministra una cadena, buscará los siguientes datos almacenados en la pila, que en este caso es nuestra cadena secreta. Por lo tanto, para cada% s obtendrá los siguientes datos en su marco de pila y los mostrará en formato de cadena.

Mi pregunta es, teniendo en cuenta que (main) y (printf) tienen su propio marco de pila, ¿cómo puede% s hacer que printf muestre datos que no pertenecen a su marco de pila? (ambas cadenas secretas están en principal)

    
pregunta Abbas Javan Jafari 26.04.2014 - 17:53
fuente

1 respuesta

1
  

sin embargo, si ejecutamos el programa con la entrada "% s", la salida será "Esto es un secreto 1

No, esto no está garantizado . puede imprimir la cadena contenida en la variable secret pero eso es simplemente una coincidencia. Tienes razón en que main y printf tienen sus propios marcos de pila. printf imprimirá la dirección de memoria a la que apunta la pila en este momento. Sin embargo, lo bueno de las vulnerabilidades de cadenas de formato como esta es que básicamente puedes leer cantidades arbitrarias de datos simplemente pasando varias cadenas de formato.

Encuentro que este documento es una buena introducción a la vulnerabilidad.

    
respondido por el Ayrx 26.04.2014 - 19:45
fuente

Lea otras preguntas en las etiquetas