Che cos'è un buffer overflow? Una guida pratica
Scopri come funzionano davvero i buffer overflow con un esempio C reale, un diagramma dello stack e gli strumenti per vederlo accadere di persona.
Un buffer overflow accade quando un programma scrive più dati in un blocco di memoria di dimensioni fisse di quanto quel blocco può contenere. I byte extra straripano nella memoria adiacente, e a seconda di cosa si trova accanto a quel buffer, puoi corrompere variabili, mandare in crash il programma, o dirottare completamente il flusso di esecuzione. È una delle classi di bug più vecchie nella sicurezza software e continua a comparire in CTF, CVE e firmware embedded ancora oggi.
Il pattern vulnerabile
Ecco un esempio classico in C:
#include <string.h>
void greet(char *name) {
char buffer[64];
strcpy(buffer, name);
}
int main(int argc, char **argv) {
greet(argv[1]);
return 0;
}
strcpy copia qualsiasi stringa che passi in buffer, senza controllo dei limiti. Se argv[1] è più lungo di 64 byte, la copia continua oltre la fine dell'array. Nello stack, buffer si trova sotto altre variabili locali, registri salvati, e infine l'indirizzo di ritorno che dice alla CPU dove saltare dopo che greet() finisce. Sovrascrivi quell'indirizzo di ritorno con un indirizzo che controlli, e controlli cosa viene eseguito dopo.
Perché questo ancora compila ed esegue
C e C++ non fanno controllo automatico dei limiti su array grezzi. Funzioni come strcpy, gets, sprintf, e strcat scriveranno felicemente oltre la fine di un buffer perché si preoccupano solo di un terminatore null o di una lunghezza di origine, non della dimensione effettiva della destinazione. Confronta con strncpy o snprintf, che prendono un argomento di dimensione esplicito e si fermano lì. La vulnerabilità non è davvero
Scritto con assistenza AI, revisionato e pubblicato da Michal Pilch (CISSP), Korra Studio.
Questa è una nota dalla knowledge base di Korra Studio — la piattaforma abbina ogni argomento a mentoring 1-to-1.
Inizia gratisarrow_forward