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



Podobne dokumenty
Programowanie w asemblerze Środowiska 64-bitowe

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

Programowanie w asemblerze Środowiska 64-bitowe

Return-oriented exploiting

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

Programowanie Niskopoziomowe

Architektura komputerów

Architektura komputerów

Programowanie Niskopoziomowe

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

Programowanie Niskopoziomowe

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

Przepełnienie bufora i łańcuchy formatujace

Programowanie na poziomie sprzętu. Tryb chroniony cz. 1

002 Opcode Strony projektu:

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

Mikroinformatyka. Wielozadaniowość

PROGRAMOWANIE NISKOPOZIOMOWE

Bezpieczeństwo jądra Windows, lub jak zabić system dwoma instrukcjami. Mateusz "j00ru" Jurczyk SEConference 2013 Kraków

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

Adam Kotynia, Łukasz Kowalczyk

Praktyczne spojrzenie na luki bezpieczeństwa jądra Windows

Kompilator języka C na procesor 8051 RC51 implementacja

Programowanie niskopoziomowe

Podatnoś ci aplikacji deśktopowych

Ćwiczenie nr 6. Programowanie mieszane

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

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

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

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

WOJSKOWA AKADEMIA TECHNICZNA

CSAW CTF Qualification Round 2015 Rhinoxorus

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

Przegląd dostępnych hypervisorów. Jakub Wojtasz IT Solutions Architect

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

Procesory rodziny x86. Dariusz Chaberski

Organizacja typowego mikroprocesora

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

Materiały do wykładu. 7.Architekturax86. Marcin Peczarski. Instytut Informatyki Uniwersytet Warszawski

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

Metody Realizacji Języków Programowania

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

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

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.

Architektura komputerów

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

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

Język ludzki kod maszynowy

Architektura komputerów. Asembler procesorów rodziny x86

Assembler w C++ Syntaksa AT&T oraz Intela

Reverse Engineerging. Dawid Zarzycki

Inżynieria wsteczna oraz znajdowanie i wykorzystywanie luk w aplikacjach natywnych na architekturach x86 i x86-64

A Study of Java`s Non-Java Memory. Remigiusz Mytyk

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

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

Schematy zarzadzania pamięcia

Architektura komputerów

Mikroinformatyka. Mechanizmy ochrony pamięci

Sprzętowe wspomaganie pamięci wirtualnej

OBRONA. Przepełnienie bufora. Na łamach hakin9 bardzo często

Buffer Overflow (art. 2) by h07

Architektura systemów komputerowych. Lista instrukcji procesora

Architektura komputerów

Microsoft IT Academy kurs programowania

Architektura komputerów

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

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Tryb rzeczywisty to tryb pracy mikroprocesorów z rodziny procesorów x86, w którym procesor pracuje tak jak procesor Intel 8086.

Mikroinformatyka. Tryb wirtualny

Układ sterowania, magistrale i organizacja pamięci. Dariusz Chaberski

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

Architektura Systemów Komputerowych

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Ćwiczenie 3. Konwersja liczb binarnych

PMiK Programowanie Mikrokontrolera 8051

Struktury. Przykład W8_1

CPU architektura i rejestry

Offensive software security - fakty, mity i przemyślenia

Programowanie w asemblerze Aspekty bezpieczeństwa


Sprzęt i architektura komputerów

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

Wstęp do Reverse engineeringu

Podstawy programowania w języku C++

Zarządzanie zasobami pamięci

Programowanie. Ćwiczenie Język C. Środowisko programowania Visual Studio

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

Programowanie na poziomie sprzętu. Programowanie w Windows API

czyli tu, tam, i z powrotem

Infekowanie plików EXE PE amdfanatyk

Programowanie niskopoziomowe

Protokół komunikacyjny sondy cyfrowej CS-26/RS-485 (lub RS-232)

organizacja procesora 8086

U M L. System operacyjny Linux zagnieżdżony w zewnętrznym systemie operacyjnym (Linux)

3 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK SP.06 Rok akad. 2011/ / 22

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

Czym jest DLL Injection

Sprzęt i architektura komputerów

Spis treści. Wstęp 15

Transkrypt:

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

O mnie Reverse engineer @ Hispasec Vulnerability researcher Vexillium (http://vexillium.org) Autor bloga http://j00ru.vexillium.org/ 2

O czym dzisiaj x86-64 z czym mamy do czynienia? Podstawowe zmiany architektury Exploitacja user-mode Obsługa wyjątków a x64 DEP, ASLR ROP Różności Pytania 3

SŁÓW KILKA O X86-64 4

x86-64 o czym mowa Nowa architektura procesorów Rozszerzenie starszych, 32-bitowych procesorów x86 Zapewniona wsteczna kompatybilnośd (tryby real, protected, long) Podstawowa jednostka danych: 64 bity / 8 bajtów 5

x86-64 o czym mowa Od kilku lat produkowane na szeroką skalę Lata 2001 2003: pierwsze 64-bitowe procesory Intela i AMD wchodzą na rynek Najpopularniejsze systemy operacyjne są portowane na platformę x64 W tym Windows poczynając od Windows XP / 2003 (NT 5.2) 6

x86-64 dobry cel badao? Młoda architektura, nie zawsze poprawnie rozumiana przez developerów Błędy powstałe w toku portowania aplikacji Jądro Windows działające wyłącznie w 64-bit Kernel to bardzo dobry cel Aplikacje codziennej exploitacji użytku przenoszone na nową platformę 7

X86-64 dobry cel badao? x64-specific vulnerabilities CVE-2007-4573: Linux kernel IA32 System Call Emulation Vulnerability CVE-2009-0029: Linux Kernel 64 Bit ABI System Call Parameter Privilege Escalation Vulnerability CVE-2010-0010: Apache 1.3 mod_proxy HTTP Chunked Encoding Integer Overflow Vulnerability Maaaaaasa innych błędów 8

x86-64 dobry cel badao? Możliwośd omijania mechanizmów charakterystycznych dla x64 Driver Signing Enforcement a słynny pagefile attack (Joanna Rutkowska, 2006) Zabawy z PatchGuard (Uninformed 3, 6, 8) 9

x86-64 dobry cel badao? 64-bity to przyszłośd 10

X86 A X86-64 ZMIANY ARCHITEKTURALNE 11

Podstawowe zmiany architektury Rozszerzenie rozmiaru istniejących rejestrów bazowych EAX (32) RAX(64) EFLAGS(32) RFLAGS(64) EIP(32) RIP(64) RAX EAX AX AH AL 12

Zmiany architektury Nowe stare rejestry BPL, SPL, SIL, DIL RBP EBP BP BPL RSI ESI SI SIL 13

Podstawowe zmiany architektury Wprowadzenie ośmiu nowych rejestrów bazowych R8 R15 R8 R8D R8W? R8B R15 R15D R15W? R15B 14

Podstawowe zmiany architektury Adresowanie pamięci wirtualnej Teoretycznie: 2 64 bajtów adresowalnej pamięci (16 eksabajtów) Praktycznie: wykorzystuje się dolne 48 bitów (256 terabajtów) Pozostała częśd to sign-extend właściwego adresu 15

Podstawowe zmiany architektury Adresowanie pamięci wirtualnej tryb chroniony (32bit) 0x00000000 Ciągły model pamięci Przestrzeo użytkownika niskie obszary (2GB) Przestrzeo jądra wysokie obszary (2GB) User-mode Kernel-Mode 0x7FFFFFFF 0x80000000 0xFFFFFFFF 16

Podstawowe zmiany architektury Adresowanie pamięci wirtualnej long mode (64-bit) Kanoniczny zapis adresów 6 młodszych bajtów (48 bitów) przeznaczone dla efektywnego adresu Pozostała częśd musi byd równa najstarszemu bitowi (address 47 ) 17

Podstawowe zmiany architektury Adresowanie pamięci wirtualnej long mode 1111111111111111 1 00000000000010010000000001101011101100000000000 16 bitów dopełnienia 48 bitów - właściwy adres wirtualny Przykładowy adres trybu jądra 0000000000000000 0 111111110000010000111000010100101100010101010000 16 bitów dopełnienia 48 bitów - właściwy adres wirtualny Przykładowy adres trybu użytkownika 18

Podstawowe zmiany architektury Adresowanie pamięci wirtualnej long mode 0010100100000101 1 00000000000010010000000001101011101100000000000 Błędny zapis adresu wirtualnego 19

Podstawowe zmiany architektury Adresowanie pamięci wirtualnej long mode Niskie obszary pamięci (poprawne) 00000000 00000000 00007FFF FFFFFFFF Obszar nieadresowalny kanonicznie Wysokie obszary pamięci (poprawne) FFFF8000 000000000 FFFFFFFF FFFFFFFFF Podział przestrzeni pamięci adresowalnej, w trybie 64-bit 20

Podstawowe zmiany architektury Możliwośd odwoływania się do rejestru RIP (wskaźnik instrukcji) Wcześniej wyłącznie pośrednio; głównie przy użyciu instrukcji CALL 21

Podstawowe zmiany architektury Przykład pobranie adresu aktualnie wykonywanej instrukcji call @f @@: pop eax EAX EIP (x86) RAX RIP (x86-64) lea rax, [rel 0] 22

Podstawowe zmiany architektury Przykład pobranie adresu ciągu tekstowego, znajdującego się w dowolnym miejscu w pamięci EAX string address (x86) RAX string address (x86-64) jmp @1 @2: pop eax @1: call @2 db exemplary text,0 lea rax, [rel text_label] text_label: db exemplary text,0 23

Zmiany architektury Rejestry segmentowe CS, SS, ES, DS Ø FS, GS TIB, KPCR 24

USER-MODE EXPLOITATION 25

Przepełnienia stosu pamiętamy, co to? 26

Przepełnienia stosowe pamiętamy, co to? zmienne lokalne (1) char buf[16] zmienne lokalne (2) Ramka SEH void func(char* str) { int a,b; char buf[16]; try { Ramka stosu ret-addr Argumenty funkcji 27

Przepełnienia stosowe pamiętamy, co to? zmienne lokalne (1) char buf[16] zmienne lokalne (2) Ramka SEH void func(char* str) { int a,b; char buf[16]; try { strcpy(buf,str); Ramka stosu ret-addr Argumenty funkcji 28

Przepełnienia stosowe pamiętamy, co to? zmienne lokalne (1) char buf[16] zmienne lokalne (2) Ramka SEH void func(char* str) { int a,b; char buf[16]; try { strcpy(buf,str); Ramka stosu ret-addr Argumenty funkcji 29

Przepełnienia stosowe pamiętamy, co to? zmienne lokalne (1) char buf[16] zmienne lokalne (2) Ramka SEH void func(char* str) { int a,b; char buf[16]; try { strcpy(buf,str); Ramka stosu ret-addr Argumenty funkcji 30

Możliwości wykonania payloadu zmienne lokalne (1) char buf[16] zmienne lokalne (2) Ramka SEH 1. Adres powrotu funkcji (ret-addr) Wykonywanie przenoszone do payload u w momencie wykonania instrukcji RET Ramka stosu ret-addr Argumenty funkcji 31

Możliwości wykonania payloadu zmienne lokalne (1) char buf[16] zmienne lokalne (2) Ramka SEH 1. Adres powrotu funkcji (ret-addr) 2. Ramka obsługi wyjątków (SEH) Wykonywanie przenoszone do payload u w momencie zaistnienia wyjątku w obrębie aktualnego wątku Ramka stosu ret-addr Argumenty funkcji 32

Możliwości wykonania payloadu zmienne lokalne (1) char buf[16] zmienne lokalne (2) Ramka SEH Ramka stosu ret-addr Argumenty funkcji 1. Adres powrotu funkcji (ret-addr) 2. Ramka obsługi wyjątków (SEH) 3. Potencjalnie wskaźniki znajdujące się wśród lokalnych zmiennych Wykonywanie przenoszone do payload u w momencie wywołania nadpisanego wskaźnika 33

Możliwości wykonania payloadu zmienne lokalne (1) char buf[16] zmienne lokalne (2) Ramka SEH 1. Adres powrotu funkcji (ret-addr) 2. Ramka obsługi wyjątków (SEH) 3. Potencjalnie wskaźniki znajdujące się wśród lokalnych zmiennych 4. Potencjalnie wskaźniki wśród argumentów funkcji Ramka stosu ret-addr Argumenty funkcji 34

Zabezpieczenia? 35

Zabezpieczenia Nadpisanie adresu powrotu Ochrona stosu /GS cookie protection stosowana przez kompilatory Microsoft Inne odmiany kanarków (ProPolice, itd.) 36

zmienne lokalne (1) char buf[16] zmienne lokalne (2) Ramka SEH Kanarek Ramka stosu ret-addr Argumenty funkcji 37

Zabezpieczenia Nadpisanie zmiennej lokalnej wskaźnika funkcji Stack re-ordering układ zmiennych, uniemożliwiający nadpisanie wrażliwych wartości (wskaźników) 38

Stack re-ordering - przykład int a; char buf[32]; float b; void (*pfunc)(); char tmp[8]; int d; Standardowe układ stosu dla zmiennych lokalnych int a; int d; float b; void (*pfunc)(); char buf[32]; char tmp[8]; Układ stosu po zmianie położenia wrażliwych zmiennych i buforów 39

Zabezpieczenia Nadpisanie argumentów funkcji, będących wskaźnikami Kopiowanie wartości wszystkich argumentów funkcji na stos, przed niebezpiecznymi buforami 40

A co z SEH? Również kontrowane przez rozmaite zabezpieczenia SafeSEH SEHOP 41

A co z SEH? Exploity wciąż korzystają z obsługi wyjątków SnackAmp 3.1.3B Malicious SMP Buffer Overflow Vulnerability (SEH) MP3 Workstation Version 9.2.1.1.2 SEH exploit (MSF) AoA Audio Extractor Remote ActiveX SEH JIT Spray Exploit (ASLR+DEP Bypass) Wiele innych 42

Obsługa wyjątków a x86-64 Brak mechanizmu SEH Statyczna lista handlerów Znajduje się w nagłówkach pliku PE32+ Rozszerzalne za pomocą API: RtlAddFunctionTable, RtlInstallFunctionTableCallback 43

Wnioski? trudniej 44

ALSR Klasyczne zabezpieczenie przeciwko ROP Obecny na systemach od Windows Vista wzwyż Obrazy wykonywalne muszą mied ustawioną flagę kompatybilności (w trakcie kompilacji) Internet Explorer działa w trybie randomizacji adresów od wersji 8 45

Układ pamięci wirtualnej procesu wczoraj a.exe 0x00400000 0x00400000 a.exe Internal.dll 0x00600000 0x00600000 Internal.dll msvcrt.dll 0x75C70000 0x75C70000 msvcrt.dll kernel32.dll 0x76E10000 0x76E10000 kernel32.dll ntdll.dll 0x773B0000 0x773B0000 ntdll.dll System A System B 46

Układ pamięci wirtualnej procesu dziś a.exe 0x00400000 0x00400000 a.exe Internal.dll 0x00600000 msvcrt.dll 0x75C70000 0x00700000 Internal.dll kernel32.dll 0x76E10000 ntdll.dll 0x773B0000 System A 0x75F70000 msvcrt.dll 0x77000000 kernel32.dll 0x774F0000 ntdll.dll System B 47

Omijanie ASLR Wyciek adresu Memory spraying (heap spraying, JIT spraying) Odszukanie niekompatybilnego modułu 48

DEP Ochrona niewykonywalnych obszarów pamięci Domyślnie włączony dla wszystkich 64-bitowych aplikacji Działa również w trybie jądra gdzie wszystkie moduły są 64-bitowe 49

Omijanie DEP Najczęściej Return-Oriented Programming Rzadziej JIT spraying (nowa technika) 50

ROP? 51

ROP (Return-Oriented Programming) Znane od kilkunastu(dziesięciu?) lat Wcześniej pod nazwą ret2anything (libc) Lub recykling kodu Szczególnie użyteczne po wprowadzeniu DEP (Data Execution Prevention) 52

ROP na czym to polega? Wcześniej: uruchamiamy payload, umieszczony w pamięci (np. na stosie) Obecnie: uruchamiamy payload, korzystając z gadżetów 53

WTF Gadżety??? Gadżet: krótki kod maszynowy, zakooczony instrukcją skoku (najczęściej powrotu) 0x0C0C0C0C: POP EAX 0x0C0C0C0D: POP EBX 0x0C0C0C0E: POP ECX 0x0C0C0C0F: LEAVE 0x0C0C0C10: RET Przykład gadżetu 54

Komponowanie payloadu, poprzez tworzenie ciągu gadżetów, składającego się w poprawny shellcode 55

Wystarczy, żeby zaalokowad pamięd wykonywalną i skopiowad tam pozostałą częśd payloadu Jedno ale potrzebna znajomośd adresów obrazów wykonywalnych 56

ASLR FTW 57

Różnice pomiędzy x86 a x64 ROP 1. Konwencja wywołao WINAPI 32-bit: STDCALL Wszystkie argumenty kładzione na stos Wartośd zwracana = EAX Funkcja wywoływana przywraca stan stosu 58

Różnice pomiędzy x86 a x64 ROP 1. Konwencja wywołao WINAPI 64-bit: ~FASTCALL Pierwsze cztery argumenty w RCX, RDX, R8, R9; kolejne na stosie Rezerwacja miejsca na stosie, dla argumentów przekazanych przez rejestry 59

Wnioski? trudniej 60

Przykład: wywołanie funkcji MessageBoxA, z kontrolowanymi argumentami 61

32-bit: 0x76C3D681 0x00000000 0x0C0C0C0C 0x0D0D0D0D 0x00000040... user32.messageboxa HWND hwnd Pwned!, LPCTSTR lptext Title, LPCTSTR lpcaption UINT utype ESP EIP 0x756858ce: ret 62

64-bit: RSP RIP 0x756858ce: ret 0x00000000`75BA1083 0x00000000`76E1122D 0x00000000`0C0C0C0C 0x00000000`773BA12E 0x00000000`0D0D0D0D 0x00000000`00000040 0x00000000`76C3D681 0x20 * \0... XOR RCX, RCX RET POP RDX RET Pwned!, LPCTSTR lptext POP R8 POP R9 RET Title, LPCTSTR lpcaption UINT utype user32.messageboxa Stack padding 63

ROP a kanoniczny zapis adresów wirtualnych 0000000000000000 0 111111110000010000111000010100101100010101010000 16 bitów dopełnienia 48 bitów - właściwy adres wirtualny W każdym adresie trybu użytkownika pojawiają się dwa zera Terminator dla ciągów tekstowych ANSI i UNICODE Problem w przypadku tekstowego przepełnienia na stosie 64

PRZEMYŚLENIA RÓŻNE 65

Random stuff Większy rozmiar wskaźników większe struktury wewnętrzne (nagłówki sterty itd.) HEAP_ENTRY POOL_ENTRY 66

Random stuff DWORD * DWORD Integer Overflow anymore 67

Random stuff Błędne założenia dot. rozmiaru typów SIZE_T Wskaźniki SIZE_T values[10]; memset(values,0,4*10); 68

Random stuff Klasa błędów Integer Wrap QWORD value = 0x12345678AB; użycie (DWORD)value utrata górnych bitów, możliwy buffer overflow 69

x64 exploitation tools Windbg + 64-bit guest VMWare VirtualBox WinAppDbg MOSDEF x64 IDA64, IDAPython64 70

PODSUMOWANIE 71

Podsumowując x86-64 architekturą przyszłości Niezbyt dobrze zbadana First rootkit targeting 64-bit Windows spotted in the wild Posted on 27.08.2010 WHAT? Otwiera spore możliwości 72

Podsumowując Poczekajmy na nowe, charakterystyczne dla x64 klasy błędów CVE-2009-2847: Linux Kernel <= 2.6.31-rc5 sigtalstack 4- Byte Stack Disclosure (padding attack) 73

Pytania Dziękuję za uwagę! Q & A E-mail: j00ru.vx@gmail.com Blog: http://j00ru.vexillium.org/ Twitter: http://twitter.com/j00ru 74