/ / buffer overflow exploit - Perché lo shellcode viene inserito prima dell'indirizzo di ritorno - c, security, x86, buffer-overflow, exploit

exploit di overflow del buffer - Perché lo shellcode viene inserito prima dell'indirizzo di ritorno - c, security, x86, buffer-overflow, exploit

Il codice su cui sto parlando si trova qui: Link al codice

Ho letto che l'exploit di overflow del buffer utilizza un buffer simile a questo:

| NOP SLED | SHELLCODE | INDIRIZZO DEL RESO RIPETUTO |

Da quello che ho capito l'exploit succede quandoil buffer viene inserito nello stack come parametro di funzione e sovrascrive l'indirizzo di ritorno della funzione. Capisco anche che l'indirizzo di ritorno ripetuto punta alla slitta NOP nello stesso buffer nello stack.

Quello che non capisco sono i seguenti:

  1. Perché l'indirizzo di ritorno deve puntare alshellcode nello stesso buffer? Perché non gli indirizzi di ritorno recuperati puntano a un'altra parte della memoria in cui è possibile trovare la slitta NOP e lo shellcode?

  2. In che modo l'indirizzo di ritorno sul buffer è perfettamente allineato con quello originale, quindi il comando "ret" leggerà l'indirizzo corretto e non lo leggerà dal centro, ad esempio.

risposte:

3 per risposta № 1
  1. L'indirizzo di ritorno non deve puntare al codicenello stesso buffer, è spesso più facile farlo in questo modo. Se è possibile inserire il codice shell e restituire l'indirizzo nello stesso buffer, questo è il più semplice. Se il buffer che può essere sovraccaricato è troppo piccolo per adattarsi al codice della shell, è possibile inserire il codice della shell in un altro buffer e quindi saltare a quello quando il buffer vulnerabile viene sovraccaricato.

    Inoltre, protezioni come prevenzione di esecuzione dei dati o (NX) impedisce l'esecuzione di codice da uno stack. In questo caso, tecniche come Programmazione orientata al ritorno può essere usato per aggirare il DEP. Questa tecnica prevede l'utilizzo di segmenti di codice legittimi e eseguibili per eseguire il codice che l'utente malintenzionato desidera eseguire.

  2. Questo può essere complicato e potrebbe richiedere un po 'di giocherellare con il carico utile. Generalmente l'inizio di un buffer è a un indirizzo che è word allineati. In questo caso, assicurarsi che l'indirizzo di ritorno sia allineato correttamente significa scrivere un buffer che è un multiplo della parola CPU (4 byte per macchine a 32 bit, 8 byte per 64 bit). Se il buffer non è allineato alla parola, un utente malintenzionato può semplicemente sperimentare aggiungendo o rimuovendo byte alla volta fino a quando non lo ritiene.

La ragione per cui è più semplice fare tutto in unoil buffer è perché non cambierà molto tra l'iniezione del codice della shell e il salto verso l'indirizzo di ritorno appena modificato. Al punto di attacco, è molto improbabile che un utente malintenzionato possa fare riferimento alla memoria di un altro processo, quindi è necessario esaminare i buffer in corso.

Mettere il codice shell in un buffer diversorichiede che l'attaccante capisca per quanto tempo rimarrà sul posto il buffer. Le chiamate a funzioni diverse fanno sì che uno dei buffer sia deallocato? Uno dei buffer nell'heap invece dello stack? Fintanto che il tuo buffer singolo è abbastanza grande, è molto più semplice mettere la tua slitta NOP e il codice shell vicino all'inizio e poi riempire il resto con l'indirizzo di ritorno. Rispetto alla ricerca di un buffer da compilare con codice shell e un altro da compilare con l'indirizzo del buffer precedente. Alcuni codici shell possono anche fare riferimento a puntatore dello stack il che significa che deve essere impostato correttamente.