Unpacking binaries
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
brak ciągów: Często można zauważyć, że spakowane binarki nie mają prawie żadnych ciągów
Dużo nieużywanych ciągów: Również, gdy złośliwe oprogramowanie używa jakiegoś rodzaju komercyjnego pakera, często można znaleźć wiele ciągów bez odniesień krzyżowych. Nawet jeśli te ciągi istnieją, nie oznacza to, że binarka nie jest spakowana.
Możesz również użyć kilku narzędzi, aby spróbować znaleźć, który paker został użyty do spakowania binarki:
Zacznij analizować spakowaną binarkę od dołu w IDA i przechodź w górę. Rozpakowacze kończą działanie, gdy rozpakowany kod kończy działanie, więc mało prawdopodobne jest, że rozpakowacz przekazuje wykonanie do rozpakowanego kodu na początku.
Szukaj JMP-ów lub CALL-ów do rejestrów lub obszarów pamięci. Szukaj również funkcji przesyłających argumenty i adres, a następnie wywołujących retn
, ponieważ powrót z funkcji w takim przypadku może wywołać adres właśnie przesłany na stos przed jego wywołaniem.
Umieść punkt przerwania na VirtualAlloc
, ponieważ alokuje on miejsce w pamięci, gdzie program może zapisać rozpakowany kod. "Uruchom do kodu użytkownika" lub użyj F8, aby uzyskać wartość wewnątrz EAX po wykonaniu funkcji i "podążaj za tym adresem w zrzucie". Nigdy nie wiesz, czy to jest obszar, w którym rozpakowany kod zostanie zapisany.
VirtualAlloc
z wartością "40" jako argument oznacza Odczyt+Zapis+Wykonanie (jakiś kod, który wymaga wykonania, zostanie skopiowany tutaj).
Podczas rozpakowywania kodu normalne jest znalezienie wielu wywołań do operacji arytmetycznych i funkcji takich jak memcopy
lub Virtual
Alloc
. Jeśli znajdziesz się w funkcji, która najwyraźniej wykonuje tylko operacje arytmetyczne i może jakieś memcopy
, zalecenie to spróbować znaleźć koniec funkcji (może JMP lub wywołanie do jakiegoś rejestru) lub przynajmniej wywołanie ostatniej funkcji i uruchomić do niej, ponieważ kod nie jest interesujący.
Podczas rozpakowywania kodu zauważaj, kiedy zmieniasz obszar pamięci, ponieważ zmiana obszaru pamięci może wskazywać na rozpoczęcie kodu rozpakowującego. Możesz łatwo zrzucić obszar pamięci używając Process Hacker (proces --> właściwości --> pamięć).
Podczas próby rozpakowania kodu dobrym sposobem na sprawdzenie, czy już pracujesz z rozpakowanym kodem (więc możesz go po prostu zrzucić) jest sprawdzenie ciągów binarki. Jeśli w pewnym momencie wykonasz skok (może zmieniając obszar pamięci) i zauważysz, że dodano znacznie więcej ciągów, wtedy możesz wiedzieć, że pracujesz z rozpakowanym kodem. Jednak, jeśli paker już zawiera wiele ciągów, możesz zobaczyć, ile ciągów zawiera słowo "http" i sprawdzić, czy ta liczba wzrasta.
Gdy zrzucasz plik wykonywalny z obszaru pamięci, możesz naprawić niektóre nagłówki używając PE-bear.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)