Pytanie:
Narzędzie lub dane do analizy kodu binarnego w celu wykrycia architektury procesora
n3vermind
2013-10-08 16:41:42 UTC
view on stackexchange narkive permalink

Zakładając, że mam plik binarny z kodem dla nieznanego procesora, czy mogę jakoś wykryć architekturę procesora? Wiem, że zależy to głównie od kompilatora, ale myślę, że dla większości architektur procesora powinno to być dużo operacji CALL / RETN / JMP / PUSH / POP (statystycznie więcej niż inne). A może powinienem poszukać jakichś wzorców w kodzie specyficznym dla procesora (zamiast występowania opkodów)?

Jeśli masz plik binarny, ale nie wiesz, dla którego procesora, jak możesz zobaczyć * opkody *? Jeśli wiesz, jak przetłumaczyć kod binarny na kod operacyjny, to już * wiesz *, który procesor posiadasz. (Albo przynajmniej która rodzina - np. Z80, Intel, ARM, Motorola MC-680XX.)
Przeczytaj magię, a następnie format pliku.
1) (Stolas) W osadzaniu często nie masz magii lub magia jest czymś, co wymyślili 2) (Jongware) Możesz zobaczyć opkody (typowe wzorce bajtów), nie wiedząc, jakie to są prawie tak samo jak ty może określić, czy plik jest skompresowany lub zaszyfrowany, bez możliwości jego odszyfrowania lub zdekompresowania.
@jongware Myślę, że mylisz _opcode_ z _ instrukcją asemblera_.
@n3vermind: .. jeśli nie znasz procesora, to skąd możesz mieć pewność, że patrzysz na „opkody”? Na przykład ARM byłyby łatwe (wszystkie opkody mają 4 bajty i większość zaczyna się od 0xE0), z wyjątkiem trybów Thumb do rozważenia. Podejście statystyczne * może * działać - ale zawsze masz dychotomię kod / dane, która utrudnia demontaż, nawet jeśli znasz typ procesora.
@Jongware masz absolutną rację, ale jest to raczej inny problem niż przedmiot. W każdym razie pierwszym moim zdaniem jest zbadanie entropii układu podwójnego.
Pięć odpowiedzi:
woliveirajr
2013-10-08 21:24:59 UTC
view on stackexchange narkive permalink

Kiedy masz młotek, wszystkie problemy wyglądają jak gwoździe ...

Badałem coś, co nazywa się znormalizowaną odległością ucisku - NCD - jakiś czas temu i spróbuję, gdybym miał problem podobny do twojego.

  1. Zrobiłbym bazę przykładów. Weźmie 20 programów dla każdej architektury, którą chcesz znać, o różnych rozmiarach, i zapisze je.

  2. W konfrontacji z programem, który chciałem wiedzieć, jaka to architektura, Obliczyłbym, że to NCD na wszystkich moich przykładach.

  3. Wybrałbym najlepszy (mniejszy) NCD, a następnie zweryfikowałbym, czy jest to prawdziwe dopasowanie (niech powiedzmy, próbując uruchomić go na odkrytej architekturze).

Aktualizacja

Zawsze robiłem w ręcznie , jeśli chodzi o NCD. Jak to zrobiłem:

  • masz 20 plików dla SPARC i nazywasz je A01, A02, A03 i tak dalej. Twoje pliki x86: B01, B02 itd.

  • Otrzymujesz nieznany plik i nazywasz go XX.

  • Wybierz swój preferowane narzędzie do kompresji (użyłem Gzip, ale zobacz uwagi na końcu tej odpowiedzi).

  • Oblicz NCD dla pierwszej pary:

NCD (XX, A01) = (Z (XX + A01) - min (Z (XX), Z (A01)) / max (Z (XX), Z (A01))

Z (coś) -> oznacza, że ​​kompresujesz coś za pomocą Gzip i uzyskujesz rozmiar pliku po kompresji. Na przykład 8763 bajtów, więc Z (coś) = 8763.

XX + A01 -> oznacza, że ​​łączysz rzeczy. Dodajesz plik A01 na koniec pliku XX. W Linuksie możesz wykonać „cat XX A01> XXA01”.

min ( ) i max () -> obliczasz skompresowany rozmiar XX i A01 i używasz minimum i maksimum, które otrzymujesz.

Otrzymasz wartość NCD: będzie leżeć między 0 a 1 i użyj jak największej liczby miejsc po przecinku, ponieważ czasami różnica jest na siódmej lub ósmej cyfrze. Będzie to jak porównanie 0.999999887 z 0.999999524.

Y Zrobisz to dla każdego pliku, więc otrzymasz 20 wyników NCD dla SPARC, 20 dla x86 ...

Zdobądź mniejszy NCD ze wszystkich. Powiedzmy, że plik B07 dał ci mniejszy NCD. Więc prawdopodobnie nieznany plik to x86.

Porady:

  • Twój nieznany plik i testowe muszą mieć podobny rozmiar. Kiedy porównujesz plik z większymi lub mniejszymi, NCD nie zrobi tego magicznie. Tak więc, jeśli będziesz testować pliki o rozmiarze od 5 do 10 KB, otrzymam pliki testowe o rozmiarach 2,5, 5, 7,5, 10, 12,5 ...

  • Na studiach magisterskich uzyskiwałem lepsze wyniki, zawsze stosując mniejszą wartość NCD. Drugą najlepszą metodą było przeprowadzenie głosowania: uzyskaj 5 mniejszych wyników NCD i zobacz, która architektura uzyskała więcej głosów. Np .: mniejsze NCD to A03, A05, B02, B06, B07 -> B idą 3 głosy, więc powiedziałbym, że są to kompresory x86 ...

  • oparte na kompresorach na konstrukcji Zip mają ograniczenie 32kB: sposób kompresji rzeczy, po prostu rozważają 32kB. Jeśli Twój XX + A01 jest większy niż ten, Gzip, Zip itp. Nie przyniesie dobrych wyników. Tak więc, dla plików, które są większe niż 15 lub 16kB, wybrałbym inny kompresor: PPMD, Bzip ...

Świetny pomysł. W przeszłości miałem dobre wyniki w innych problemach klasyfikacyjnych.
@woliveirajr, czy masz jakieś sugestie dotyczące narzędzia lub biblioteki do obliczania NCD? Jak dotąd znalazłem narzędzia [CompLearn] (http://www.complearn.org/), które wyglądają całkiem obiecująco.
@n3vermind Zaktualizowałem swoją odpowiedź: Myślę, że mógłbyś użyć CompLearn, ale ponieważ chciałem mieć większą kontrolę (np. Jakiego kompresora użyć), stworzyłem mały program odpowiadający moim potrzebom. Wyjaśniłem, jak to działa ...
@woliveirajr Czy masz link do swojej pracy magisterskiej? Bardzo chciałbym to omówić
@koukouviou przepraszam, nie mogę go teraz znaleźć (a i tak byłby w języku portugalskim). Ale oto jeden artykuł, który o tym napisaliśmy: http://www.inf.ufpr.br/lesoliveira/download/FSI2013.pdf - Daj mi znać, jeśli mogę Ci pomóc lub udzielić więcej informacji.
@woliveirajr dokładnie to, czego szukałem, wielkie dzięki za twoją odpowiedź.
devttys0
2013-10-08 18:05:07 UTC
view on stackexchange narkive permalink

Istnieje kilka narzędzi, które mogą skanować pliki binarne w poszukiwaniu typowych kodów operacyjnych występujących w różnych architekturach. Opcja -A Binwalk robi to na przykład (skanuje w poszukiwaniu ARM / MIPS / x86 i kilku innych architektur).

joxeankoret
2013-10-08 18:12:29 UTC
view on stackexchange narkive permalink

Zazwyczaj najpierw wypróbowuję najpopularniejsze procesory (ARM, PPC, MIPS i AVR), próbuję sprawdzić, czy któryś ze zwykłych ciągów znaków mówi coś o procesorze itp ... A gdy wszystko inne zawodzi, daję spróbuj tego, o co prosisz: analiza statystyczna kodów operacyjnych (jeśli jestem pewien, że nie jest to ani zaszyfrowane, ani skompresowane).

Polecam przeczytanie prezentacji Alexandra Chernova i Kateriny Troshiny „Inżynieria wsteczna programów binarnych dla niestandardowych maszyn wirtualnych”. Pisanie narzędzia takiego jak to, które napisali, musi być bardzo trudne (chyba), ale napisanie narzędzia, które ma spróbować określić, który procesor wydaje się być skompilowany do użycia technik opisanych w tej prezentacji, nie jest takie trudne (o ile możesz zebrać wystarczającą ilość próbki dla wielu różnych architektur).

Igor Skochinsky
2013-10-09 01:37:09 UTC
view on stackexchange narkive permalink

Mój leniwy hack: mały skrypt w Pythonie, który oblicza liczbę bigramów i trygramów. Następnie wyszukuję kilka najpopularniejszych sekwencji w Google (cytowane szesnastkowo). Dość często udaje mi się znaleźć kilka zrzutów heksadecymalnych i mogę obliczyć procesor z kontekstu. Byłoby jeszcze lepiej, gdyby wyszukiwarka Google mogła wyszukiwać według surowych wartości binarnych ...

Może spóźniłem się na imprezę, ale ta strona ma Python API i na pewno może wyszukiwać surowe wartości binarne: http://www.binar.ly/search
@AntonKochkov dzięki, wygląda na przeplatający się! szkoda, wydaje się, że indeksuje tylko złośliwe oprogramowanie ...
julian
2020-08-19 04:27:14 UTC
view on stackexchange narkive permalink

Uczenie maszynowe może służyć do identyfikowania docelowego procesora kodu maszynowego z dużą dokładnością. Na przykład narzędzie ISAdetect może zidentyfikować kod maszynowy przeznaczony dla 23 różnych architektur przy użyciu uczenia maszynowego. Istnieje internetowy interfejs API, którego można użyć do załadowania wykonywalnych plików binarnych lub fragmentów kodu maszynowego do analizy przez to narzędzie.

Oto artykuł omawiający techniki implementowane przez ISAdetect:

W kierunku użytecznego automatycznego wykrywania architektury procesora i endianness dla dowolnych plików binarnych i sekwencji kodu obiektowego



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...