5 października 2010 13:01
Zarys problemu
Języki takie jak C i C++ pozwalają o dowolnie manipulować wskaźnikiem do pamięci, o nie sprawdzają poprawności odwołania do pamięci.
Używanie tablicy jest równie niebezpieczne, bo nazwa tablicy jest wskaźnikiem.
Niewłaściwe posługiwanie się wskaźnikiem może zostać wykorzytane do przeprowadzenia ataku za pomocą o przepełnienia bufora na stosie (ang. stack buffer oyerflow), o przepełnienia bufora na stercie (ang. heap buffer oyerflow), o dyndającego wskaźnika (ang. dangling pointer), o dzikiego wskaźnika (ang. wild pointer).
Problem jest znany od lat 60.
Tego typu ataki są nadal stosowane.
Przepełnienie bufora na stosie
Umożliwia agresorowi: o unieruchomienie aplikacji, o wykonanie dowolnej funkcji w aplikacji, o wstawienie i wykonanie złośliwego kodu.
stos rośnie w górę, adresy maleją w dół
w praktyce często Saved Frame pointer i argumenty są zamienione miejscami niebezpieczne funkcje: o strcpy o gets
o strcat, strncpy, strncat, strlen, memcpym, printf, fprintf, sprintf, scanf, operator»
void bad_function(void) { char buf f [4] ;
printf ("Stos przed: \n7.0161x\n7.0161x\n7.0161x"
\n7.0161x\n7.0161x\n7.0161x\n7,0161x " "\n7o0161x\n7.0161x\n7.0161x\n\n"); gets(buff);
printf ("Stos po: \n7,0161x\n7.0161x\n7.0161x" "\n7.0161x\n7.0161x\n7.0161x\n7.0161x"
"\n%0161x\n'/,0161x\n7,0161x\n\n"); printf ("Jestem bezpieczny, bufor zawiera: 7.s\n", buff);
}