Kurs programowania w C cz. 118

Nasza ocena:

5
Wyświetleń: 553
Komentarze: 0
Notatek.pl

Pobierz ten dokument za darmo

Podgląd dokumentu
Kurs programowania w C  cz. 118 - strona 1

Fragment notatki:

BEZPIECZEŃSTWO KODU A ŁAŃCUCHY 135 $ ./a.out niepoprawne Podales bledne haslo. $ ./a.out poprawne Witaj, wprowadziles poprawne haslo. Jednak okazuje się, że z powodu użycia funkcji strcpy włamywacz nie musi znać hasła, aby program uznał, że zna hasło, np.: $ ./a.out 11111111111111111111111111111111 Witaj, wprowadziles poprawne haslo. Co się stało? Podaliśmy ciąg jedynek dłuższy niż miejsce przewidziane na hasło. Funkcja strcpy() kopiując znaki z  argv1  do tablicy (bufora) haslo przekroczyła przewidziane dla niego miejsce i szła dalej — gdzie znajdowała się zmienna haslo poprawne. strcpy() kopio- wała znaki już tam, gdzie znajdowały się inne dane — między innymi wpisała jedynkę do haslo poprawne. Podany przykład może się różnie zachowywać w zależności od kompilatora, jakim zo- stał skompilowany, i systemu, na jakim działa, ale ogólnie mamy do czynienia z poważnym niebezpieczeństwem. Taką sytuację nazywamy  przepełnieniem bufora.  Może umożliwić dostęp do kompute- ra osobom nieuprzywilejowanym. Należy wystrzegać się tego typu konstrukcji, a w miejsce niebezpiecznej funkcji strcpy stosować bardziej bezpieczną  strncpy. Oto bezpieczna wersja poprzedniego programu: #include  #include  #include  int main(int argc, char **argv) { char haslo_poprawne = 0; char haslo[16]; if (argc!=2) { fprintf(stderr, "uzycie: %s haslo", argv[0]); return EXIT_FAILURE; } strncpy(haslo, argv[1], sizeof haslo - 1); haslo[sizeof haslo - 1] = 0; if (!strcmp(haslo, "poprawne")) { haslo_poprawne = 1; } if (!haslo_poprawne) { fputs("Podales bledne haslo.\n", stderr); return EXIT_FAILURE; } puts("Witaj, wprowadziles poprawne haslo."); return EXIT_SUCCESS; } ... zobacz całą notatkę



Komentarze użytkowników (0)

Zaloguj się, aby dodać komentarz