Pitanje:
Alat ili podaci za analizu binarnog koda za otkrivanje CPU arhitekture
n3vermind
2013-10-08 16:41:42 UTC
view on stackexchange narkive permalink

Pod pretpostavkom da imam binarnu datoteku s kodom za nepoznati CPU, mogu li nekako otkriti arhitekturu procesora? Znam da to najviše ovisi o kompajleru, ali mislim da bi za većinu CPU arhitektura trebao biti puno CALL / RETN / JMP / PUSH / POP opcode-a (statistički više od ostalih). Ili bih možda trebao potražiti neke uzorke u kodu specifičnom za CPU (umjesto pojavljivanja opkodova)?

Ako imate binarnu datoteku, ali ne znate za koji CPU, kako možete vidjeti * opcode-ove *? Ako znate prevesti s binarnog u opcode, tada već * znate * koji CPU imate. (Ili barem koja obitelj - npr. Z80, Intel, ARM, Motorola MC-680XX.)
Pročitajte čaroliju, a zatim format datoteke.
1) (Stolas) U ugrađivanju često nemate čarolije ili je magija nešto što su oni izmislili.2) (Jongware) Možete vidjeti opkodove (uobičajene obrasce bajtova), a da zapravo ne znate koji su to zapravo na isti način kao i vi može utvrditi je li datoteka komprimirana ili šifrirana, a da je ne može dešifrirati ili dekomprimirati.
@jongware Mislim da brkate _opcode_ s _assembler uputom_.
@n3vermind: .. ako ne znate CPU, kako onda možete biti sigurni da gledate 'opcode'? Na primjer, ARM-ovi bi bili jednostavni (svi opkodovi imaju 4 bajta, a većina započinje s 0xE0), osim što trebate razmotriti Thumb načine rada. Statistički pristup * može * funkcionirati - ali uvijek imate podvojenost koda / podataka koja otežava rastavljanje, čak i kad znate tip CPU-a.
@Jongware u potpunosti si u pravu, ali to je prilično drugačiji problem od problema subjekta. Svejedno, prvo je, po mojem mišljenju, istražiti entropiju binarnog.
Pet odgovori:
#1
+16
woliveirajr
2013-10-08 21:24:59 UTC
view on stackexchange narkive permalink

Kad imate čekić, svi problemi izgledaju poput čavala ...

Proučio sam nešto što se naziva Normalizirana udaljenost kompresije - NCD - prije nekog vremena, i pokušao bih ako bih imao problem sličan vašem.

  1. Napravio bih bazu podataka s primjerima. Trebalo bi 20 programa za svaku arhitekturu koju želite znati, s promjenjivim veličinama, i spremiti ih.

  2. Kada sam se suočio s programom za koji sam želio znati o kojoj se arhitekturi radi, 'Izračunao bih da je NCD prema svim mojim primjerima.

  3. Odabrao bih najbolji (manji) NCD i zatim bih ga provjerio je li to stvarno podudaranje (neka recimo, pokušavam to pokrenuti na otkrivenoj arhitekturi).

Ažuriranje

Uvijek sam to radio u ručno , kada je NCD u pitanju. Kako sam to učinio:

  • imate 20 datoteka za SPARC i nazivate ih A01, A02, A03 i tako dalje. Vaše x86 datoteke: B01, B02 itd.

  • Dobivate nepoznatu datoteku i nazivate je XX.

  • Odaberite svoju preferirani alat za kompresiju (koristio sam Gzip, ali vidi napomene na kraju ovog odgovora).

  • Izračunajte NCD za prvi par:

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

Z (nešto) -> znači da komprimirate nešto pomoću Gzipa i nakon kompresije dobijete veličinu datoteke. Na primjer, 8763 bajta, dakle Z (nešto) = 8763.

XX + A01 -> znači da spajate stvari. Datoteku A01 dodajte na kraj datoteke XX. U Linuxu možete napraviti ´cat XX A01> XXA01´.

min ( ) i max () -> izračunavate komprimiranu veličinu XX i A01 i koristite najmanji i najveći maksimum koji dobijete.

Tako ćete imati NCD vrijednost: ležati će između 0 i 1 i upotrijebite što više decimala možete jer je razlika ponekad u 7. ili 8. znamenci. To će biti poput usporedbe 0,999999887 s 0,999999524.

Y to ćete učiniti za svaku datoteku, tako da ćete imati 20 NCD rezultata za SPARC, 20 za x86 ...

Nabavite manji NCD od svih. Recimo da vam je datoteka B07 dala manji NCD. Dakle, vjerojatno je datoteka nepoznanica x86.

Savjeti:

  • vaša nepoznanica i testne datoteke moraju imati sličnu veličinu. Kada datoteku usporedite s većom ili manjom, NCD to neće učiniti čarobnom. Dakle, ako budete testirali datoteke od 5 do 10 000, dobio bih testne datoteke od 2,5 k, 5 k, 7,5 k, 10 k, 12,5 k ...

  • Na magisteriju sam postizao bolje rezultate uvijek koristeći manju vrijednost NCD. Druga najbolja metoda bila je glasovanje: dobiti 5 manjih rezultata NCD-a i vidjeti koja je arhitektura dobila više glasova. Npr .: manji NCD bili su A03, A05, B02, B06, B07 -> B prošao je 3 glasa, pa bih rekao da je to x86 ...

  • kompresori na Zip konstrukciji imaju ograničenje od 32 KB: način na koji komprimiraju stvari, uzimaju u obzir 32 KB. Ako je vaš XX + A01 veći od ovog, Gzip, Zip itd. Neće vam dati dobre rezultate. Dakle, za datoteke veće od 15 ili 16 kB odabrao bih drugi kompresor: PPMD, Bzip ...

Izvrsna ideja. U prošlosti sam imao dobre rezultate za druge probleme s klasifikacijom.
@woliveirajr imate li prijedlog u vezi s alatom ili knjižnicom za računanje NCD-a? Do sada sam pronašao [CompLearn] (http://www.complearn.org/) uslužne programe koji izgledaju prilično obećavajuće.
@n3vermind Ažurirao sam svoj odgovor: mislim da biste mogli koristiti CompLearn, ali budući da sam želio veću kontrolu (poput kompresora koji ću koristiti), napravio sam mali program koji odgovara mojim potrebama. Objasnio sam kako to radi ...
@woliveirajr Imate li poveznicu na svoj magistarski rad? Volio bih to prijeći
@koukouviou, nažalost, sada ga nisam mogao pronaći (a ionako bi bio na portugalskom). Ali evo jednog članka koji smo o tome napisali: http://www.inf.ufpr.br/lesoliveira/download/FSI2013.pdf - Obavijestite me ako vam mogu pomoći ili pružiti više informacija.
@woliveirajr upravo ono što sam tražio, puno hvala na vašem odgovoru.
#2
+12
devttys0
2013-10-08 18:05:07 UTC
view on stackexchange narkive permalink

Postoje neki alati koji mogu skenirati binarne datoteke kako bi pronašli uobičajene opkodove pronađene u raznim arhitekturama. Binwalk -A opcija to čini, na primjer (skenira ARM / MIPS / x86 i nekoliko drugih arhitektura).

#3
+8
joxeankoret
2013-10-08 18:12:29 UTC
view on stackexchange narkive permalink

Tipično, prvo isprobam najčešće CPU (ARM, PPC, MIPS i AVR), pokušavam utvrditi govori li bilo koji od običnih nizova nešto o procesoru, itd. I, kad sve drugo zakaže, dajem pokušajte ono što tražite: statistička analiza opkodova (ako sam siguran da nije ni šifriran ni komprimiran).

Preporučujem vam da pročitate prezentaciju Aleksandra Černova i Katerine Trošine "Obrnuto inženjerstvo binarnih programa za prilagođene virtualne strojeve". Pisanje alata poput onoga koji su napisali mora biti jako teško (pretpostavljam), ali pisanje alata za pokušaj utvrđivanja koji se CPU čini kompiliranim za korištenje tehnika opisanih u toj prezentaciji nije toliko teško (sve dok možete prikupiti dovoljno uzorci za više različitih arhitektura).

#4
+8
Igor Skochinsky
2013-10-09 01:37:09 UTC
view on stackexchange narkive permalink

Moj lijeni hack: mala Python skripta koja izračunava brojeve bigrama i trigrama. Zatim tražim nekoliko najčešćih sekvenci na Googleu (citirano heksadecimalno). Često uspijem pronaći neka hex odlagališta i mogu shvatiti CPU iz konteksta. Bilo bi još bolje kad bi Google mogao pretraživati ​​po sirovim binarnim vrijednostima ...

Možda kasnim na zabavu, ali ova stranica ima Python API i sigurno može pretraživati ​​sirove binarne vrijednosti: http://www.binar.ly/search
@AntonKochkov hvala, izgleda prolazno! Šteta, čini se da indeksira samo zlonamjerni softver ...
#5
  0
julian
2020-08-19 04:27:14 UTC
view on stackexchange narkive permalink

Strojno učenje može se koristiti za identificiranje ciljanog procesora strojnog koda s visokim stupnjem preciznosti. Na primjer, alat ISAdetect može pomoću strojnog učenja identificirati strojni kod koji cilja 23 različite arhitekture. Postoji web API koji se može koristiti za prijenos izvršnih binarnih datoteka ili dijelova strojnog koda koji će se analizirati pomoću ovog alata.

Evo članka u kojem se raspravlja o tehnikama koje implementira ISAdetect:

Prema uporabljivom automatiziranom otkrivanju CPU arhitekture i opsega za proizvoljne binarne datoteke i sekvence objektnog koda



Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...