Facebook - konwersja
Przeczytaj fragment on-line
Darmowy fragment

Praktyczna analiza plików binarnych - ebook

Format:
EPUB
Data wydania:
1 stycznia 2020
114,00
11400 pkt
punktów Virtualo

Praktyczna analiza plików binarnych - ebook

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.

Kategoria: Informatyka
Zabezpieczenie: Watermark
Watermark
Watermarkowanie polega na znakowaniu plików wewnątrz treści, dzięki czemu możliwe jest rozpoznanie unikatowej licencji transakcyjnej Użytkownika. E-książki zabezpieczone watermarkiem można odczytywać na wszystkich urządzeniach odtwarzających wybrany format (czytniki, tablety, smartfony). Nie ma również ograniczeń liczby licencji oraz istnieje możliwość swobodnego przenoszenia plików między urządzeniami. Pliki z watermarkiem są kompatybilne z popularnymi programami do odczytywania ebooków, jak np. Calibre oraz aplikacjami na urządzenia mobilne na takie platformy jak iOS oraz Android.
ISBN: 978-83-01-21224-7
Rozmiar pliku: 38 MB

FRAGMENT KSIĄŻKI

O Autorze

Dennis Andriesse ma doktorat z zakresu bezpieczeństwa systemów i sieci oraz w swoich badaniach wykorzystuje na co dzień analizę binarną. Jest jednym z głównych współtwórców PathArmor, systemu integralności przepływu kodu, który broni przed atakami opartymi na przejęciu kontroli wykonania, takimi jak Return Oriented Programming (ROP). Andriesse był jednym z twórców ataku zaangażowanych w wyłączenie botneta GameOver Zeus P2P.

O recenzentach technicznych

Thorsten Holz jest profesorem na Wydziale Inżynierii Elektrycznej i Informatyki Technicznej na Uniwersytecie Ruhr w Bochum w Niemczech. Jego zainteresowania badawcze obejmują techniczne aspekty bezpiecznych systemów informatycznych. Obecnie skupia się na inżynierii wstecznej, zautomatyzowanym wykrywaniu słabych punktów i badaniu najnowszych metod ataku.

Tim Vidas jest badaczem bezpieczeństwa. Przez wiele lat Tim szefował zespołowi infrastruktury CGC DARPA, wdrażał innowacje w Dell Secureworks i nadzorował grupę badawczą CERTu Carnegie Mellon University w zakresie informatyki śledczej. Ma doktorat z Carnegie Mellon, wiele plakietek konferencyjnych (niektóre czarne) i liczbę Erdősa-Bacona 4–3. Zazwyczaj Tim po prostu cieszy się z bycia ojcem i mężem.Słowo wstępne

Obecnie możesz znaleźć wiele książek o asemblerach, a jeszcze więcej o formatach plików binarnych ELF i PE. Stosy artykułów o śledzeniu przepływu informacji i wykonywaniu analiz symbolicznych są ogromne. A jednak nie ma nawet jednej książki, by czytelnik mógł przejść od, powiedzmy, zrozumienia podstaw asemblacji do przeprowadzania zaawansowanej analizy plików binarnych. Nie istnieje książka, która pokazuje czytelnikowi, jak instrumentować programy binarne, stosować dynamiczną analizę taint celem śledzenia interesujących nas danych w czasie wykonywania programu lub używać wykonywania symbolicznego dla zautomatyzowanej generacji eksploitów. Innymi słowy, brak książki, która nauczy cię metod, narzędzi i dostarczy wiedzę potrzebną do analizy plików binarnych. Aż do teraz.

Tym, co sprawia, że analiza plików binarnych stanowi wyzwanie, jest to, że wymaga ona zrozumienia różnych kwestii. Tak, musisz wiedzieć coś nie tylko o asemblerach, ale także o formatach plików binarnych, konsolidacji i ładowaniu, analizie statycznej i dynamicznej, systemach pamięci i konwencjach kompilatorów – a to jedynie podstawy. Twoja konkretna analiza zadań instrumentacji może wymagać jeszcze bardziej specjalistycznej wiedzy. Oczywiście, te wszystkie aspekty potrzebują swych własnych narzędzi. Dla wielu ten obszar wygląda na tak onieśmielający, że poddają się, zanim nawet zaczną. Jest tyle do nauczenia się. Gdzie rozpocząć?

Odpowiedź brzmi: tutaj. Ta książka w dobrze ułożony i przystępny sposób zbiera wszystko, co potrzebujesz wiedzieć, by zacząć. Jest to także zabawa! Nawet jeżeli nie masz pojęcia o tym, jak wyglądają programy w kodzie binarnym, jak są ładowane i co się dzieje w trakcie ich wykonywania, ta książka uważnie wprowadza te wszystkie tematy wraz z towarzyszącymi narzędziami, tak, że szybko uczysz się, nie tylko jak one działają w teorii, ale także jak postępować z nimi w prawdziwych sytuacjach. Moim zdaniem jest to jedyna droga do osiągnięcia głębokiego i trwałego zrozumienia.

Nawet jeżeli masz już znaczne doświadczenie w analizowaniu kodu binarnego i jesteś być może magikiem Capstone’a, Radare, IDA Pro czy OllyDbg, zawarto tutaj wiele ciekawych problemów. Zaawansowane metody z dalszych rozdziałów pokażą ci, jak zbudować pewne z najbardziej skomplikowanych narzędzi analizy i instrumentacji, jakie możesz sobie wyobrazić.

Analiza binarna i instrumentacja binarna to fascynujące, lecz wymagające tematy, zwykle do opanowania tylko przez małą grupę ekspertów-hakerów. Wraz z rosnącymi obawami o bezpieczeństwo stają się one coraz ważniejsze. Musimy potrafić analizować złośliwe oprogramowanie, by zrozumieć, co może ono zrobić i jak można je powstrzymać. Jednak w miarę, jak coraz więcej takiego oprogramowania zaciemnia swój kod i stosuje techniki przeciwdziałania analizie, by storpedować nasze wysiłki, potrzebujemy coraz wymyślniejszych metod.

Coraz więcej analizujemy także zwykłego oprogramowania, choćby po to, by istniejące pliki binarne uodpornić na ataki. Na przykład możemy instrumentować istniejące pliki binarne w C++, by mieć pewność, że wszystkie wywołania funkcji (wirtualnych) mogą być tylko do uprawnionych metod. Aby to zrobić, po pierwsze, musimy przeanalizować plik binarny, aby zidentyfikować metody i wywołania funkcji. Po drugie, musimy dodać instrumentację, upewniając się przy tym, że zachowana jest oryginalna semantyka programu. Łatwiej powiedzieć, niż zrobić.

Wielu z nas zaczyna się uczyć tych technik, ponieważ natykamy się na problem, który okazuje się zarazem fascynujący i zbyt skomplikowany jak na nasze umiejętności. Problemem może być cokolwiek – może chcesz przerobić swoją konsolę do gier na komputer do ogólnych zastosowań, złamać jakieś oprogramowanie albo dowiedzieć się, jak naprawdę działa malware, które znalazłeś w swoim komputerze.

Z zażenowaniem wyznaję, że moją motywacją była chęć złamania zabezpieczeń przed kopiowaniem gier wideo, na których kupno nie mogłem sobie pozwolić. A zatem nauczyłem się asemblera i przedzierałem się przez kod binarny, szukając punktów zaczepienia. Działo się to w czasach 6510, 8-bitowego procesora z akumulatorem i dwoma rejestrami ogólnego przeznaczenia. Chociaż wykorzystanie pełnych 64 KB pamięci w tym systemie wymagało wielu dziwacznych, niejasnych rytuałów, sam system był prosty. Jednak na początku wszystko było bez sensu. Wraz z upływem czasu i pomocy ze strony bardziej doświadczonych kolegów rzeczy stopniowo się rozjaśniały. Podróż ta była z pewnością interesująca, ale jednocześnie bolesna, frustrująca i długa. Co ja bym dał za książkę, która poprowadziłaby mnie przez ten proces! Dzisiejsze 64-bitowe procesory x86 są o wiele bardziej złożone niż tamten, tak jak i kompilatory generujące kod binarny. Zrozumienie tego kodu jest teraz trudniejsze niż kiedykolwiek wcześniej. Kiedy masz eksperta, który pokaże ci drogę i rozjaśni rzeczy, które mógłbyś w przeciwnym razie pominąć, twoja podróż będzie krótsza, ciekawsza i, co najważniejsze, weselsza.

Dennis Andriesse jest specjalistą od analizy binarnej ni mniej, ni więcej, z doktoratem z analizy binarnej na potwierdzenie. Jednak nie jest on tylko naukowcem piszącym artykuły dla innych specjalistów. Większość jego pracy jest zakorzeniona w praktyce. Na przykład był on jednym z kilku ludzi na świecie, którzy dokonali inżynierii wstecznej osławionego botneta GameOver Zeus, który spowodował straty szacowane na ponad 100 milionów dolarów. Jeszcze lepiej, był on jednym z garści ekspertów zaangażowanych w ostateczne wyłączenie GameOver Zeus w operacji prowadzonej przez FBI. Pracując ze złośliwym oprogramowaniem, zorientował się w mocnych stronach i słabościach istniejących narzędzi analizy binarnej i wpadł na pomysły ich ulepszenia. Nowe techniki deasemblacji opracowane przez Dennisa znalazły teraz zastosowanie w produktach komercyjnych takich jak Binary Ninja.

Jednak nawet bycie ekspertem nie wystarczy. Aby książka była dobra, autor musi także wiedzieć, jak pisać. Dennisa Andriesse cechuje rzadkie połączenie talentów: to ekspert od analizy binarnej, który potrafi wyjaśnić nawet najbardziej skomplikowane pojęcia w prosty sposób, jednocześnie nie upraszczając. Jego styl jest przyjemny, a przykłady bardzo jasne i objaśniające.

Osobiście, od dłuższego czasu czekałem na taką książkę. Przez lata uczyłem analizy złośliwego oprogramowania na Vrije Universitetit w Amsterdamie, nie używając podręcznika, bo takiego po prostu nie było. Zamiast tego wykorzystywałem dość przypadkowe połączenie źródeł online, tutoriali i eklektycznego zestawu slajdów. Kiedy studenci pytali, dlaczego nie możemy użyć książki (a było tak co roku), mówiłem im, że nie ma dobrego podręcznika poświęconego analizie binarnej, ale jeżeli znajdę czas, może kiedyś taki napiszę. Rzecz jasna, nigdy tego nie zrobiłem.

Oto książka o analizie binarnej, jaką chciałem napisać, ale nigdy nie zdołałem, w dodatku lepsza niż moje ewentualne dzieło.

Miłej podróży.

Herbert BosPrzedmowa

Analiza binarna to jedno z najbardziej fascynujących i ambitnych zagadnień hakowania oraz informatyki.

Jest także jednym z najtrudniejszych do nauczenia się, co w niemałym stopniu wypływa z braku dostępnych na ten temat informacji.

O ile książek dotyczących inżynierii wstecznej i analizy złośliwego oprogramowanie jest pod dostatkiem, o tyle tego samego nie da się powiedzieć o tematyce zaawansowanej analizy binarnej, takiej jak instrumentacja binarna, dynamiczna analiza taint czy wykonywanie symboliczne. Początkujący analityk binarny jest zmuszony wygrzebywać wiadomości z ciemnych zakątków sieci, przestarzałych, a czasem po prostu mylących postów na grupach tematycznych i niejasnych publikacji. Wiele artykułów oraz literatura naukowa dotycząca analizy binarnej zakładają już na wejściu znaczną wiedzę u czytelnika, co sprawia, że uczenie się z tych zasobów przywodzi na myśl problem „jajko czy kura”. Co gorsza, wiele narzędzi analitycznych i bibliotek ma niekompletną dokumentację albo wręcz nie ma żadnej.

Mam nadzieję, że dzięki tej książce dziedzina analizy binarnej stanie się łatwiej dostępna przez dostarczenie spójnego źródła wprowadzającego cię we wszystkie istotne zagadnienia w prosty i praktyczny sposób. Po lekturze będziesz dobrze przygotowany, by zrozumieć szybko zmieniający się świat analizy binarnej i wyruszyć tam na własną rękę.Podziękowania

Po pierwsze, chcę podziękować mojej żonie Noortje i memu synowi Sietse za wspieranie mnie podczas pisania tej książki. Był to niewiarygodnie pracowity okres, ale zawsze byliście gotowi pomóc.

Chcę także złożyć podziękowania tym wszystkich w No Starch Press, którzy pomogli, by ta książka ujrzała światło dzienne, zwłaszcza Billowi Pollockowi i Tylerowi Ortmanowi za danie szansy na stworzenie tej książki oraz innym osobom, a byli to: Annie Choi, Riley Hoffman i Kim Wimpsett, za ich wielki wkład w redakcję i wydanie jej drukiem. Dziękuję także moim recenzentom naukowym, Thorstenowi Holzowi i Timowi Vidasowi, za ich szczegółowe uwagi, które pomogły w ulepszeniu tej książki.

Dziękuję Benowi Grasowi za jego pomoc w uruchomieniu libdft na nowym Ubuntu, Jonathanowi Salwanowi za uwagi do rozdziałów o wykonywaniu symbolicznym, a ponadto Lorenzo Cavallaro, Erikowi van der Kouwe i innym twórcom pierwotnych slajdów, na których oparty został dodatek o asemblerze.

W końcu podziękowania niech przyjmą Herbert Bos, Asia Slowinska i wszyscy moi koledzy, którzy zapewnili wspaniałe otoczenie badawcze, gdzie mogłem w ogóle rozwinąć pomysł na tę książkę.Wstęp

Znaczna większość programów komputerowych pisana jest w językach wysokiego poziomu, takich jak C lub C++, które nie mogą być bezpośrednio uruchamiane na komputerze. Zanim użyjesz takich programów, po pierwsze, musisz je skompilować do wykonywalnych plików binarnych zawierających kod maszynowy, który może być obsłużony przez procesor. Skąd jednak wiesz, że taki skompilowany program jest semantycznie tożsamy z jego źródłem wysokiego poziomu? Niepokojąca odpowiedź brzmi: tego nie wiesz!

Istnieje duża semantyczna luka między językami wysokiego poziomu i binarnym kodem maszynowym, którą umie przekroczyć tylko niewielu. Nawet większość programistów ma tylko ograniczoną wiedzę o tym, jak naprawdę działa ich program na najniższym poziomie, i po prostu ufają oni, że skompilowany program zachowuje się zgodnie z ich zamiarami. W rezultacie wiele błędów kompilatora, subtelnych błędów implementacji, luk bezpieczeństwa w kodzie binarnym i złośliwych pasożytów może przemknąć się niezauważenie.

Co gorsza, istnieją niezliczone programy binarne i biblioteki – w przemyśle, bankach, w systemach wbudowanych – dla których kod źródłowy albo dawno zaginął, albo jest czyjąś własnością. Sprawia to, że nie można łatać tych programów czy bibliotek lub ocenić ich bezpieczeństwa na poziomie kodu źródłowego przy użyciu metod konwencjonalnych. Stanowi to poważny problem nawet dla wielkich producentów oprogramowania, na co wskazuje niedawne wypuszczenie przez Microsoft ręcznie wykonanej łatki binarnej dla przepełnienia bufora w programie Equation Editor, który stanowi część pakietu Microsoft Office (podatność CVE-2017-11882).

Dzięki tej książce nauczysz się, jak analizować, a nawet modyfikować programy na poziomie kodu binarnego. Obojętne, czy jesteś hakerem, badaczem bezpieczeństwa, analitykiem złośliwego oprogramowania, programistą, czy po prostu zainteresowanym, techniki te dadzą ci większą kontrolę i wgląd w programy binarne, które tworzysz i których codziennie używasz.

Czym jest analiza binarna i dlaczego jej potrzebujesz?

Analiza binarna to nauka i sztuka analizowania własności kodowanych binarnie programów komputerowych, kodu maszynowego i danych, które one zawierają. Krótko mówiąc, celem każdej analizy binarnej jest zrozumienie (a niekiedy modyfikacja) prawdziwych własności programów binarnych – innymi słowy, tego, co rzeczywiście robią, w przeciwieństwie do tego, co myślimy, że powinny robić.

Wielu ludzi kojarzy analizę binarną z inżynierią wsteczną oraz deasemblacją i przynajmniej częściowo mają oni rację. Deasemblacja stanowi ważny pierwszy krok w wielu przypadkach analizy binarnej, a inżynieria wsteczna jest powszechnym zastosowaniem analizy binarnej, a często jedynym sposobem udokumentowania zachowania oprogramowania własnościowego czy złośliwego. Jednak zakres analizy binarnej jest znacznie szerszy.

Mówiąc ogólnie, można podzielić techniki analizy binarnej na dwie grupy oraz ich kombinację:

Analiza statyczna Techniki analizy statycznej wnioskują na temat kodu binarnego bez uruchamiania go. Podejście to ma wiele zalet: możesz potencjalnie przeanalizować cały program za jednym razem i nie potrzebujesz CPU, by uruchomić plik binarny. Na przykład możesz statycznie analizować kod binarny ARM na maszynie x86. Wadą jest to, że analiza statyczna nie dostarcza żadnych informacji o stanie uruchomieniowym kodu binarnego, co może wysoce utrudnić taką analizę.

Analiza dynamiczna Z kolei analiza dynamiczna wymaga uruchomienia pliku binarnego i analizuje go w trakcie wykonywania. Podejście takie często jest prostsze od analizy statycznej, ponieważ dysponujesz pełną wiedzą o całym stanie uruchomieniowym, w tym wartościach zmiennych i wyniku instrukcji warunkowych. Jednak widzisz tylko wykonany kod, toteż analiza może pominąć interesujące części programu.

Zarówno analizy statyczne, jak i dynamiczne mają swoje zalety i wady, a w tej książce poznasz techniki stosowane w każdej z nich. Oprócz biernej analizy binarnej nauczysz się także technik instrumentacji binarnej, których możesz użyć, by zmienić programy binarne bez potrzeby kodu źródłowego. Instrumentacja binarna polega na takich samych technikach analizy jak deasemblacja i jednocześnie może zostać użyta jako pomoc w analizie binarnej. Ze względu na tę zależność symbiotyczną między technikami analizy binarnej i instrumentacji książka omawia obie.

Wspomniałem już, że możesz użyć analizy binarnej do dokumentowania albo testu penetracyjnego programów, dla których nie masz kodu źródłowego. Nawet jeżeli dysponujesz takim źródłem, analiza binarna może się przydać do wychwycenia subtelnych błędów, które wyraźniej ujawniają się na poziomie kodu binarnego niż źródłowego. Wiele technik analizy binarnej jest użytecznych też przy zaawansowanym debugowaniu. Książka ta omawia techniki analizy binarnej, których możesz użyć we wszystkich tych scenariuszach i poza nimi.

Dlaczego analiza binarna stanowi wyzwanie?

Analiza binarna dostarcza wyzwań i jest o wiele trudniejsza niż odpowiednia analiza na poziomie kodu źródłowego. W rzeczywistości wiele zadań analizy binarnej jest fundamentalnie nierozstrzygalnych, co oznacza, że nie da się zbudować dla tych problemów maszyny analitycznej, która zawsze dostarczałaby poprawnego wyniku! Aby dać ci pojęcie o oczekiwanej skali trudności, oto lista niektórych rzeczy, które sprawiają, że analiza binarna jest trudna. Niestety, lista ta jest daleka od kompletnej.

Brak informacji o symbolach Kiedy piszemy kod źródłowy w języku wysokiego poziomu takim jak C albo C++, nadajemy znaczące nazwy takim elementom, jak zmienne, funkcje i klasy. Określamy te nazwy mianem informacji symbolicznej lub krótko – symboli. Dobre konwencje nazywania sprawiają, że znacznie łatwiej zrozumieć kod źródłowy, lecz nie mają one rzeczywistego znaczenia na poziomie kodu binarnego. W rezultacie pliki binarne często są okrojone z symboli, co czyni ich kod znacznie trudniejszym do zrozumienia.

Brak informacji o typach Inną własnością programowania wysokiego poziomu jest to, że mamy tam do czynienia ze zmiennymi o dobrze zdefiniowanym typie, takimi jak int, float czy string, jak również z bardziej złożonymi strukturami danych jak typy struct. Z kolei na poziomie binarnym typy nie są nigdy jawnie deklarowane, co sprawia, że przeznaczenie i struktura danych jest trudna do wywnioskowania.

Brak abstrakcji wysokiego poziomu Współczesne programy są ujęte w kategoriach klas i funkcji, lecz kompilatory usuwają te konstrukcje wysokiego poziomu. Oznacza to, że pliki binarne wyglądają jak duże masy kodu i danych, a nie dobrze ustrukturyzowane programy, a przywrócenie im struktury wysokiego poziomu jest złożone i podatne na błędy.

Kod pomieszany z danymi Pliki binarne mogą zawierać (i często tak jest) fragmenty danych przemieszane z wykonywalnym kodem. Sprawia to, że można przypadkowo potraktować dane jako kod i na odwrót, co prowadzi do niepoprawnych wyników.

Kod i dane zależne od położenia Ponieważ pliki binarne nie są przeznaczone do modyfikowania, nawet dodanie pojedynczej instrukcji w kodzie maszynowym może spowodować problemy, gdyż przesuwa resztę kodu, unieważniając dotychczasowe adresy pamięci i odniesienia z innych miejsc kodu. W rezultacie jakakolwiek manipulacja kodem czy danymi jest niezwykle trudna i grozi uszkodzeniem pliku binarnego.

Wskutek powyższych wyzwań w praktyce często musimy zadowolić się wynikami niedokładnej analizy. Ważną częścią analizy binarnej jest proponowanie twórczych sposobów tworzenia nadających się do użytku narzędzi mimo błędów w analizie!

Kto powinien przeczytać tę książkę?

Docelowy krąg odbiorców tej książki obejmuje inżynierów bezpieczeństwa, badaczy bezpieczeństwa, hakerów i przeprowadzających testy penetracyjne, inżynierów wstecznych, analityków złośliwego oprogramowania i studentów informatyki. Bardzo starałem się, by książka była zrozumiała dla każdego zainteresowanego analizą binarną.

Niemniej jednak, ponieważ książka dotyczy tematów zaawansowanych, pewna znajomość programowania i systemów komputerowych jest wymagana. Aby skorzystać z książki jak najwięcej, powinieneś mieć poniższe:

• Praktyczna znajomość programowania w C lub C++.

• Podstawową, roboczą wiedzę na temat systemów operacyjnych (czym jest proces, pamięć wirtualna i tak dalej).

• Wiedzę, jak używać powłoki Linuksa (najlepiej bash).

• Znajomość asemblera x86/x86-64. Jeżeli nie masz jeszcze pojęcia o asemblerze, przeczytaj najpierw Dodatek A!

Jeżeli nigdy dotąd nie programowałeś albo nie lubisz zanurzać się w niskopoziomowych szczegółach systemów komputerowych, ta książka nie jest prawdopodobnie dla ciebie.

Co jest w tej książce?

Podstawowym celem tej książki jest uczynienie z ciebie wszechstronnego analityka plików binarnych, który jest zaznajomiony ze wszystkimi ważnymi tematami w tej dziedzinie, zarówno z podstawowymi, jak i zaawansowanymi, takimi jak instrumentacja binarna, analiza taint i wykonywanie symboliczne. Książka ta nie pretenduje do bycia wyczerpującym kompendium, ponieważ zmiany w dziedzinie i narzędziach analizy binarnej dokonują się tak szybko, że taka książka najprawdopodobniej byłaby nieaktualna w ciągu roku. Natomiast celem jest dostarczenie ci takiej wiedzy na wszystkie istotne tematy, że będziesz dobrze przygotowany do bardziej samodzielnej nauki.

Podobnie, książka ta nie wchodzi we wszystkie zawiłości inżynierii wstecznej kodu x86 i x86-64 (chociaż dodatek A omawia podstawy) czy analizy złośliwego oprogramowania na tych platformach. Istnieje już wiele książek poświęconych tym tematom i nie ma sensu powielać tutaj ich zawartości. Sięgnij do Dodatku D po listę książek poświęconych inżynierii wstecznej i analizie złośliwego oprogramowania.

Książka ta składa się z czterech części.

Część I: Formaty binarne wprowadza cię w formaty plików binarnych, które są kluczowe do zrozumienia pozostałej części książki. Jeżeli znasz już formaty binarne ELF i PE oraz bibliotekę libbfd, możesz spokojnie opuścić jeden lub więcej rozdziałów tej części.

Rozdział 1: Anatomia pliku binarnego dostarcza ogólnego wprowadzenia do budowy programów w kodzie binarnym.

Rozdział 2: Format ELF wprowadza cię do formatu binarnego ELF używanego przez Linuksa.

Rozdział 3: Format PE: krótkie wprowadzenie zawiera omówienie PE, formatu binarnego używanego przez Windows.

Rozdział 4: Tworzenie programu ładującego pliki binarne przy użyciu libbfd pokazuje ci, jak parsować pliki binarne przy użyciu libbfd i buduje loader plików binarnych używany dalej w książce.

Część II: Podstawy analizy binarnej zawiera podstawowe techniki analizy binarnej.

Rozdział 5: Podstawowa analiza binarna w Linuksie wprowadza w narzędzia niezbędne do przeprowadzenia analizy binarnej w środowisku Linuksa.

Rozdział 6: Deasemblacja i podstawy analizy binarnej omawia podstawowe techniki i wzorce analizy.

Rozdział 7: Proste metody wstrzykiwania kodu dla ELF daje ci przedsmak tego, jak modyfikować pliki binarne ELF za pomocą takich metod, jak wstrzykiwanie kodu i edycja heksadecymalna.

Część III: Zaawansowana analiza binarna omawia zaawansowane techniki analizy.

Rozdział 8: Dostosowywanie deasemblacji do potrzeb pokazuje ci, jak zbudować własne, skrojone na miarę narzędzia do deasemblacji przy użyciu Capstone’a.

Rozdział 9: Instrumentacja binarna dotyczy modyfikowania plików binarnych z Pin, dojrzałą platformą do instrumentacji binarnej.

Rozdział 10: Zasady dynamicznej analizy taint wprowadza cię w zagadnienia dynamicznej analizy taint, najnowocześniejszej metody analizy binarnej, która pozwala śledzić przepływy danych w programach.

Rozdział 11: Praktyczna dynamiczna analiza taint z libdft nauczy cię, jak zbudować własne narzędzia do dynamicznej analizy skażenia z użyciem libdft.

Rozdział 12: Podstawy wykonywania symbolicznego są poświęcone wykonywaniu symbolicznemu, kolejnej zaawansowanej technice, dzięki której w sposób zautomatyzowany można wnioskować o złożonych własnościach programu.

Rozdział 13: Praktyczne wykonywanie symboliczne z Tritonem pokazuje, jak zbudować narzędzia do praktycznego wykonywania symbolicznego.

Część IV: Dodatki zawiera zasoby, które mogą ci się przydać.

Dodatek A: Błyskawiczny kurs asemblera x86 zawiera krótkie wprowadzenie do asemblera x86 dla czytelników, którzy jeszcze nie mieli z nim styczności.

Dodatek B: Implementacja nadpisywania PT_NOTE przy użyciu libelf dostarcza szczegółów implementacji narzędzia elfinject wykorzystywanego w rozdziale 7 i służy jako wprowadzenie do biblioteki libelf.

Dodatek C: Spis narzędzi analizy binarnej zawiera listę narzędzi do analizy binarnej, których możesz zechcieć używać.

Dodatek D: Dalsza lektura zawiera spis źródeł, artykułów i książek związanych z przedmiotami omawianymi w tej książce.

Jak korzystać z tej książki?

Aby pomóc ci jak najwięcej skorzystać z lektury, omówmy krótko konwencje dotyczące przykładowego kodu, składni asemblera i platform oprogramowania.

Model programowy procesora

Chociaż wiele technik opisanych w książce możesz uogólnić na inne maszyny, w praktycznych przykładach skupiam się na modelu programowym procesora (Instruction Set Architecture, ISA) x86 Intela i jego 64-bitowej wersji x86-64 (w skrócie x64). Zarówno do x86, jak i x64 będę się odnosił po prostu jako „x86 ISA”. Zazwyczaj przykłady będą dotyczyć kodu dla x64, chyba że zaznaczono inaczej.

ISA dla procesora x86 jest interesująca, ponieważ jest on niezwykle rozpowszechniony w komputerach stacjonarnych i laptopach, jak również w badaniach z zakresu analizy binarnej (częściowo ze względu na jego popularność w maszynach użytkowników końcowych). W rezultacie wiele platform analizy binarnej jest nastawiona na x86.

Ponadto złożoność modelu programowego procesora x86 pozwala ci zapoznać się z pewnymi wyzwaniami analizy binarnej, które nie występują w prostszych architekturach. Architektura x86 ma długą historię zgodności wstecznej (sięgającą 1978 roku), co prowadzi do bardzo gęstego zestawu instrukcji, w tym znaczeniu, że znaczna większość możliwych wartości bajtów reprezentuje ważny kod operacji. Zaostrza to problem „kod kontra dane”, ponieważ mniej oczywiste staje się dla deasemblerów, że omyłkowo potraktowały dane jako kod. Ponadto instrukcje mają zmienną długość i możliwy jest dostęp do pamięci bez wyrównania dla wszystkich przyjętych długości słów. Stąd x86 pozwala na wyjątkowe konstrukty binarne takie jak (częściowo) nakrywające się i niewyrównane instrukcje. Innymi słowy, kiedy umiesz już postępować z tak złożonym modelem programowym procesora jak x86, inne ISA (takie jak dla ARM) będą już łatwe do zrozumienia.

Składnia asemblera

Jak wyjaśniono w Dodatku A, istnieją dwa popularne formaty składni używane do przedstawiania instrukcji kodu maszynowego w x86: składnia Intela i AT&T. Tutaj będę używał składni Intela, ponieważ jest oszczędniejsza w słowach. W składni Intela przesunięcie stałej do rejestru edi wygląda następująco:

Zauważ, że operand docelowy (edi) pojawia się najpierw. Jeżeli nie jesteś pewien różnic między składnią AT&T i Intela, zajrzyj do omówienia głównych cech charakterystycznych każdego stylu w Dodatku A.

Format binarny i platforma systemowa

Wszystkie przykłady kodu, które towarzyszą tej książce, powstały na wersji Linuksa Ubuntu w języku C/C++, z wyjątkiem niewielu przykładów napisanych w Pythonie. Stało się tak, gdyż wiele popularnych bibliotek dla analizy binarnej przeznaczonych jest głównie na Linuksa i mają wygodne API dla C/C++ lub Python. Jednak wszystkie techniki oraz większość bibliotek i narzędzi używanych w tej książce stosuje się też do Windows, więc jeżeli wybrałeś platformę Windows, nie powinieneś mieć większych kłopotów z przeniesieniem na nią wszystkiego, czego się nauczyłeś. W terminach formatów binarnych książka ta skupia się głównie na plikach binarnych ELF, domyślnych dla platform linuksowych, chociaż wiele z narzędzi obsługuje także pliki binarne PE dla Windows.

Przykładowy kod i maszyna wirtualna

Każdy rozdział tej książki zawiera przykłady kodu i istnieje prekonfigurowana maszyna wirtualna (VM), która towarzyszy książce i zawiera wszystkie próbki kodu. Ta maszyna wirtualna działa na popularnej dystrybucji Linuksa Ubuntu 16.04 i ma zainstalowane wszystkie omawiane narzędzia analizy binarnej otwartego oprogramowania. Możesz używać VM, by eksperymentować z przykładowym kodem i rozwiązywać ćwiczenia umieszczone pod koniec każdego rozdziału. VM jest dostępna na witrynie książki, pod adresem https://practicalbinaryanalysis.com albo https://nostarch.com/binaryanalysis/.

Na stronie internetowej książki znajdziesz także archiwum zawierające kod źródłowy dla przykładów i ćwiczeń. Możesz je pobrać, jeżeli nie chcesz pobierać całej VM, ale miej na uwadze, że niektóre z wymaganych platform analizy binarnej wymagają skomplikowanych ustawień, które musisz skonfigurować samemu, jeżeli wybierzesz opcję pominięcia VM.

Aby używać VM, potrzebujesz oprogramowania do wirtualizacji. VM jest przeznaczona do używania z VirtualBox, które możesz pobrać za darmo z https://www.virtualbox.org/. VirtualBox jest dostępny na wszystkie popularne systemy operacyjne, w tym Windows, Linux i macOS.

Po zainstalowaniu VirtualBox po prostu uruchom je, przejdź do opcji File → Import Appliance i wybierz maszynę wirtualną, którą ściągnąłeś ze strony internetowej książki. Po jej dodaniu włącz ją, klikając zieloną strzałkę z napisem Start w głównym oknie VirtualBox. Kiedy VM ukończy rozruch, możesz zalogować się przy użyciu „binary” jako nazwy użytkownika i hasła. Następnie otwórz terminal, używając skrótu klawiaturowego CTRL-ALT-T, i będziesz gotowy, by podążać za książką.

W katalogu ~/code znajdziesz po jednym podkatalogu na rozdział, który zawiera wszystkie próbki kodu i inne pliki istotne dla danego rozdziału. Na przykład cały kod dla rozdziału 1 znajdziesz w katalogu ~/code/chapter1. Jest także katalog o nazwie ~/code/inc, który zawiera wspólny kod używany przez programy w wielu rozdziałach. Dla plików źródłowych w C++ używam rozszerzenia .cc, a .c dla plików w C, .h dla plików nagłówkowych i .py dla skryptów Pythona.

Aby utworzyć wszystkie przykładowe programy dla danego rozdziału, otwórz po prostu terminal, przejdź do katalogu dla tego rozdziału i wykonaj polecenie make, by zbudować całą zawartość katalogu. To działa we wszystkich przypadkach, z wyjątkiem podanych przeze mnie wprost innych poleceń, by zbudować jakiś przykład.

Większość z ważnych próbek kodu jest omawiana szczegółowo w odpowiadających im rozdziałach. Jeżeli listing kodu omawianego w książce jest dostępny jako plik źródłowy w VM, nazwa tego pliku pojawia się przed listingiem jak poniżej.

Taka nazwa listingu wskazuje, że kod z listingu znajdziesz w pliku filename.c. Jeśli nie zaznaczono inaczej, plik ten znajdziesz pod podaną nazwą w katalogu dla rozdziału, w którym pojawia się ten przykład. Napotkasz także listingi z podpisami, które nie są nazwami plików, co oznacza, że są to tylko przykłady wykorzystane w książce bez odpowiadającej im kopii w VM. Krótkie listingi kodu niewystępujące na VM mogą nie mieć podpisów, tak jak podany wcześniej przykład składni asemblera.

Listingi, które pokazują polecenia powłoki i ich wynik, wykorzystują symbol $ do zaznaczenia wiersza polecenia i używają fontu pogrubionego do oznaczenia wierszy zawierających dane wprowadzane przez użytkownika. Wiersze te są poleceniami, które możesz wypróbować na maszynie wirtualnej, a kolejne linie, niepoprzedzone przez znak zachęty albo druk półgruby, przedstawiają wynik polecenia. Na przykład poniżej podano przegląd katalogu ~/code w VM:

Zauważ, że czasem będę edytować wynik polecenia, by poprawić czytelność, toteż wynik, który zobaczysz w VM, może się nieco różnić.

Ćwiczenia

Na końcu każdego rozdziału znajdziesz kilka ćwiczeń i zadań celem utrwalenia umiejętności nabytych w danym rozdziale. Niektóre ćwiczenia powinny być proste do rozwiązania przy wykorzystaniu tego, czego nauczyłeś się w tym rozdziale, inne mogą wymagać więcej wysiłku i indywidualnych poszukiwań.Przypisy

https://0patch.blogspot.nl/2017/11/did-microsoft-just-manually-patch-their.html.

Niektóre kompilatory robią to częściej niż inne. Visual Studio jest szczególnie znane, jeżeli chodzi o mieszanie kodu z danymi.

Istnieją także języki, takie jak Python i JavaScript, w których programy są interpretowane w trakcie wykonywania, a nie kompilowane w całości. Czasami część interpretowanego kodu podlega kompilacji JIT ( just in time), kiedy program się wykonuje. Wytwarza to kod binarny w pamięci komputera, który możesz analizować za pomocą technik opisanych w tej książce. Ponieważ analiza języków interpretowanych wymaga wyspecjalizowanych kroków właściwych dla danego języka, nie będę wnikał w szczegóły tego procesu.

Zauważ, że gcc zoptymalizował wywołanie funkcji printf, zastępując ją puts.

Istnieją także relokowalne (niezależne od położenia) pliki wykonywalne, ale te pokazują się w file jako obiekty współdzielone, a nie pliki relokowalne. Możesz odróżnić je od normalnych bibliotek współdzielonych, ponieważ mają one adres startowy.

Dalsze lektury dotyczące LTO znajdują się w Dodatku D.

W razie gdyby cię to zaciekawiło, za akronimem DWARF nie kryje się nic szczególnego. Nazwę tę wybrano, gdyż ładnie łączy się z „ELF” (przynajmniej, kiedy masz na myśli mityczne stworzenia).

Dla zainteresowanych, w Dodatku B są pewne odnośniki do literatury na temat DWARF i PDB.
mniej..

BESTSELLERY

Menu

Zamknij