Przepełnienie bufora: Różnice pomiędzy wersjami

[wersja nieprzejrzana][wersja przejrzana]
Usunięta treść Dodana treść
drobne redakcyjne
drobne redakcyjne
Linia 1:
 
{{dopracować|styl}}
{{Spis treści}}
'''Przepełnienie bufora''' ({{ang.|buffer overflow}}) – [[bug (programowanie)|błąd programistyczny]] polegający na zapisaniu do wyznaczonego obszaru pamięci ([[Bufor (programowanie)|bufor]]a) większej ilości danych niż zarezerwował na ten cel programista. Taka sytuacja prowadzi do zamazania danych znajdujących się w pamięci bezpośrednio za buforem, a w rezultacie do błędnego działania programu. Gdy dane, które wpisywane są do bufora, podlegają kontroli osoby o potencjalnie wrogich intencjach, może dojść do nadpisania struktur kontrolnych programu w taki sposób, by zaczął on wykonywać operacje określone przez atakującego.
 
Przyczyną powstawania takich błędów jest najczęściej brak odpowiedniej wiedzy lub należytej staranności ze strony autora oprogramowania.
 
== Szczegóły techniczne ==
Ze względu na sposób budowy [[Stos_Stos (informatyka)|stosu]], na większości platform teleinformatycznych, za podręcznymi buforami danej funkcji często znajduje się adres powrotny funkcji nadrzędnej, odłożony na stos przez wywołanie instrukcji procesora ''call''. Po nadpisaniu wartości na stosie odpowiednio dobranym adresem wskazującym na specjalnie spreparowany [[shellcode|kod]], program po zakończeniu aktualnie wykonywanej funkcji zamiast powrócić do funkcji nadrzędnej, wykonuje specjalnie przygotowany przez [[haker (bezpieczeństwo komputerowe)|hakera]] kod.
 
Także w przypadku, gdy bezpośrednie nadpisanie adresu powrotnego nie jest możliwe (np. ze względu na to, że podatny na atak bufor znajduje się w oddzielnym regionie pamięci), ataki typu ''buffer overflow'' mogą prowadzić do przejęcia kontroli nad systemem przez nadpisanie istotnych parametrów wykorzystywanych przez program lub biblioteki standardowe.
 
== Przykład w działaniu ==
 
:''(Poniższe rozważania wymagają znajomości [[C (język programowania)|języka C]] oraz [[asembler]]a.)
 
Spróbujmy zaatakować bardzo prosty program, który sprawdza hasło podane w linii poleceń.
Załóżmy, że nie znamy hasła i nie mamy możliwości wyciągnięcia go z pliku binarnego.
Nie znamy też dokładnego kodu źródłowego, ale ponieważ program jest prosty i wiemy, co robi, mamymożemy mniej więcej pojęcieokreślić, jak on wygląda.
 
<tt>hello.c</tt>:
Linia 51 ⟶ 54:
 
Dziura polega na tym, że <tt>buf</tt> ma stałą wielkość i nie sprawdza się długości danych, które do niego kopiujemy.
Najpierw musimy sprawdzić, czy w ogóle występuje taka dziura i jeśli tak, to ile danych potrzeba, żeby przepełnić bufor.
 
<tt>./exploit1.c</tt>: