Tengo una pregunta relacionada con este programa de C insegura.
int main(int argc, char **argv)
{
char text[32];
static int some_value = -72;
strcpy(text, argv[1]); /* copy the parameter into the array "text" */
printf("This is how you print correctly:\n");
printf("%s", text);
printf("This is how not to print:\n");
printf(text);
printf("some_value @ 0x%08x = %d [0x%08x]", &some_value, some_value, some_value);
return(0);
}
A partir de este código, podemos ver que printf(text)
es potencialmente inseguro ya que un usuario malintencionado puede ingresar una cadena maliciosa en él. Tomemos, por ejemplo, a un usuario que ingrese %s
como su entrada, lo que resultará en que %s
se almacene en otra ubicación de memoria que se definirá en la pila. Por ejemplo, supongamos que %s
se almacena en la dirección de memoria 5054 en la que el número 5054 se almacenaría en la pila para permitir que el procesador sepa dónde se encuentra %s
.
Ahora, cuando un compilador ejecuta printf("%s", text)
, buscará en la pila y se dirigirá a la dirección 5054. Sin embargo, ¿qué pasa con printf(text)
? ¿Cómo accede a la dirección de 5054 para imprimir %s
que después de imprimir podría dar como resultado un error de segmentación?