Odsyłacze (odnośniki zewnętrzne)

https://chacker.pl/

Dość często zdarza się, że chcemy wiedzieć, skąd w pliku binarnym pochodzą wywołania interesującej nas funkcji. Są to tak zwane odsyłacze, znane również jako odnośniki zewnętrzne. Być może chcesz wiedzieć, skąd i kiedy wykonywane jest wywołanie funkcji HeapAlloc. Jedną z metod jest kliknięcie karty Importy, posortowanie kolumny Nazwa alfabetycznie i zlokalizowanie żądanej funkcji. Po zlokalizowaniu kliknij dwukrotnie nazwę, aby przejść do sekcji Import danych (.idata) żądanej funkcji, takiej jak pokazana na rysunku. Po wybraniu funkcji w sekcji .idata naciśnij CTRL-X, aby wyświetlić okno odnośników zewnętrznych. Rysunek przedstawia wyniki w naszym przykładzie HeapAlloc. Możemy wybrać dowolne z wymienionych połączeń, aby przejść do tej lokalizacji w pliku wejściowym.

UWAGA. Istnieje również klawisz skrótu odsyłacza do argumentów o nazwie JumpOpXref, który jest wykonywany przez naciśnięcie X. Przykładowym przypadkiem użycia może być zmienna przechowywana w segmencie danych programu, do którego odwołuje się wiele miejsc w segmencie kodu. Naciśnięcie przycisku X na zmiennej, gdy jest podświetlona, powoduje wyświetlenie powiązań do tej zmiennej

Funkcje i funkcjonalność IDA Pro

https://chacker.pl/

IDA Pro ma dużą liczbę wbudowanych funkcji, narzędzi i funkcjonalności; jednakże, podobnie jak w przypadku wielu złożonych aplikacji, przy pierwszym uruchomieniu należy się uczyć. Wiele z tych opcji nie jest dostępnych w bezpłatnej wersji IDA. Zaczniemy od najbardziej podstawowego ustawienia preferencji, czyli schematu kolorów, a następnie omówimy niektóre z bardziej przydatnych funkcji. IDA Pro oferuje różne predefiniowane opcje ze schematem kolorów. Aby ustawić te opcje, kliknij menu Opcje, a następnie Kolory. Na rysunku pokazano menu rozwijane i opcje kolorów IDA.

Możesz wybrać pomiędzy domyślnym, darcula i ciemnym. Opcja ciemna dotyczy w całości IDA Pro. Opcja darcula dotyczy tylko okna demontażu. Rysunek pokazuje przykład trybu ciemnego.

Nawigacja w IDA Pro

https://chacker.pl/

Ważne jest, aby zrozumieć, jak prawidłowo pracować i poruszać się po IDA Pro, ponieważ istnieje wiele domyślnych zakładek i okien. Zacznijmy od przykładu załadowania podstawowego pliku binarnego do IDA Pro jako pliku wejściowego. Podczas pierwszego ładowania programu myAtoi do IDA Pro pojawia się następujące okno:

IDA Pro przeanalizował metadane pliku obiektowego i ustalił, że jest to 64-bitowy plik binarny ELF. IDA przeprowadza dużą część wstępnej analizy, takiej jak śledzenie przepływu wykonywania, przekazywanie podpisów technologii szybkiej identyfikacji i rozpoznawania bibliotek (FLIRT), śledzenie wskaźników stosu, analiza tabeli symboli i nazewnictwo funkcji, wstawianie danych o typach, jeśli są dostępne, oraz przypisanie nazw lokalizacji. Po kliknięciu OK IDA Pro przeprowadza automatyczną analizę. W przypadku dużych plików wejściowych analiza może zająć trochę czasu. Zamknięcie wszystkich okien i ukrycie paska narzędzi Nawigatora przyspiesza analizę. Po zakończeniu kliknięcie opcji Windows w opcjach menu i wybranie Resetuj pulpit przywraca układ do ustawień domyślnych. Gdy IDA Pro zakończy automatyczną analizę programu myAtoi, otrzymamy wynik pokazany na rysunku

UWAGA Wiele funkcji i elementów przedstawiono na rysunku 5-1. Pamiętaj, aby wracać do tego obrazu, gdy będziemy przeglądać różne sekcje, funkcje i opcje.

Pasek narzędzi Nawigatora na rysunku zapewnia przegląd całego pliku wejściowego, podzielonego na różne sekcje.

Każdy oznaczony kolorem obszar na pasku narzędzi można kliknąć, aby uzyskać łatwy dostęp do tej lokalizacji. W naszym przykładzie z programem myAtoi duża część ogólnego obrazu jest identyfikowana jako zwykłe funkcje. Oznacza to funkcje wewnętrzne i kod wykonywalny skompilowany do postaci binarnej, w przeciwieństwie do symboli zewnętrznych, które są zależnościami dynamicznymi, oraz funkcji bibliotecznych, które wskazywałyby statycznie skompilowany kod biblioteki. Okno Funkcje, pokazane na rysunku, zawiera listę nazw wszystkich funkcji wewnętrznych i zależności dynamicznych.

Dwukrotne kliknięcie wpisu powoduje wyświetlenie tej funkcji w głównym oknie widoku wykresu. Klawisz skrótu G umożliwia także bezpośrednie przejście do adresu. Jeśli w IDA Pro dostępna jest tabela symboli, wszystkie funkcje otrzymują odpowiednie nazwy. Jeśli informacja o symbolu nie jest dostępna dla danej funkcji, podaje się przedrostek podrzędny, po którym następuje przesunięcie względnego adresu wirtualnego (RVA), takie jak sub_1020. Poniżej znajduje się przykład sytuacji, w której tabela symboli nie jest dostępna, a kiedy jest dostępna. Poniżej okna Funkcje znajduje się okno Przegląd wykresu. . Jest to po prostu interaktywne okno przedstawiające całą aktualnie analizowaną funkcję. Okno danych wyjściowych na dole domyślnego układu IDA Pro pokazano na rysunku  wraz z interaktywnym paskiem Pythona lub IDC.

Okno Dane wyjściowe to miejsce, w którym wyświetlane są komunikaty oraz wyniki wprowadzonych danych polecenia za pośrednictwem IDA Python lub IDC. IDA Python i IDC zostały omówione w rozdziale 13. W naszym przykładzie ostatni wyświetlony komunikat brzmi: „Początkowa autoanaliza została zakończona”. Główne okno pośrodku domyślnego układu IDA Pro nosi nazwę IDA View-A w naszym przykładzie i pokazano na rysunku .  To jest widok wykresu, który wyświetla funkcje i bloki w obrębie tych funkcji w rekurencyjnym stylu opadania. Naciśnięcie spacji w tym oknie powoduje przełączenie widoku z widoku wykresu na widok tekstowy, jak pokazano na rysunku. Widok tekstowy to bardziej liniowy sposób patrzenia na demontaż. Ponowne naciśnięcie spacji przełącza pomiędzy dwiema opcjami widoku. Na rysunku  pokazano główną funkcję i jest tylko jeden blok kodu. Informacje o typie są wyświetlane u góry funkcji, po nich następują zmienne lokalne i dezasemblacja.

Rysunek przedstawia zakładkę Importy. To okno wyświetla wszystkie dynamiczne zależności pliku wejściowego od kodu biblioteki. Najwyższy wpis na liście to funkcja printf. Obiekt współdzielony zawierający tę funkcję jest wymagany do działania programu i musi zostać mapowany do procesu w czasie wykonywania. Nie pokazana jest karta Eksporty. W tym oknie wyświetlana jest lista normalnie dostępnych wyeksportowanych funkcji i skojarzonych z nimi adresów. Z tej sekcji korzystają obiekty współdzielone i biblioteki dołączane dynamicznie (DLL).

Co to jest dezasemblacja?

https://chacker.pl/

Najpierw przyjrzyjmy się procesowi deasemblacji kodu maszynowego. Jest to omówione na różne sposoby w innych miejscach tej książki, ale ważne jest, aby upewnić się, że rozumiesz podstawowy cel dezasemblera . W tym przykładzie używamy skompilowanej wersji programu myAtoi . Użyj narzędzia objdump zainstalowanego na Kali Linux z następującymi opcjami, aby zdemontować pierwsze osiem linii głównej funkcji programu myAtoi. Flaga -j pozwala określić sekcję; w tym przypadku wybieramy segment .text lub „code”. Flaga -d jest opcją demontażu. Grepujemy ciąg „<main>:” i drukujemy osiem wierszy po nim z flagą -A8.

W pierwszym wierszu wyniku w (1) widzimy, że główna funkcja zaczyna się od przesunięcia względnego adresu wirtualnego (RVA) wynoszącego 0x00000000000011ca w całym obrazie binarnym. Pierwsza linia zdezasemblowanego wyjścia w main zaczyna się od przesunięcia 11ca, jak widać w (2), po którym następuje kod operacji języka maszynowego 55, jak widać w (3). Na prawo od kodu operacji w (4) znajduje się odpowiednia zdemontowana instrukcja lub mnemoniczne push, po której następuje operand rbp w (5). Ta instrukcja spowoduje, że adres lub wartość przechowywana w rejestrze rbp zostanie wypchnięta na stos. Każdy z kolejnych wierszy wyjścia dostarcza tych samych informacji, pobierając kody operacji i wyświetlając odpowiedni demontaż. Jest to plik binarny w formacie wykonywalnym i linkującym (ELF) x86-64-bitowy. Gdyby ten program został skompilowany dla innego procesora, takiego jak ARM, kody operacji i zdezasemblowane instrukcje byłyby inne, ponieważ każda architektura procesora ma swój własny zestaw instrukcji. Dwie podstawowe metody demontażu to przeciągnięcie liniowe i zejście rekurencyjne (znane również jako przechodzenie rekurencyjne). Narzędzie objdump jest przykładem deasemblera liniowego, który rozpoczyna się na początku segmentu kodu lub określonego adresu początkowego, dezasemblując kolejno każdy kod operacji. Niektóre architektury mają zestaw instrukcji o zmiennej długości, na przykład x86-64, a inne architektury mają ustawione wymagania dotyczące rozmiaru, takie jak MIPS, gdzie każda instrukcja ma szerokość 4 bajtów. IDA jest przykładem dezasemblera rekurencyjnego, w którym kod maszynowy jest deasemblowany liniowo, aż do osiągnięcia instrukcji zdolnej do modyfikacji przepływu sterowania, takiej jak skok warunkowy lub rozgałęzienie. Przykładem skoku warunkowego jest instrukcja jz, która oznacza skok przy zera. Ta instrukcja sprawdza flagę zerową (zf) w rejestrze FLAGS, aby sprawdzić, czy jest ustawiona. Jeśli flaga jest ustawiona, skok jest wykonywany. Jeżeli flaga nie jest ustawiona, licznik programu przechodzi do kolejnego adresu sekwencyjnego, gdzie wykonanie jest kontynuowane. Aby dodać kontekst, poniższy obraz przedstawia dowolny przykład w IDA Pro skoku warunkowego po zwróceniu sterowania z funkcji alokacji pamięci:

Ten widok graficzny wewnątrz IDA Pro jest w formacie rekursywnego wyświetlania.

Najpierw wywoływana jest funkcja GetProcessHeap (1) . Jak sama nazwa wskazuje, to wywołanie funkcji zwraca adres bazowy lub uchwyt domyślnej sterty procesu. Adres sterty jest zwracany wywołującemu za pośrednictwem rejestru RAX. Argumenty wywołania HeapAlloc są teraz konfigurowane, przy czym pierwszym argumentem jest rozmiar, kopiowany z r14 do r8 w punkcie (2) przy użyciu instrukcji mov. Argument dwFlags jest ustawiany na 0 za pomocą instrukcji xor edx, edx w (3) , wskazując brak nowych opcji dla żądania alokacji. Adres sterty jest kopiowany z rax do rcx w (4) . Teraz, gdy argumenty funkcji HeapAlloc są już ustawione, instrukcja call jest wykonywana w punkcie (5) . Oczekiwany zwrot z wywołania HeapAlloc jest wskaźnikiem do przydzielonego fragmentu pamięci. Wartość przechowywana w rax jest następnie kopiowana do r15 w (6). Następnie wykonywana jest instrukcja test rax, rax w punkcie (7). Instrukcja testowa wykonuje operację bitową i. W tym przypadku testujemy rejestr rax przeciwko sobie samemu. Celem instrukcji testowej w tym przykładzie jest sprawdzenie, czy wartość zwracana z wywołania HeapAlloc wynosi 0, co oznaczałoby błąd. Jeśli rax przechowuje 0, a my i rejestr przeciwko sobie, ustawiana jest flaga zera (zf). Jeśli opcja HEAP_GENERATE_EXCEPTIONS jest ustawiona poprzez dwFlags podczas wywołania HeapAlloc, zwracane są kody wyjątków zamiast 0,1. Ostatnią instrukcją w tym bloku jest instrukcja skoku do zera (jz), at(8) . Jeśli zf jest ustawione, co oznacza, że wywołanie HeapAlloc nie powiodło się, wykonujemy skok; w przeciwnym razie przechodzimy liniowo do następnego adresu sekwencyjnego i kontynuujemy wykonywanie kodu.

Wprowadzenie do IDA Pro do inżynierii odwrotnej

https://chacker.pl/

Dlaczego przy dużej liczbie dostępnych darmowych i alternatywnych dezasemblerów wybrać IDA Pro? Do darmowych alternatywnych deasemblerów zalicza się Ghidra , radare2 i kilka innych. Komercyjne alternatywy obejmują Binary Ninja i Hopper. Każda z tych alternatyw jest świetnym deasemblerem; jednakże IDA jest bardzo szanowana, obsługuje większość architektur procesorów i posiada największą liczbę wtyczek, skryptów i innych rozszerzeń. Jest szeroko stosowany przez społeczność badaczy bezpieczeństwa i oferuje niezliczone funkcje pomagające w analizie plików binarnych. Dostępne są także bezpłatne wersje IDA Pro, z których najnowsza to IDA 7.0; jednakże ich funkcjonalność jest zazwyczaj ograniczona. W rozdziale 18 będziemy używać IDA Pro i powiązanych z nim wtyczek do przeprowadzenia analizy poprawek firmy Microsoft w celu zlokalizowania zmian w kodzie, które mogą wskazywać na załataną lukę. Wczesne wykorzystanie załatanej luki w zabezpieczeniach to potężna technika stosowana podczas ofensywnych działań związanych z bezpieczeństwem.

IDAPro

https://chacker.pl/

Deasembler i debugger znany jako Interactive Disassembler (IDA) Pro to bogata w funkcje, rozszerzalna aplikacja do inżynierii wstecznej, której właścicielem i administratorem jest firma Hex-Rays w Belgii. Jest to produkt komercyjny z dostępnymi alternatywnymi wersjami, takimi jak IDA Home i IDA Free. Rodzina dezasemblerów IDA jest aktywnie rozwijana dzięki dużej liczbie swobodnie dostępnych wtyczek i skryptów dostarczonych przez Hex-Rays i społeczność użytkowników. Hex-Rays oferuje także Dekompilator Hex-Rays, prawdopodobnie najlepszy dostępny dekompilator. W porównaniu do innych deasemblerów jest najbardziej dojrzały, obsługuje największą liczbę architektur i funkcji procesorów.

Streszczenie

https://chacker.pl/

Omówiliśmy podstawowe funkcje i funkcjonalność Ghidry, od których możesz zacząć, pozostawiając otwarte drzwi do zgłębiania bardziej zaawansowanych tematów. Przyjrzeliśmy się takim tematom, jak interfejs Ghidry, poprawa czytelności za pomocą adnotacji oraz sposób używania Ghidry do różnicowania binarnego i analizy poprawek. Poświęć trochę czasu na poznanie innych potężnych i zaawansowanych funkcji Ghidra, takich jak automatyzacja zadań inżynierii wstecznej za pomocą skryptów Ghidra i nieskończonych możliwości, na jakie pozwala system wtyczek.

Analiza poprawek

https://chacker.pl/

Narzędzie ujawniło różnice pomiędzy programami korzystającymi z funkcji ViewStudentGrades, jak pokazano poniżej:

Szybka kontrola dekompilacji funkcji obu wersji ujawnia, że podczas analizowania danych wejściowych użytkownika za pomocą funkcji atoi nie sprawdzono granic indeksu tablicy studentów. Oznacza to, że możemy wybrać dowolny dodatni lub ujemny numer indeksu, co pozwala nam traktować dowolny adres z wyrównaniem do 32 bajtów jako strukturę danych Ucznia. Opcja „Zmień oceny” pozwala na zmianę ocen uczniów, jeśli ustawione zostanie prawidłowe hasło. Okazuje się, że tę podatność możemy wykorzystać na swoją korzyść. Jeśli przejdziemy do Windows | Tabela symboli i wyszukaj admin_password symbol, zauważymy, że znajduje się on pod offsetem 0x001040a0. To jest dokładnie 64 bajty przed bazowym adresem tablicy uczniów (0x001040e0). Co by się stało, gdybyśmy skorzystali z opcji „Wyświetl oceny” i wybrali ucznia o numerze -2?

Jak widać, traktowanie pamięci admin_password jako zmiennej typu struktury Studenta zakończy się tym, że hasło będzie znajdować się dokładnie w pozycji „nazwa” struktury. Znaleźliśmy prymityw wykorzystywania odczytu i możemy teraz odczytać 24 bajty z dowolnej wartości pamięci wyrównanej do 32 bajtów. Ale to nie wszystko. Zwróć uwagę, jak kontrolujemy wartość indeksu i wartość składową ocen dla struktury uczniów w funkcji ChangeStudentGrades. Oznacza to, że możemy zapisać 4 bajty w dowolnym miejscu i 28 bajtów z dowolnego 32-bajtowego adresu pamięci.

Organizować coś

https://chacker.pl/

Ghidra udostępnia funkcję różnicowania kodów, która umożliwia porównanie różnic pomiędzy dwoma plikami binarnymi o tym samym układzie adresów i pozycji. Jest to przydatne w przypadku porównań binarnych z korelacją przesunięcia jeden do jednego, ale nie koreluje kodu pod względem kontekstu i przepływu wykonania. Na szczęście możemy rozszerzyć możliwości Ghidry, instalując wtyczki takie jak BinDiffHelper1 dla doskonałego narzędzia BinDiff. Aby to zrobić, wykonaj następujące kroki:

1. Zainstaluj narzędzie do automatyzacji kompilacji Gradle w wersji 6.5, uruchamiając następujące polecenia:

  1. Sklonuj i skompiluj wtyczkę BinExport2 z oficjalnego repozytorium. Ta wtyczka automatyzuje proces generowania bazy danych różnic BinExport:

Proces kompilacji może zająć kilka minut. Po zakończeniu należy utworzyć plik ZIP wtyczki BinExport w folderze ~/binexport/java/BinExport.

3. W oknie projektu Ghidry przejdź do Plik | Menu Zainstaluj rozszerzenie i kliknij ikonę znaku plus (+), aby dodać plik ZIP wtyczki do folderu ~/binexport/java/BinExport/dist, jak pokazano poniżej:

  1. Kliknij OK i zrestartuj Ghidrę, aby zmiany wtyczki zostały zastosowane.
  2. W oknie terminala pobierz i zainstaluj BinDiff v6 z oficjalnej strony:

Instalacja pakietu .deb wyświetli monit o podanie ścieżki IDA Pro. Pozostaw to pole puste, aby określić, że jesteśmy zainteresowani eksperymentalnymi rozszerzeniami Ghidra.

  1. Sklonuj i skompiluj wtyczkę BinDiffHelper z oficjalnego repozytorium:

7. W oknie projektu Ghidry przejdź do Plik | Zainstaluj menu rozszerzenia i dodaj plik Zip wtyczki do folderu ~/BinDiffHelper/dist/, jak pokazano poniżej.

  1. Uruchom ponownie Ghidrę, aby zastosować zmiany wtyczek.

Różnicowanie binarne

Teraz, gdy wtyczki zostały zainstalowane, kontynuujmy laboratorium, badając proces różnicowania plików binarnych:

9. Otwórz plik programu z poprawką uczniów. Zostaniesz poproszony o wykrycie nowych rozszerzeń:

Wybierz Tak, aby skonfigurować nowe wtyczki, a w kolejnym oknie kliknij OK:

  1. Uruchom Auto-Analizę i zapisz projekt.
  2. Powtórz kroki 9 i 10, ale tym razem z plikiem programu uczniów.
  3. Otwórz okno wtyczki Window/BinDiffHelper. Kliknij ikonę konfiguracji, aby ustawić poprawną ścieżkę binarną BinDiff 6 (/opt/bindiff/bin/bindiff), jak pokazano poniżej:

  1. Otwórz poprawiony przez uczniów program, klikając ikonę „Otwórz plik do porównania”. Powinieneś teraz zobaczyć wyniki podobieństwa i pewności dla każdej funkcji. Przejdź do funkcji ViewStudentGrades na dole, zaznacz pole wyboru importu i kliknij ikonę „Importuj wybraną funkcję”.

Binarna analiza różnic i poprawek

https://chacker.pl/

Po wykryciu i zgłoszeniu luk w zabezpieczeniach dostawcy przystępują do łatania swoich produktów i publikowania aktualizacji. Czasami dziennik zmian aktualizacji jest ograniczony szczegółowo w odniesieniu do załatanego błędu i aby zrozumieć zmiany i opracować exploity, konieczne staje się różnicowanie binarne. W tym laboratorium przeprowadzisz Cię przez proces odkrywania luki w narzędziu do zarządzania ocenami uczniów za pomocą różnicowania binarnego. Luka powinna być łatwa do wykrycia po prostu poprzez sprawdzenie kodu, ale ponownie będziemy udawać, że mamy dostęp tylko do plików binarnych, aby lepiej symulować scenariusz ze świata rzeczywistego.