In che modo i grassi indicatori sono una buona protezione?

16

Sto imparando i buffer overflow, e ho l'idea del fat pointer, ma quello che non capisco è come sono una buona protezione? Se sei stato in grado di modificare il puntatore in modo che punti ad un altro indirizzo, non saresti in grado di modificare la base obj e la sezione obj end del fat pointer in modo che il puntatore sembri ancora valido?

    
posta Pixel 03.04.2017 - 16:54
fonte

2 risposte

38

Gli overflow del buffer non riguardano l'impostazione del puntatore per puntare a un altro indirizzo arbitrario.

Un overflow del buffer si verifica quando un input fa sì che il programma esegua un'operazione apparentemente corretta ( es. " increment() : sposta il puntatore in avanti di 256 byte" ) troppe volte, in modo che il puntatore si sposta fuori dalla struttura / matrice dati previste e in un altro oggetto.

Un "fat pointer" contiene informazioni sulla struttura dei dati / dimensioni dell'array.  Ciò significa che increment() può avere controlli di sicurezza nel suo codice, per assicurarsi che il puntatore si trovi entro i limiti appropriati. Hai ancora bisogno di controlli di sicurezza da qualche parte nel tuo codice, ma questo ti consente di centralizzarlo.

    
risposta data 03.04.2017 - 17:52
fonte
3

Sembra che tu pensi al tipo di bufferoverflow che di solito accade sull'heap. In genere, i blocchi di memoria allocati vengono memorizzati come elementi, con i metadati, che includono i puntatori all'elemento successivo e precedente, in elenchi doppiamente collegati. In teoria, traboccando il buffer si sarebbe in grado di sovrascrivere i metadati del prossimo chunk di memoria e se quello è liberato si potrebbe essere in grado di sovrascrivere un puntatore a funzione, che porta all'esecuzione di codice arbitrario. Per maggiori informazioni sullo sfruttamento vedi questo sito web

Gli indicatori di grasso potrebbero proteggerti da questo: controllando semplicemente ogni operazione sull'array come leggere o scrivere nella posizione, internamente viene controllato un controllo dei limiti, se l'offset / indice dato è valido, e se e solo se viene superato il controllo dei limiti, l'operazione verrà eseguita. (Come già detto @cloudfeet.) Ciò significa che non sarai in grado di scrivere dopo i limiti della tua memoria e quindi non potrai sovrascrivere cose come i metadati del prossimo pezzo di memoria o un puntatore in pila.

    
risposta data 03.04.2017 - 19:29
fonte

Leggi altre domande sui tag