Esempio di bufferoverflow su Linux a 64 bit

0

Sto cercando di conoscere i buffer overflow. Ho scritto un semplice programma C che chiama una funzione chiamata checkpw() che alloca un array di caratteri di 10 byte di grandi dimensioni. Quando analizzo il codice operativo vedo che in realtà alloca 16 byte nello stack.

Il mio obiettivo era quello di sovraccaricare quel buffer e scrivere sopra l'indirizzo del puntatore di ritorno, che ho eseguito con successo. L'ho indicato un po 'più in basso nel buffer dove ho il codice shell, dove la prima istruzione è xor eax,eax .

Durante lo smontaggio di GDB posso si singolo passaggio attraverso i codici op correttamente finché lo strappo (puntatore di istruzioni) punta esattamente dove voglio che punti (0x00007fffffffde40).

Vedo persino => quando esamino quella posizione di memoria con x/i 0x00007fffffffde40 che visualizza quindi il codice op xor eax,eax .

Il problema è che non appena mi impegno con l'istruzione successiva con si ottengo un SEGFAULT.

Quando ho compilato il programma, ho fatto in modo di includere l'impostazione -fno-stack-protector dell'interruttore e ho anche eseguito echo 0 > /proc/sys/kernel/randomize_va_space

Oltre a questo, sono bloccato. Perché sto ricevendo un SEGFAULT invece di eseguire lo xor?

    
posta Matthew 04.01.2018 - 20:37
fonte

1 risposta

1

Stai utilizzando protezione della memoria , in particolare NX bit . Nei sistemi moderni, la memoria viene tipicamente contrassegnata come data (e quindi può essere letta e scritta) o come codice (e quindi può essere letta ed eseguita). Se si tenta di scrivere in un'area di codice o di eseguire un'area dati, verrà attivato un SEGFAULT.

    
risposta data 04.01.2018 - 22:26
fonte

Leggi altre domande sui tag