PRZEPEŁNIENIE BUFORA B u f f e r O v e r f l o w

Slides:



Advertisements
Podobne prezentacje
Tryby adresowania Prawie każda operacja wykonywana przez mikroprocesor wykonywana jest na pewnych argumentach (lub argumencie). Sposoby wskazywania argumentów.
Advertisements

Ćwiczenie (1) Dostosuj poniższy program do potrzeb zdefiniowanych w treści programu zaliczeniowego: #include void dodaj(){}; void edytuj(){}; void usun(){};
Język C/C++ Funkcje.
Programowanie obiektowe
Wzorce.
Język ANSI C Funkcje Wykład: Programowanie komputerów
SQL INJECTION Wykorzystanie błędów w językach skryptowych
Systemy rozproszone W. Bartkiewicz
Języki programowania C++
PROGRAMOWANIE STRUKTURALNE
dynamiczny przydział pamięci
argumenty wiersza poleceń: getopt
formatowanie kodu źródłowego
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Programowanie imperatywne i język C
Modularyzacja i struktury danych w C Copyright, 2005 © Jerzy R. Nawrocki Wprowadzenie.
Modularyzacja i struktury danych w C Copyright, 2005 © Jerzy R. Nawrocki Wprowadzenie.
Programowanie imperatywne i język C Copyright, 2005 © Jerzy R. Nawrocki Wstęp.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Język C – Część II Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie do informatyki.
Tablice.
Wykład nr 2: Struktura systemu komputerowego a system operacyjny
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
Język ANSI C Operacje we/wy
Java – programowanie obiektowe
Zachodniopomorskie Centrum Edukacyjne Zadanie domowe.
Procesy odrębne –Unikatowy PID ( ) –Zmienne –Zbiory deskryptorów plików –Przestrzeń stosu (lokalne zmienne, wywołania funkcji) –Środowisko –Licznik.
Programowanie obiektowe W2
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
prototypy metod i ingerencji w system czynna i bierna ingerencja
Programowanie imperatywne i język C Copyright, 2006 © Jerzy R. Nawrocki Wstęp do.
Błędy implementacji oprogramowania
Podstawy programowania
Podstawy programowania II
Podstawy informatyki 2013/2014
Podstawy programowania. Język C i C++– podstawy Temat: 1
Podstawy programowania w języku C i C++
Kompilator SDCC i Pakiet STRC52 Mgr inż. Aleksander Pruszkowski
Wielozadaniowowść systemu operacyjnego Linux
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Buforowanie D e f i n i c j a.
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Podstawy języka Instrukcje - wprowadzenie
Programowanie strukturalne i obiektowe C++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski 1 informatyka +
Programowanie strukturalne i obiektowe C++
Procesor, pamięć, przerwania, WE/WY, …
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
Modele pamięci Tiny - mikroskopijny do 64 K zmienne inicjalizowane kod programu zmienne nie inicjalizowane HEAP (sterta) obszar wolny STACK (stos) Model.
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Programowanie strukturalne i obiektowe C++ Powtórzenie wiadomości z C++ Robert Nowak.
1 dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! )
1 Uzupełnienie dot. przekazywania argumentów #include struct nowa { int f; char line[20000]; int k; } reprezentant; int main() { void funkcja7( struct.
Procesy, wątki Program a proces Proces: Przestrzeń adresowa, kod, dane, stos (część pamięci do przechowania zmiennych lokalnych i niektórych adresów) Otwarte.
Programowanie imperatywne i język C Copyright, 2007 © Jerzy R. Nawrocki Wstęp do.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Tryby adresowania i formaty rozkazów mikroprocesora
Dokumentacja programu komputerowego i etapy tworzenia programów.
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Grzegorz Cygan Wstęp do programowania mikrosterowników w języku C
Wskaźniki Elżbieta Labocha.
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Format rozkazu Tryby adresowania.
dynamiczny przydział pamięci
Zapis prezentacji:

PRZEPEŁNIENIE BUFORA B u f f e r O v e r f l o w WSIZ „Copernicus” 6 ZINF, Łukasz Rajzer, nr indeksu 1749

B u f f e r O v e r f l o w Wprowadzenie Buffer Overflow – ogólna definicja Struktura pamięci Zasada działania włamującego Przykłady podatnych kodów Wskazówki dla programistów

Bufor programu Program komputerowy składa sie kodu, który korzysta ze zmiennych zapisanych w różnych miejscach pamięci. Podczas wykonywania sie programu zmiennym przydzielana jest pamięć, a jej ilość zależy od rodzaju informacji, które ma przechowywać zmienna. Na przykład dane typu Short Integer zajmują niewiele miejsca w pamięci RAM, natomiast dane Long Integer zajmują go więcej. Istnieją różne rodzaje zmiennych, a każdy rodzaj może potrzebować innej ilości pamięci. Przestrzeń zarezerwowana w pamięci dla zmiennej jest używana do przechowywania informacji niezbędnych do wykonywania sie programu. Program przechowuje w tym obszarze pamięci zawartość zmiennej i w razie potrzeby pobiera ja stamtąd. Ta wirtualna przestrzeń nazywana jest buforem.

Zapowiedź problemu //syslog_test_1_c #include <stdio.h> #include <string.h> int main(int argc, char **argv) { char tab1[6] = "TEKST"; char tab2[12] = "DLUGI TEKST"; printf("\n tab1: %s", tab1); printf("\n tab2: %s", tab2); strcpy(tab2,"TO BEDZIE HAKER ATAK"); return 0; }

B u f f e r O v e r f l o w Definicja ogólna Przepełnienie bufora (ang. Buffer overflow) polega na nieplanowanej przez twórcę ingerencji w bufor programu; podanie większej ilości danych przekraczających tablicę – wydzielony obszar pamięci zostaje nadpisany nadmiarowymi informacjami. Nadpisanie pamięci może nieść skutek zmiany wartości zmiennych, jak i adresu powrotów funkcji. W najgorszym przypadku ataku dane nadmiarowe są nowymi instrukcjami, umożliwiającymi napastnikowi sterowaniem pracą procesora.

Stos po wywołaniu funkcji

Zaatakowany program

Hasło – sam sobie ustalę  //password.c #include <stdio.h> #include <string.h> void check_password(char *pass1, char *pass2){ char buffer1[8]; char buffer2[8]; strcpy(buffer1, pass1); strcpy(buffer2, pass2); printf("buffer1: '%s' buffer2: '%s'\n", buffer1, buffer2); if( strcmp(buffer1, buffer2) == 0 ) printf("password ok\n"); else printf("wrong password\n"); } int main() { char stored_password[8]; char entered_password[8]; strcpy(stored_password,"mypass"); printf("Enter password: "); gets(entered_password); check_password(stored_password, entered_password); printf("Correct password: %s\n", stored_password); return 0;}

* Przepełnienie sterty Sterta (ang. heap) nazywamy obszar pamięci dynamicznie przydzielonej aplikacji w celu przechowywania w niej zmiennych. W ataku przepełnienia sterty haker u siłuje zmienić zawartość takich zmiennych, jak hasła, nazwy plików oraz identyfikatory UID znajdujące się na stercie. Jaka jest różnica miedzy przepełnieniem bufora a przepełnieniem sterty? W przypadku przepełnienia bufora zmiana zawartości adresu powrotu znajdującego się na stosie oznacza próbę wykonania określonych instrukcji maszynowych. W przypadku przepełnienia sterty zmiana zawartości zmiennych dynamicznych oznacza próbę podniesienia poziomu uprawnień w systemie. Programy stosujące przepełnienie sterty wykorzystują błędy formatów oraz atakują funkcje malloc( ) i free( ).

Shellcode Shellcode - anglojęzyczny zlepek słów shell (powłoka) oraz code (kod) oznaczający prosty, niskopoziomowy program odpowiedzialny za wywołanie powłoki systemowej w ostatniej fazie wykorzystywania wielu błędów zabezpieczeń przez exploity.

Zapobieganie przepełnieniom bufora Sprawdzanie wielkości danych przed umieszczeniem ich w buforze. Użycie funkcji ograniczających liczbę i (lub) format wprowadzanych znaków. Unikanie niebezpiecznych funkcji języka C, takich jak scanf( ), strcpy( ), strcat( ), getwd( ), gets( ), strcmp( ), sprintf( ). Bezpieczniejsze: JAVA, .NET. Funkcja systemu operacyjnego DEP (Data Execution Prevention) NX-bit (AMD), XD-bit (Intel) Narzędzia analizujące kod, chroniące stos

Literatura Strażnik bezpieczeństwa danych - Cyrus Peikari, Anton Chuvakin; Hellion 2005 (tyt. oryg. Security Warrior) Buffer Overflow Attacks - Detect, Exploit, Prevent – James C. Foster; Syngress 2005 Problem przepełnienia bufora – Piotr Kubowicz – opracowanie problemu