Cos'è un buffer overflow?

8

Sto imparando C in un tutorial e ho raggiunto il punto in cui il termine "buffer" viene citato regolarmente.

Ha anche menzionato il fatto che alcune cattive pratiche di programmazione che coinvolgono la memoria possono essere "vulnerabili al buffer overflow". Definisce il buffer come:

A small amount of memory reserved for the input source

e sebbene abbia sentito parlare di attacchi di overflow del buffer in relazione al malware, non ho mai capito cosa sia o in che modo funzioni , in particolare dal punto di vista della programmazione.

Idealmente, questo potrebbe essere spiegato in termini di "laici", dato che ho pochissima conoscenza della teoria dei computer.

    
posta Confuseduser 25.06.2013 - 08:22
fonte

5 risposte

9

Un buffer è un'area di memoria pre-allocata in cui si memorizzano i dati durante l'elaborazione. Fondamentalmente è solo dicendo che da un certo indirizzo in memoria fino a quando l'indirizzo di memoria + x Bytes è riservato per allocare i dati. In C questo è spesso chiamato array .

Un buffer overflow si verifica quando si assegnano più dati di quanti possano essere contenuti nel buffer e si sovrascriva il codice oltre all'indirizzo di memoria + x. Potresti averlo fatto prima e noterai che il tuo programma si blocca. Ora il problema è che da qualche parte oltre il tuo buffer è l'indirizzo di ritorno (questo sta puntando alla prossima istruzione che verrà eseguita dopo aver assegnato il buffer e caricando i dati in esso) e se lo sovrascrivi con dati casuali il tuo programma andrà in crash. Tuttavia se riesci a caricare il codice byte (questo è un programma compilato che la CPU può eseguire direttamente) e puoi effettivamente farlo puntare al tuo programma, allora puoi eseguire il codice su quella macchina.

Ora si potrebbe pensare che questo non sia davvero un problema se lo si esegue localmente, ma si immagini programmi come SSH o server FTP che girano su Internet o si immagina un ambiente ristretto in cui alcuni programmi vengono eseguiti con privilegi elevati. Se sei stato in grado di eseguire codice all'interno del contesto e dei privilegi dell'altro programma, potresti essere in grado di uscire dalle tue restrizioni o prendere il controllo di un server remoto.

Se vuoi saperne di più su assembly, bufferoverflow e shellcode, ti suggerisco di acquistare il Manuale di Shellcoder. È THE per imparare questa roba.

    
risposta data 25.06.2013 - 10:39
fonte
0

Come hai scritto un buffer s una piccola quantità di memoria (ad esempio 16 byte). Quando ora scrivo più byte nel buffer (ad esempio 20 byte) rispetto alla sua capacità, questo viene chiamato buffer overflow.

Se i dati nel buffer provengono dall'esterno, questo è un difetto di sicurezza dato che i nuovi byte sono scritti in un'area di memoria che viene utilizzata per altri scopi.

Quando l'altro scopo dei byte sovrascritti era quello di contenere il codice del programma, immagina cosa succede allora.

    
risposta data 25.06.2013 - 08:31
fonte
0

In C, i buffer overflow si verificano più comunemente quando i dati copiati in un array (buffer) superano le dimensioni definite. Questo lo spiega perfettamente. Basta leggere il codice C lì se non si ha familiarità con l'assembly

    
risposta data 25.06.2013 - 08:51
fonte
0

Per comprendere meglio l'overflow del buffer, posso suggerire questo sito . Contiene una spiegazione estremamente chiara, ma non spiega come sfruttare la strana situazione che si verifica dopo l'overflow. Nonostante ciò, il seguente sito spiega meglio.

Prima di leggere le guide, si prega di prestare attenzione a queste poche indicazioni: La memoria è divisa in segmenti e ogni segmento è diviso in voci situate a un certo offset all'interno dello stesso segmento: ogni elemento del segmento è accessibile alla posizione iniziale (offset) più l'allocazione di memoria per ogni tipo di oggetto (quanti byte sono necessari per allocare l'oggetto nel segmento di memoria), quindi è necessario essere consapevoli di ciò che significa "errore di segmentazione" e non uscire MAI dai limiti nelle tecniche di programmazione.

La seconda guida utilizza due tipi di sistema operativo: Linux e Windows; La dualità è estremamente importante, perché vedrai che l'offset del puntatore delle istruzioni ( 0x7c9d30d7 ) viene scritto in ordine inverso nella codifica degli exploit ( buff = 'x90'*230+'xd7x30x9dx7c'+'x43'*366 ). L'obiettivo è un server FTP che è vulnerabile allo stack overflow, ma il concetto dietro le quinte è lo stesso in caso di scrittura ed esecuzione di un piccolo script C con input da tastiera, come proposto. Alla fine della guida, l'attaccante ascolta sulla porta TCP 443 su host Linux e riceve un prompt della shell (l'exploit in reverse shell) da un host Windows (il server FTP vulnerabile).

A causa di queste guide, dovresti capire la frase che ho scritto: "Fai fare al software qualcos'altro che è stato originariamente programmato con i dati di input" Come consiglio, posso suggerirti di iniziare sulla prima guida, poi passare al secondo e tornare al primo, solo per capire i passaggi forse oscuri.

Secondo una prospettiva hacker, XSS, RFI o anche SQL sono tutti di scarso interesse; Il linguaggio SQL, ad esempio, è utile per recuperare (o modificare dati) da un database utilizzando la logica booleana.

Quando è necessario ottenere informazioni su tabelle, colonne e record, si passano le condizioni al motore SQL come parametri; Questi parametri vengono confrontati con la logica di AND, OR, NOT.

Immaginate di aggiungere (iniettare) un nuovo parametro (la sintassi deve essere corretta) a un'istruzione SQL predefinita, in cui la condizione risultante è sempre vera rispetto a quella originale limitata; In tal modo, puoi bypassare la restrizione. È tutto, estremamente semplice, non sono necessarie tecniche o abilità di hacking.

A proposito, un exploit come NSA EternalBlue (e derivati) è molto apprezzato, perché sovrascrive parte del processo di autenticazione (challenge-response), si collega alle risorse senza password specificata e inietta un nuovo codice usando un canale di comunicazione interprocesso nascosto su SMBv1 macchine Windows senza patch.

    
risposta data 09.01.2019 - 16:39
fonte
-1

Immagina di dover allocare memoria dal byte nella posizione A al byte nella posizione B.

Immagina anche di avere qualche altra informazione nella posizione C che è vicino alla posizione B o alla posizione A, ma non sovrascrive lo spazio di memoria assegnato da A a B.

Ora, ogni operazione di input / output eseguita da una posizione di memoria in un'altra posizione di memoria (memoria dinamica o statica), deve essere recuperata, verificata, eseguita e inclusa in un elenco di altre operazioni sequenziali che vengono chiamate "un programma "(Il puntatore di istruzioni (IP) indica la posizione della nuova operazione di tale elenco da eseguire in memoria)

Immagina di scrivere fuori limite la memoria pre-allocata, utilizzando una o più istruzioni nel linguaggio assembly (o utilizzando più dati in input come previsto in runtime) e sovrascrive la parte di memoria in cui risiede IP con una nuova allocazione memoria in un nuovo mini-programma (un altro mini elenco di altre operazioni sequenziali) nel programma principale: in poche parole, hai preso il controllo del programma principale.

Questo è il concetto alla base di hacking o cracking: fare in modo che il software faccia qualcos'altro che era stato originariamente programmato con i dati di input.

    
risposta data 07.01.2019 - 17:43
fonte

Leggi altre domande sui tag