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

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

Programowanie niskopoziomowe

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

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

Adam Kotynia, Łukasz Kowalczyk

Programowanie Niskopoziomowe

002 Opcode Strony projektu:

Architektura komputerów

PROGRAMOWANIE NISKOPOZIOMOWE

Ćwiczenie nr 6. Programowanie mieszane

Przepełnienie bufora i łańcuchy formatujace

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

Programowanie niskopoziomowe

Optymalizacja szelkodów w Linuksie

Architektura komputerów

ZASADY PROGRAMOWANIA KOMPUTERÓW

Programowanie Niskopoziomowe

Spis treści. Wskazówki prawne Art Art Art. 268a Art Art. 269a Art. 269b... 23

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Wirusy w systemie Linux. Konrad Olczak

Buffer Overflow (art. 2) by h07

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.

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Bezpieczeństwo systemów komputerowych

Systemy operacyjne. Wprowadzenie. Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Procesy pojęcia podstawowe. 1.1 Jak kod źródłowy przekształca się w proces


Komputery przemysłowe i systemy wbudowane

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

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

UNIX: architektura i implementacja mechanizmów bezpieczeństwa. Wojciech A. Koszek dunstan@freebsd.czest.pl Krajowy Fundusz na Rzecz Dzieci

organizacja procesora 8086

Assembler w C++ Syntaksa AT&T oraz Intela

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

Tworzenie oprogramowania

Programowanie Niskopoziomowe

Codecave jest to nieużywana pamięć uruchomionej aplikacji, do której można wstrzyknąć dowolny kod a następnie wykonać go.

Kompilator języka C na procesor 8051 RC51 implementacja

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

CPU. Architektura FLAGS Bit: dr Paweł Kowalczyk; DPTNS, KFCS UŁ. SI 16 bit. 16 bit. 16 bit.

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

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

Wstęp do programowania

PMiK Programowanie Mikrokontrolera 8051

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Systemy wbudowane. Przykłady kodu Assembler

Architektura komputerów

Programowanie w asemblerze Środowiska 64-bitowe

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

Programowanie w asemblerze Środowiska 64-bitowe

Programowanie w asemblerze Uruchamianie programów

Architektura Systemów Komputerowych

Programowanie Niskopoziomowe

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

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

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

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

KURS C/C++ WYKŁAD 6. Wskaźniki

Optymalizacja wykonania programów sekwencyjnych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Język programowania: Lista instrukcji (IL Instruction List)

Wskaźniki w C. Anna Gogolińska

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie w asemblerze Wprowadzenie

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Systemy operacyjne. wykład dr Marcin Czarnota laboratorium mgr Radosław Maj

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Programowanie w asemblerze Aspekty bezpieczeństwa

Utworzenie pliku. Dowiesz się:

Wprowadzenie do architektury komputerów. Model programowy procesora i jego struktura Procesory CISC i RISC

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Ćwiczenie 3. Konwersja liczb binarnych

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

x86 vs x64 architektura procesora a exploitacja w systemie Windows Mateusz j00ru Jurczyk SecDay, Wrocław 2010

Podstawy programowania

Architektura komputerów

Podstawy programowania w języku C++

Dokumentacja techniczna API systemu SimPay.pl

Podstawy Informatyki Języki programowania c.d.

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Programowanie hybrydowe łączenie C/C++ z asemblerem

Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych

Organizacja typowego mikroprocesora

Historia modeli programowania

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Struktury systemów operacyjnych

Return-oriented exploiting

Procesory rodziny x86. Dariusz Chaberski

Programowanie w asemblerze Linkowanie

Metody Realizacji Języków Programowania

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Prezentacja systemu RTLinux

Buffer Overflow w Windows, symulacja włamania do systemu z wykorzystaniem błędu usługi sieciowej. by h07 (h07@interia.pl)

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

dr inż. Konrad Sobolewski Politechnika Warszawska Informatyka 1

Podstawy Techniki Mikroprocesorowej

Transkrypt:

Exploity w praktyce

Plan prelekcji Powtórka assembly x86 32. Pamięć uruchamianych programów. Prosty stack overflow exploit. Tworzenie shellcode i jego uruchomienie. Wstrzykiwanie shellcode wykorzystując stack overflow. Inne błędy umożliwaiające exploitowanie. Jak sytuacja wygląda dzisiaj. Analiza oprogramowania zamkniętego oraz otwartego. Techniki i narzędzia.

Cel wykładu Przedstawienie działania exploitów u podstaw na przykładzie stack overflow. Nie będziemy wykorzystywać gotowych rozwiązań aby wyexploitować istniejące aplikacje (tu odsyłam do http://www.metasploit.com/ oraz http://www.exploit db.com/)

Po co? Zabezpieczyć się przed zagrożeniem możemy tylko poprzez wcześniejsze poznanie zagrożenia. Ponadto jest to świetny sposób na zrozumienie niskopoziomowego działania programów.

Założenia oraz informacje wstępne Architektura Intel x86 32 bit Kali Linux 32 Bit (następca BackTrack) Assembly oraz C Kompilator tcc (brak stack canaries w kompilowanych programach w przeciwieństwie do gcc) execstack s

Powtórka Assembly x86 32

Assembly Language Język asemblera jest bezpośrednio zależny od architektury procesora. Polecenia są bezpośrednio tłumaczone do języka maszynowego. Umożliwia bezpośredni dostęp do rejestrów procesora Przykład:

Rejestry procesora EAX Accumulator (akumulator jego pamięć wykorzystuje arytmometr; używa się go do przechowywania wyników wielu operacji) EBX Base Register (rejestr bazowy służy do adresowania) ECX Counter Register (rejestr licznikowy służy jako licznik w pętli) EDX Data Register (rejestr danych umożliwia przekaz/odbiór danych z portów wejścia/wyjścia) ESP Stack Pointer (przechowuje wskaźnik wierzchołka stosu) EBP Base Pointer (rejestr bazowy służy do adresowania) ESI Source Index (rejestr źródłowy trzyma źródło łańcucha danych) EDI Destination Index (rejestr przeznaczenia przetrzymuje informacje o miejscu docelowym łańcucha danych) Source: http://pl.wikipedia.org/wiki/asembler_x86

Podstawowe instrukcje mov eax 4 int 0x80 xor ebx, ebx push 0x67ff3f2a cmd db '/bin/sh/',0x0

Wywołania systemowe Wywołania systemowe? open, read, write, exit, fork, execve,. Lista numerów wywołań systemowych: /usr/include/i386 linux gnu/asm/unistd_32.h eax numer wywołania systemowego ebx, ecx, edx parametry wywołania systemowego int 0x80 wywołanie przerwania informującego jądro o chęci wykonania wywowłania systemowego

Pamięć uruchamianych programów

Kernel/user mode Kernel mode pełny dostęp do pamięci oraz sprzętu User mode dostęp tylko do pamięci własnej programu (brak dostępu do pamięci innych programów, dostęp do sprzętu pośrednio poprzez wywołania systemowe udostępnione przez jądro)

Pamięć uruchamianego programu Code Segment (.text) kod programu Data Segment (.data) Data zmienne globalne i statyczne zainicjalizowane BSS zmienne globalne i statyczne niezainicjalizowane Heap malloc() Stack zmienne lokalne oraz kontrola wykonywania programu

Pamięć uruchamianego programu

Co się dzieje gdy wywołujemy funkcję?

Prosty stack overflow exploit

A jeśli zrobimy to samo używając gcc z flagą fstack protector all?

Tworzenie shellcode i jego uruchomienie

Prosty program w Assembly

Shellcode ma kilka wymagań Należy pozbyć się wszystkich bajtów 0x00 oraz 0x0a (new line). NULL byte oraz New Line byte kończą kopiowanie danych w funkcjach operujących na stringach. Nie możemy korzystać z sekcji.data mamy dostęp tylko do stosu przechowującego zmienne lokalne. Instrukcje x86 są zmiennej długości, zgadywanie, w którym miejscu w pamięci powinna zacząć się kolejna instrukcja nie jest dobrym rozwiązaniem. Lepsze rozwiązanie? Instrukcja NOP (0x90)

Spełnione wymagania shellcode:

Kilka przydatnych poleceń nasm f elf shellcode.asm objdump d disassembler options=intel shellcode.o ld o shellcode shellcode.o for i in $(objdump d shellcode.o M intel grep "^ " cut f2); do echo n '\x'$i; done; echo perl e 'print ''\x90''x10' >payload xxd g 1 payload xxd i payload

Jak uruchomić shellcode bezpośrednio z kodu w C?

Wstrzykiwanie shellcode wykorzystując stack overflow

Przygotowanie payload'u NOP NOP NOP SHELLCODE XXXX RETURN_ADDR

Inne błędy umożliwiające exploitowanie. Jak sytuacja wygląda dzisiaj?

Jeszcze raz: stack overflow? Dzisiaj już prawie niespotykany. łatwy do wykrycia pozytywne nawyki programistyczne np. strncpy() zamiast strcpy() zabezpieczenia wprowadzone na poziomie bibliotek: np. strcpy_s() jako bezpieczniejsza wersja strcpy() zabezpieczenia wprowadzone na poziomie kompilatora Nonexecutable stack

Heap overflow Zupełnie inne podejście (heap overflow jest zależny od implementacji alokatora pamięci (malloc), podczas gdy stack overflow zależy od implemetacji stosu powiązanego ściśle z architekturą systemu). Exploitacja polega na nadpisywaniu struktur wewnętrznych alokatora pamięci. Znacznie trudniejszy do wyexploitowania.

Format strings

Format strings Formatki stringów mogą być wykorzystane do nadpisania dowolnych 4 bajtów (np. adres powrotu?) Niestety (?) te podatności wyginęły poprzez wprowadzenie zabezpieczeń w bibliotekach.

Interger overflow Jaki jest tu problem? Co się stanie jeśli pierwszym argumentem będzie 4 294 967 295 (największa wartość uint32)?

Signedness Jaki jest tu problem? Co się stanie jeśli pierwszym argumentem będzie 1?

Podsumowanie integer overflow oraz signedness Integer overflow oraz konwersje signed/unsinged są jednymi z częstszych błędów jednak są trudne do wykrycia i wyexploitowania.

Analiza oprogramowania z zamkniętym oraz otwartym kodem źródłowym techniki i narzędzia

Jeśli jest możliwość wywołania crash'a, jest potencjalne miejsce do wyexploitowania. Zaprezentowane wcześniej podatności zostały specjalnie przygotowane. W realnym świecie takie błędy są bardzo subtelne i trudne do dostrzeżenia.

Zamknięty kod źródłowy Stack fuzzing (wprowadzanie niepoprawnych / nieoczekiwanych / losowych danych w celu wywołania crash'a) np. sharefuzz Analizowanie crash'ów Reverse engineering Binary diffing

Otwarty kod źródłowy Oprócz technik stosowanych przy zamkniętym kodzie źródłowym, wykonywana jest analiza kodu. np. splint analizuje kod C, jednakże automatyczne skanery zazwyczaj znajdują tylko oczywiste błędy ręczna analiza kodu żmudne i monotonne Paradoksalnie łatwiej jest znaleźć błędy w zamkniętym oprogramowaniu ponieważ kod open source jest zazwyczaj przeglądany przez wielu ludzi, tym samym błędy są szybko poprawiane.

Common Vulnerabilities and Exposures (CVE) Listy znanych publicznie podatności w oprogramowaniu: http://nvd.nist.gov/ http://www.osvdb.org/ http://cve.mitre.org/

Co dalej? Prezentacja będzie dostępna pod adresem: http://topu.pl Zapraszam na warsztaty po świętach. (Każdy napisze exploita!) Polecam: http://opensecuritytraining.info/