Soru:
CPU mimarisini tespit etmek için ikili kod analizi için araç veya veriler
n3vermind
2013-10-08 16:41:42 UTC
view on stackexchange narkive permalink

Bilinmeyen CPU için kod içeren ikili dosyam olduğunu varsayarsak, cpu mimarisini bir şekilde algılayabilir miyim? Çoğunlukla derleyiciye bağlı olduğunu biliyorum, ancak CPU mimarilerinin çoğu için çok fazla CALL / RETN / JMP / PUSH / POP işlem kodu olması gerektiğini düşünüyorum (istatistiksel olarak diğerlerinden daha fazla). Ya da CPU'ya özel kodda bazı kalıplar aramalı mıyım (işlem kodlarının oluşumu yerine)?

İkili bir dosyanız varsa ancak hangi CPU için olduğunu bilmiyorsanız, * opcodes * 'i nasıl görebilirsiniz? İkiliden işlem koduna nasıl çevireceğinizi biliyorsanız, o zaman hangi CPU'ya sahip olduğunuzu * biliyorsunuzdur. (Veya en azından hangi aile - ör. Z80, Intel, ARM, Motorola MC-680XX.)
Sihri okuyun, ardından dosya biçimini.
1) (Stolas) Yerleştirmede genellikle bir sihir yoktur ya da sihir onların icat ettiği bir şeydir. bir dosyanın şifresini çözmeden veya açmadan sıkıştırılmış veya şifreli olup olmadığını belirleyebilir.
@jongware _opcode_ ile _assembler talimatını karıştırdığınızı düşünüyorum.
@n3vermind: .. CPU'yu bilmiyorsanız, 'işlem kodlarına' baktığınızdan nasıl emin olabilirsiniz? Örneğin, dikkate almanız gereken Başparmak modlarınız dışında, ARM'ler kolay olurdu (tüm işlem kodları 4 bayttır ve çoğu 0xE0 ile başlar). İstatistiksel bir yaklaşım * işe yarayabilir * - ancak her zaman CPU tipini bilseniz bile sökmeyi zorlaştıran kod / veri ikilemine sahipsiniz.
@Jongware kesinlikle haklısınız, ancak bu konudan oldukça farklı bir problem. Her neyse, aklıma ilk gelen ikili entropisini araştırmak.
Beş yanıtlar:
woliveirajr
2013-10-08 21:24:59 UTC
view on stackexchange narkive permalink

Çekiciniz olduğunda, tüm problemler çivi gibi görünür ...

Normalize Sıkıştırma Mesafesi - NCD denen bir şeyi inceledim - bir süre önce ve sizinkine benzer bir sorun yaşarsam deneyebilirdim.

  1. Örneklerden oluşan bir veritabanı hazırlardım. Bilmek istediğiniz her mimari için değişken boyutlarda 20 program alıp kaydederdim.

  2. Hangi mimari olduğunu bilmek istediğim bir programla karşılaştığımda, ben "Tüm örneklerime göre NCD olduğunu hesaplardım.

  3. En iyi (daha küçük) NCD'yi seçerdim ve ardından gerçek bir eşleşme olup olmadığını kontrol ederdim (hadi" Diyelim ki, keşfedilen mimari üzerinde çalıştırmaya çalışıyorum).

Güncelleme

elle . Nasıl yaptım:

  • SPARC için 20 dosyanız var ve onlara A01, A02, A03, vb. Diyorsunuz. X86 dosyalarınız: B01, B02, vb.

  • Bilinmeyen dosyayı alır ve XX adını verirsiniz.

  • Sizin tercih edilen sıkıştırma aracı (Gzip kullandım, ancak bu cevabın sonundaki açıklamalara bakın).

  • İlk çift için NCD'yi hesaplayın:

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

Z (bir şey) -> bir şeyi Gzip ile sıkıştırdığınız ve sıkıştırmadan sonra dosya boyutunu aldığınız anlamına gelir. Örneğin, 8763 bayt, yani Z (bir şey) = 8763.

XX + A01 -> bir şeyleri birleştirdiğiniz anlamına gelir. XX dosyasının sonuna A01 dosyasını eklersiniz. Linux'ta bir "cat XX A01> XXA01" yapabilirsiniz.

min ( ) ve max () -> sıkıştırılmış XX ve A01 boyutunu hesaplar ve elde ettiğiniz minimum ve maksimumları kullanırsınız.

Yani bir NCD değeriniz olacak: 0 ile A01 arasında 1'i seçin ve olabildiğince çok ondalık basamak kullanın, çünkü bazen fark 7. veya 8. basamaktadır. Bu, 0,9999999887 ile 0,9999999524'ü karşılaştırmak gibi olacaktır.

Y Bunu her dosya için yapacağız, böylece SPARC için 20, x86 için 20 NCD sonucunuz olacak ...

Hepsinden daha küçük olan NCD'yi alın. Diyelim ki B07 dosyası size daha küçük BOH verdi. Yani, muhtemelen bilinmeyen dosya bir x86'dır.

İpuçları:

  • bilmediğiniz dosya ve test dosyalarınız benzer boyutta olmalıdır. Bir dosyayı daha büyük veya daha küçük olanlarla karşılaştırdığınızda, NCD bunu sihir yapmaz. Yani, 5 - 10k arası dosyaları test edecekseniz, 2.5k, 5k, 7.5k, 10k, 12.5k boyutlarında test dosyaları alacağım ...

  • Master derecemde her zaman daha küçük NCD değerini kullanarak daha iyi sonuçlar aldım. İkinci en iyi yöntem, biraz oylama yapmaktı: 5 daha küçük BOH sonucunu elde etmek ve hangi mimarinin daha fazla oy aldığını görmek. Örneğin: daha küçük NCD'ler A03, A05, B02, B06, B07 idi -> B 3 oy aldı, bu yüzden x86 olduğunu söyleyebilirim ...

  • kompresör tabanlı Zip yapısında 32kB'lik bir sınırlama vardır: nesneleri sıkıştırma biçimlerinde, sadece 32kB'yi dikkate alırlar. XX + A01'iniz bundan daha büyükse, Gzip, Zip vb. Size iyi sonuçlar vermeyecektir. Yani, 15 veya 16kB'den büyük dosyalar için başka bir sıkıştırıcı seçerdim: PPMD, Bzip ...

Harika fikir. Geçmişte diğer sınıflandırma problemleri için iyi sonuçlar aldım.
@woliveirajr NCD'yi hesaplamak için araç veya kitaplık hakkında herhangi bir öneriniz var mı? Şimdiye kadar oldukça umut verici görünen [CompLearn] (http://www.complearn.org/) yardımcı programları buldum.
@n3vermind Cevabımı güncelledim: CompLearn'i kullanabileceğinizi düşünüyorum, ancak daha fazla kontrol istediğimden (hangi kompresörü kullanacağım gibi), ihtiyacıma uygun küçük bir program yaptım. Nasıl çalıştığını anlattım ...
@woliveirajr Yüksek lisans tezinize bir bağlantınız var mı? Üzerinden geçmek isterim
@koukouviou üzgünüm, şu anda bulamadık (ve yine de Portekizce olabilir). Ama burada yazdığımız bir makale var: http://www.inf.ufpr.br/lesoliveira/download/FSI2013.pdf - Size yardımcı olabileceğim veya daha fazla bilgi sağlayabileceğimden lütfen bana bildirin.
@woliveirajr tam olarak aradığım şey, cevabınız için çok teşekkürler.
devttys0
2013-10-08 18:05:07 UTC
view on stackexchange narkive permalink

Çeşitli mimarilerde bulunan yaygın işlem kodları için ikili dosyaları tarayabilen bazı araçlar vardır. Örneğin Binwalk 'un -A seçeneği bunu yapar (ARM / MIPS / x86 ve diğer bazı mimarileri tarar).

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

Tipik olarak, önce en yaygın CPU'ları (ARM, PPC, MIPS ve AVR) denerim, düz dizelerden herhangi birinin işlemci vb. hakkında bir şey söyleyip söylemediğini bulmaya çalışırım ... Ve diğer her şey başarısız olduğunda, ne istediğinizi deneyin: işlem kodlarının istatistiksel analizi (eğer şifrelenmemiş veya sıkıştırılmış olmadığından eminsem).

Alexander Chernov ve Katerina Troshina sunumunu okumanızı tavsiye ederim "Özel sanal makineler için ikili programların tersine mühendislik". Yazdıkları gibi bir araç yazmak çok zor olmalı (sanırım) ancak o sunumda açıklanan teknikleri kullanmak için hangi CPU'nun derlenmiş gibi göründüğünü belirlemeye çalışmak için bir araç yazmak o kadar da zor değil (yeterince toplayabildiğiniz sürece birden çok farklı mimari için örnekler).

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

Tembel hack'im: bigram ve trigram sayılarını hesaplayan küçük bir Python betiği. Daha sonra Google'daki en yaygın dizilerden birkaçını ararım (alıntı onaltılık). Çoğunlukla birkaç onaltılık döküm bulmayı başarıyorum ve CPU'yu bağlamdan anlayabiliyorum. Google ham ikili değerlere göre arama yapabilseydi daha da iyi çalışırdı ...

Partiye geç kalmış olabilirim, ancak bu site Python API'ye sahip ve kesinlikle ham ikili değerleri arayabilir: http://www.binar.ly/search
@AntonKochkov teşekkürler, kesişen görünüyor! çok kötü, yalnızca kötü amaçlı yazılımları dizine alıyor gibi görünüyor ...
julian
2020-08-19 04:27:14 UTC
view on stackexchange narkive permalink

Makine öğrenimi, makine kodunun hedef CPU'sunu yüksek derecede doğrulukla tanımlamak için kullanılabilir. Örneğin, ISAdetect aracı, makine öğrenimini kullanarak 23 farklı mimariyi hedefleyen makine kodunu tanımlayabilir. Bu araçla analiz edilecek yürütülebilir ikili dosyaları veya makine kodu parçalarını yüklemek için kullanabileceğiniz bir web API vardır.

ISAdetect tarafından uygulanan teknikleri tartışan makale:

İsteğe bağlı ikili dosyalar ve nesne kodu dizileri için CPU mimarisinin ve dayanıklılığının kullanılabilir otomatik algılamasına doğru



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...