Co to jest przepełnienie bufora? Praktyczne wyjaśnienie
Dowiedz się, jak przepełnienia bufora rzeczywiście działają na rzeczywistym przykładzie C, diagramie stosu i narzędziach, które pozwolą ci to zobaczyć na własne oczy.
Przepełnienie bufora następuje, gdy program zapisuje więcej danych do obszaru pamięci o stałym rozmiarze, niż ten obszar może pomieścić. Dodatkowe bajty wyciekają do sąsiedniej pamięci, a w zależności od tego, co znajduje się obok tego bufora, możesz uszkodzić zmienne, spowodować awarię programu lub całkowicie przejąć przepływ wykonania. To jedna z najstarszych klas błędów w bezpieczeństwie oprogramowania i wciąż pojawia się w CTF, CVE i firmware'u osadzonym dzisiaj.
Wzorzec podatny na atak
Oto klasyczny przykład w 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 kopiuje każdy ciąg znaków, który mu przekażesz, do buffer, bez sprawdzania granic. Jeśli argv[1] jest dłuższy niż 64 bajty, kopia ciąży się dalej poza koniec tablicy. Na stosie buffer siedzi poniżej innych zmiennych lokalnych, zapisanych rejestrów i ostatecznie adresu powrotu, który mówi CPU, dokąd przeskoczyć po zakończeniu greet(). Jeśli nadpiszesz ten adres powrotu adresem, którym się steruje, kontrolujesz, co uruchomi się następnie.
Dlaczego to wciąż się kompiluje i uruchamia
C i C++ nie przeprowadzają automatycznego sprawdzania granic dla surowych tablic. Funkcje takie jak strcpy, gets, sprintf i strcat chętnie piszą poza koniec bufora, ponieważ dbają tylko o zakończenie znakiem null lub długość źródła, a nie rzeczywisty rozmiar miejsca docelowego. Porównaj to z strncpy lub snprintf, które przyjmują jawny argument rozmiaru i tam się zatrzymują. Podatność nie jest naprawdę
Napisane z pomocą AI, zweryfikowane i opublikowane przez Michal Pilch (CISSP), Korra Studio.
To jedna notatka z bazy wiedzy Korra Studio — platforma łączy każdy temat z mentoringiem 1 na 1.
Zacznij za darmoarrow_forward