2009-03-20 13 views
19

W jaki sposób przeprowadza się ataki przepełnienia sterty?ataki przepełnienia sterty

W przypadku ataków stackoverflow atakujący zastępuje adres powrotu funkcji swoim adresem.

Jak to się dzieje w przypadku ataków przepełnienia sterty? Czy możliwe jest uruchomienie kodu ze sterty?

Odpowiedz

32

Uwaga ta różni się w zależności od platformy, a mój przykład jest nadmiernie uproszczony. Zasadniczo sprowadza się do menedżerów sterty mających połączone listy, które mogą zostać przekroczone, i możesz użyć połączonych ze sobą wskaźników listy, aby nadpisać losowe części pamięci procesu.

Wyobraźmy mam naiwną implementację stosu, którego kontrola bloki są tak:

struct HeapBlockHeader 
{ 
    HeapBlockHeader* next; 
    HeapBlockHeader* prev; 
    int size; 

    // Actual heap buffer follows this structure. 
}; 

Gdy kupa zostaje uwolniony, to blok sterujący wraca do listy uwolnionych bloków, modyfikując Next/Prev wskaźnik . Jeśli przekroczę bufor sterty, mogę zastąpić wskaźniki w następnym bloku kontrolnym danymi, które kontroluję. Załóżmy, że nadpisuję te łącza, aby wskazywały na wskaźnik kodu (prawdopodobnie właśnie w buforze, który przejąłem) i na adres zwrotny funkcji na stosie. Kiedy menedżer sterty próbuje połączyć blok z powrotem na listę zwolnioną, to faktycznie nadpisze adres powrotu na stosie wskaźnikiem do kodu, który kontroluję.

Ten artykuł ma ładny przegląd atakami przepełnienia sterty: http://www.h-online.com/security/features/A-Heap-of-Risk-747161.html

W tym artykule opisano niektóre z hartowania, że ​​poszedł do kierownika sterty Vista, aby zapobiec tego rodzaju ataku: http://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

EDIT: Na możliwość uruchomienia kodu ze sterty, tak, to możliwe. Wiele platform teraz domyślnie czyni pamięć sterty niewykonywalną, co zwiększa barierę dla uruchomienia dowolnego kodu. Jednak nadal możesz wykonać atak typu "jump to libc" - Zastąp adres powrotny znaną funkcją, która będzie wykonywalna.

+0

Świetna odpowiedź - Czuję, że wiem dużo o moich konkretnych obszarach programowania, ale nigdy nie byłem w stanie zagłębić się w kompilatory, zarządzanie pamięcią, mechanizmy ochronne - wiedząc, gdzie kończy się odpowiedzialność procesora i start systemu operacyjnego. Potem znowu między OS a kodem aplikacji. Przeczytałem okładkę podręcznika intel x86 (vol 1) na okładkę. Jak przyszedłeś, aby się tego nauczyć? –