L'overflow del buffer di exploitation porta al segfault

20

Sto cercando di sfruttare la vulnerabilità di overflow dello stack semplice. Ho un codice di base in c:

#include <cstring>
int main( int argc, char** argv )
{
        char buffer[500];
        strcpy(buffer, argv[1]);
        return 0;
}

compilato usando -fno-stack-protector . Ho già capito la lunghezza del buffer e ho sovrascritto con successo i registri EBP e EIP. Ho iniettato un gran numero di NOP, seguito con questo codice shell e infine inserito un indirizzo in cui i NOP iniettati sono così il codice viene eseguito.

Ora il problema. Nella foto allegata puoi vedere l'output di gdb. Se eseguo il mio programma con un input malevolo, ottiene un SIGSEGV. Scaricando l'indirizzo 0xbffff880 puoi vedere che ci sono molti NOP seguiti con il codice shell (scatola rosa) e infine con l'indirizzo (riquadro blu).

Ho pensato che funzionasse come segue: all'inizio 0x90909090 s e lo shellcode sono considerati dati semplici. Dopo questi (oltre la scatola rosa) c'è un indirizzo 0xbffff880 . Sto dicendo alla cpu "hey there, ora per favore esegui cosa c'è in 0xbffff880 ". La CPU prende ciò che è sull'indirizzo ed esegue tutti i NOP e lo shellcode stesso. Tuttavia ciò non sta accadendo e SIGSEGV si verifica.

Dove mi sbaglio?

Sto cercando di ottenere questo risultato su un'istanza Virtualbox di Ubuntu 14.04 Linux a 32 bit 3.13.0-39-i686 generico con ASLR disattivato.

    
posta tsusanka 10.11.2014 - 13:10
fonte

1 risposta

22

L'indirizzo di memoria 0xbffff880 è molto probabilmente non eseguibile, ma solo di lettura / scrittura. Ci sono un paio di modi per superarlo.

  1. Se si tratta di un indirizzo stack, puoi utilizzare -z execstack durante la compilazione. Ciò renderà essenzialmente l'intera memoria dello stack eseguibile.
  2. Per una soluzione più solida, puoi scrivere lo shellcode per chiamare mprotect sull'indirizzo in cui stai scrivendo.

Ad esempio, la seguente riga segnerà l'indirizzo 0xbffff880 come read / write / executable.

mprotect((void*) 0xbffff880, buffer_len, PROT_READ | PROT_WRITE | PROT_EXEC);

-fno-stack-protector non significa che lo stack sarà eseguibile. Disabilita solo altre funzionalità di sicurezza come canarini o cookie di stack . Se questi valori vengono sovrascritti (con un overflow del buffer) quando vengono controllati, il programma fallirà. Questo non abilita l'esecuzione del tuo buffer.

    
risposta data 10.11.2014 - 14:53
fonte

Leggi altre domande sui tag