Opis
Nowoczesne złośliwe oprogramowanie coraz częściej zaciemnia swój kod i uniemożliwia analizę przez co potrzebujemy coraz wymyślniejszych metod, aby podnieść tę ciemną kurtynę wiedzy. Może pomóc w tym analiza binarna, której celem jest ustalenie prawdziwych własności programów binarnych, aby zrozumieć, co naprawdę robią. Inżynieria wsteczna i deasemblacja, stanowią kluczowe, pierwsze kroki, jednak zakres analizy binarnej jest znacznie większy i pozostaje jeszcze wiele do nauczenia. Ten praktyczny przewodnik napisany dla inżynierów bezpieczeństwa i hakerów porusza fascynujące tematy związane z analizą i instrumentacją binarną. Zalecana jest praktyczna znajomość C / C++ oraz asemblera x86-64 (Dodatek A książki wprowadza w błyskawiczny kurs asemblera x86). Po zapoznaniu się z podstawowymi pojęciami i formatami, przeanalizujesz pliki binarne przy użyciu takich technik jak np. deasemblacja czy wstrzykiwanie kodu oraz poznasz narzędzia do analizy binarnej GNU / Linux. Następnie zaimplementujesz narzędzia do profilowania za pomocą Pin, zbudujesz własne narzędzia do dynamicznej analizy taint z libdft i nie tylko. Nauczysz się: • Analizować pliki binarne ELF i PE i tworzyć program ładujący pliki binarne przy użyciu libbfd • Modyfikować pliki binarne ELF za pomocą takich metod jak wstrzykiwanie kodu i edycja heksadecymalna • Budować dostosowane narzędzia do deasemblacji za pomocą Capstone • Używać instrumentacji binarnej, aby obejść popularne sztuczki anty-analityczne • Stosować analizę taint, aby wykryć atak przejęcia przepływu sterowania i wycieki informacji • Używać wykonywania symbolicznego, aby zbudować automatyczne narzędzia do eksploitacji Ćwiczenia zawarte na końcu każdego rozdziału pomagają przejść od zrozumienia podstaw do wykonywania zaawansowanych analiz binarnych i instrumentacji. Praktyczna analiza plików binarnych pomoże Ci osiągnąć biegłość na poziomie eksperckim. Spis treściSŁOWO WSTĘPNE XVII PRZEDMOWA XXI PODZIĘKOWANIA XXIII WSTĘP 1 Czym jest analiza binarna i dlaczego jej potrzebujesz? 2 Dlaczego analiza binarna stanowi wyzwanie? 3 Kto powinien przeczytać tę książkę? 4 Co jest w tej książce? 4 Jak korzystać z tej książki? 6 Model programowy procesora 6 Składnia asemblera 6 Format binarny i platforma systemowa 7 Przykładowy kod i maszyna wirtualna 7 CZĘŚĆ I FORMATY BINARNE 9 1. ANATOMIA PLIKU BINARNEGO 11 1.1. Proces kompilacji 12 1.1.1. Faza preprocesowania 12 1.1.2. Faza kompilacji 14 1.1.3. Faza asemblacji 16 1.1.4. Faza konsolidacji (linkowania) 16 1.2. Symbole i okrojone pliki binarne 18 1.2.1. Podgląd symboli w pliku 18 1.2.2. Kolejny plik binarny przechodzi na ciemną stronę: „okrajanie” pliku 20 1.3. Deasemblacja pliku binarnego 20 1.3.1. Zaglądanie do wnętrza pliku obiektowego 20 1.3.2. Badamy kompletny wykonywalny plik binarny 22 1.4. Ładowanie i wykonywanie pliku binarnego 26 1.5. Podsumowanie 28 2. FORMAT ELF 29 2.1. Nagłówek pliku 31 2.1.1. Tablica e_ident 31 2.1.2. Pola e_type, e_machine i e_version 33 2.1.3. Pole e_entry 33 2.1.4. Pola e_phoff i e_shoff 34 2.1.5. Pole e_flags 34 2.1.6. Pole e_ehsize 34 2.1.7. Pole e_*entsize i e_*num 34 2.1.8. Pole e_shstrndx 35 2.2. Nagłówki sekcji 35 2.2.1. Pole sh_name 36 2.2.2. Pole sh_type 37 2.2.3. Pole sh_flags 37 2.2.4. Pola sh_addr, sh_offset oraz sh_size 38 2.2.5. Pole sh_link 38 2.2.6. Pole sh_info 38 2.2.7. Pole sh_addralign 38 2.2.8. Pole sh_entsize 38 2.3. Sekcje 38 2.3.1. Sekcje .init i .fini 40 2.3.2. Sekcja .text 40 2.3.3. Sekcje .bss, .data i .rodata 41 2.3.4. Wiązanie leniwe symboli i sekcje .plt, .got oraz .got.plt 42 2.3.5. Sekcje .rel.* i .rela.* 45 2.3.6. Sekcja .dynamic 46 2.3.7. Sekcje .init_array i .fini_array 48 2.3.8. Sekcje .shstrtab, .symtab, .strttab, .dynsym i .dynstr 48 2.4. Nagłówki programów 49 2.4.1. Pole p_type 50 2.4.2. Pole p_flags 51 2.4.3. Pola p_offset, p_vaddr, p_paddr, p_filesz i p_memsz 51 2.4.4. Pole p_align 51 2.5. Podsumowanie 52 3. FORMAT PE: KRÓTKIE WPROWADZENIE 53 3.1. Nagłówek MS-DOS i stub MS-DOS 54 3.2. Sygnatura, nagłówek i nagłówek opcjonalny pliku PE 54 3.2.1. Sygnatura pliku PE 57 3.2.2. Nagłówek pliku PE 57 3.2.3. Nagłówek opcjonalny pliku PE 58 3.3. Tablica nagłówków sekcji 58 3.4. Sekcje 59 3.4.1. Sekcje .edata i .idata 59 3.4.2. Wyrównywanie w sekcjach kodu PE 60 3.5. Podsumowanie 61 4. TWORZENIE PROGRAMU ŁADUJĄCEGO PLIKI BINARNE PRZY UŻYCIU LIBBFD 63 4.1. Czym jest libbfd? 64 4.2. Prosty interfejs do ładowania plików binarnych 64 4.2.1. Klasa Binary 67 4.2.2. Klasa Section 67 4.2.3. Klasa Symbol 67 4.3. Implementacja loadera plików binarnych 67 4.3.1. Inicjalizacja libbfd i otwieranie pliku binarnego 69 4.3.2. Parsowanie podstawowych właściwości pliku binarnego 71 4.3.3. Ładowanie symboli 73 4.3.4. Ładowanie sekcji 76 4.4. Testowanie loadera binarnego 78 4.5. Podsumowanie 81 CZĘŚĆ II PODSTAWY ANALIZY BINARNEJ 83 5. PODSTAWOWA ANALIZA BINARNA W LINUKSIE 85 5.1. Rozwiązywanie kryzysów tożsamości przy użyciu file 86 5.2. Użycie ldd do badania zależności 89 5.3. Oglądanie zawartości pliku w xxd 9