Ce este o depășire de buffer? O ghidare practică
Înveți cum funcționează de fapt depășirile de buffer cu un exemplu real în C, o diagramă a stivei și instrumentele pentru a o vedea în acțiune.
O depășire de buffer se produce când un program scrie mai multă date într-un bloc de memorie cu dimensiune fixă decât poate ține acel bloc. Octeții suplimentari se varsă în memoria adiacentă, și în funcție de ce se află lângă acel buffer, poți corupta variabile, bloca programul sau prelua complet fluxul de execuție. Este una dintre cele mai vechi clase de bug din securitatea software-ului și apare în continuare în CTF-uri, CVE-uri și firmware-ul embedded astazi.
Modelul vulnerabil
Iată un exemplu clasic în 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 copiază orice șir îi treci în buffer, fără verificare a limitelor. Dacă argv[1] este mai lung de 64 de octeți, copierea continuă după sfârșitul matricei. Pe stivă, buffer se află sub alte variabile locale, registre salvate și în final adresa de întoarcere care spune CPU-ului unde să sară după ce se termină greet(). Suprascrie acea adresă de întoarcere cu o adresă pe care o controlezi, și controlezi ce se execută în continuare.
De ce aceasta se compilează și se execută în continuare
C și C++ nu fac verificare automată a limitelor pe matrici brute. Funcții cum ar fi strcpy, gets, sprintf și strcat vor scrie cu plăcere după sfârșitul unui buffer pentru că le pasă doar un terminator nul sau o lungime a sursei, nu dimensiunea reală a destinației. Compară asta cu strncpy sau snprintf, care iau un argument explicit de dimensiune și se opresc acolo. Vulnerabilitatea nu este cu adevărat
Scris cu asistență AI, revizuit și publicat de Michal Pilch (CISSP), Korra Studio.
Aceasta este o notă din baza de cunoștințe Korra Studio — platforma asociază fiecare subiect cu mentorat 1-la-1.
Început gratuitarrow_forward