39011

39011



134


ROZDZIAŁ 18. SA PISY

int main(void) {

char napisl[80] - "hello char *napis2 ■ "world”;

stmcat(napisl, napis2, sizeof napisl - 1); puts(napis1); return 0;

>

Osoby, które programowały w językach skryptowych muszą bardzo uważać na łączenie i kopiowanie napisów. Kompilator języka C nie wykryje nadpisania pamięci za zmienną łańcuchową i nie przydzieli dodatkowego obszaru pamięci. Może się zdarzyć, że program pomimo nadpisywania pamięci za łańcuchem będzie nadal działał, co bardzo utrudni wykrywanie tego typu błędów!


Bezpieczeństwo kodu a łańcuchy

Przepełnienie bufora

O co właściwie chodzi z tymi funkcjami strncpy i stmcat? Otóż, niewinnie wyglądające łańcuchy mogą okazać się zabójcze dla bezpieczeństwa programu, a przez to nawet dla systemu, w którym ten program działa. Może brzmi to strasznie, lecz jest to prawda. Może pojawić się tutaj pytanie: “w jaki sposób łańcuch może zaszkodzić programowi?”. Otóż może i to całkiem łatwo. Przeanalizujmy następujący kod:

ftinclude <stdio.h>

Sinclude <string.h> ftinclude <stdlib.h>

int maindnt argc, char **argv) { char haslo.poprawne = 0; char hasło[16];

if (argc!«2) {

fprintf(stderr, "użycie: ‘/.s hasło", argv[0]>; return EXIT_FAILURE;

>

stropy(hasło, argv[l]>; /* tutaj następuje przepełnienie bufora »/ if (Istrcnp(hasło, "poprawne")) { haslo.poprawne * 1;

>

if (!haslo.poprawne) {

fputs("Podałeś biedne hasło.\n", stderr); return EXIT_FAILURE;

>

putsCWitaj, wprowadziłeś poprawne hasło."); return EXIT_SUCCESS;

>

Jest to bardzo prosty program, który wykonuje jakąś akcję, jeżeli podane jako pierwszy argument hasło jest poprawne. Sprawdźmy czy działa:



Wyszukiwarka

Podobne podstrony:
132 ROZDZIAŁ 18. SA PISY Warto zaznaczyć, że znak nowej linii (’

136 ROZDZIAŁ 18. SA PISY Bezpiecznymi alternatywami do strepy i streat są też funkcje strlcpy oraz s
133 OPERACJE NA ŁAŃCUCHACH int main(void) { char str[100]; int cmp; fputs("Podaj ciąg
image013 W Windows pracują współbieżnie dwa procesy.zablokowany?_ CEvent e; int main(void) { CSingle
int main(void) { double fl = 2 * 3.1415926; double f2 = 3.1415926; printf("%f, %f

cz7 Programowanie Listing 57— wykorzystanie funkcji printf int main(void) l ■int a - 1234; int b
SDC11488 Phk Edytuj Widok Ntrzędai U ft mera a Pomoc°«WM 0 tfincludc <*tdio.h> int main(void){
SDC11625 Typowe błędy ■ Przykład. int main(void){ int x,*p; x = 10; p = x;// błędne przypisanie powi
SDC11641 Ptt Edytuj ^Włok Ntrzędzu Ustawieni! Pomoc°H a W O int main (void){ void wfun(int *a){ int

24 IWZDZ1AL 5. PIERWSZY PROGRAM int main (void) int oznacza, że funkcja zwróci (tzn. przyjmie wartoś

więcej podobnych podstron