Soru:
Doğru sökücü nedir?
perror
2013-03-25 22:02:44 UTC
view on stackexchange narkive permalink

Bir sökücünün, ikili programın insan tarafından okunabilir bir temsilini oluşturması beklenir. Ancak en iyi bilinen teknikler: doğrusal süpürme ve yinelemeli geçiş (daha fazlası için bu yoruma bakın) belirli hilelerle kolayca yanıltılabileceği bilinmektedir. Bir kez kandırıldıktan sonra, gerçek program tarafından asla çalıştırılmayacak bir kod çıkaracaklar.

Doğrulukla daha çok ilgilenen yeni teknikler ve yeni araçlar olduğunu düşündü (ör. Jakstab, McVeto, ...), çıktının doğruluğu kavramı sökücüler için bildiğim kadarıyla hiçbir zaman düzgün bir şekilde tanımlanmadı.

Ne olurdu Bir demonte edicinin iyi tanımı, çıktısı için doğru bir doğrulık tanımı ne olabilir ve bu düzeltme tanımına göre mevcut sökücüyü nasıl sınıflandırırsınız?

Bana öyle geliyor ki soruya pratikte kendi kendinize cevap veriyorsunuz. Buna ek olarak, doğruluk ölçütünüz muhtemelen tamamen özneldir. Tam bir derleme yapamayacağınız için, oradan ne yapacağınız tamamen bağlıdır.
Bu, bir sorudan çok bir blog gönderisine benziyor :)
Evet, lütfen bir soru ve cevaba bölün. Kendi sorularınızı * cevaplayabilirsiniz *, bu bir problem değil. Ayrıca, sondaki soru başlıkla eşleşmiyor.
@Emmanuel: lütfen kapanmadan önce yanıtı sorudan ayırın.
bitti (ve karışıklık için özür dilerim). Umarım daha iyi bir cevap olur ...
Yine de bu soru-cevap için uygun değil. Özneldir. Kapanış oylaması.
Sorduğunuz iki sorunun ("Bir demonte edicinin iyi bir tanımı olabilir" ve "çıktı için doğru bir _doğruluk" tanımı ne olabilir), [cs.se] (http: //cs.stackexchange.com/)?
@Jesper: Evet, soramadığım iki soruyu özetlediniz. Ancak, bir sökücü yazılım tersine mühendisliğinde gerçekten bir köşe taşı olduğu için neden buraya yerleştirilmesin?
@Emmanuel, Çoğu RE çalışanı hakkındaki izlenimim (en azından yazılım tarafında, renkli fikirlere dikkat edin), onların kendi kendilerine düşündükleri ve yaptıkları işte çok iyi oldukları yönünde. Bununla birlikte, bu nedenle, akademisyenler arasında iyi bir temele sahip değiller ve uygun bir doğruluk tanımı vermekte zorlanacaklardı. Burada tanım ve doğruluk kısımlarına daha fazla vurgu görüyorum ve demonte edici kısım sadece neyin doğruluğunu tanımlayacağına dair bir örnek. Bu bir tartışmaya dönüşmeli veya herhangi bir insanı karalama girişimi olarak görülmelidir.
@Jesper, muhtemelen haklısınız (önceden niyetim olmasa bile). O halde bu soruyu kapalı tutalım. Bu karara katılıyorum.
Bazı olumsuzlukları unuttum. Açıkçası satır boyunca bir şeyler yazmak niyetindeydim: "Bu bir tartışmaya dönüşmeyi ** amaçlamadı ** ya da herhangi bir insanı karalama girişimi olarak görülmeli".
Iki yanıtlar:
#1
+16
endeavor
2013-03-26 00:02:55 UTC
view on stackexchange narkive permalink

rdis kitabının yazarıyım ve bu problemi biraz düşündüm. Bundan sonra başka sorularınız varsa bloguma göz atmanızı öneririm.

Ayrıca sizi Andrew Ruef'un Binary Analysis Isn't blog gönderisine de yönlendireceğim. a>. Temel çıkarım, programlarımızı genellikle derleyiciler bağlamında anlamaya çalışmamızdır ve sadece bir talimatlar sürekliliği olarak değil. Sökücülerimizde aşağı yukarı ulaşmaya çalıştığımız şey olan "Derleyici Çıktı Analizi" terimini kullandı.

Terimler ve Tanımlar

Ortak terim tanımlarınızla baştan başlayın sökmek için. Hafızadan, kayıtlardan ve tüm iyi şeylerden oluşabilen verilerimiz veya durumumuz var. Makinenin yürütmesini beklediğimiz verilere uyguladığımız bir etiket olan kodumuz var (koda geri döneceğiz). Bir makine tarafından yorumlandığında verinin belirli bir şekilde manipüle edilmesine neden olan verilerde kodlanmış bir algoritma olan bir programımız var. Bir durumu diğerine eşleyen bir makinemiz var. Amaçlarımız doğrultusunda, zaman içinde tek bir noktada var olan ve makinemizin verileri işleme şeklini kontrol eden belirli veri parçalarından oluşan talimatlarımız var.

Çoğu zaman amacımızın, verilerin dönüşümü olduğuna inanıyoruz. kod, makine tarafından yürütülmesini beklediğimiz veriler, okunabilir bir demonte halinde. Bunu, Kontrol-Akış Analizi (Kod) ve Veri Akışı Analizi (Veri) arasındaki program analizi bölümümüz nedeniyle yaptığımıza inanıyorum. Program analizinde, kodumuz durumsuzdur ve verilerimizin durumu vardır. Gerçekte, kodumuz sadece veridir, hepsinin durumu vardır.

Program Kurtarma

Bunun yerine, amacımız makineyi gözlemleyerek veya tahmin ederek programı kurtarmak olmalıdır. Başka bir deyişle, verileri okunabilir bir parçaya dönüştürmekle değil, makinemiz tarafından yorumlanacak talimatları keşfetmekle ilgileniyoruz.

Ek olarak, programa ilişkin temsilimiz, genellikle yürütülebilir dosyamız (ELF / PE / MACH-O) tarafından bize verilen ilk bellek düzeni olan durumsuz veri temsilimizden ayrı saklanmalıdır. /vb). Gerçekten, yönlendirilmiş bir grafikte saklanmalıdır. Talimat olarak etiketlenmiş birden çok konuma sahip belleğin doğrusal bir temsilini gördüğümde, kapatıyorum. Henüz bilmiyorsunuz!

Sökme işleminin bir sonraki adımının, sökme işlemi sırasında durum değişikliklerine izin vererek makineler hakkında daha iyi tahminler yapan süreçler içerdiğine inanıyorum. Hem sökme hem de soyut sökme taklit edeceğimize inanıyorum. Kullanılabilir ve anlaşılır "program kurtarmaları" yaratmak amacıyla bunu açıkça yapanlardan emin değilim.

Farkın bir örneğini görebilirsiniz. bir programın özyinelemeli demontajı ile bir programın benzetilmiş demontajı arasında burada.

Doğru sökücü nedir?

Şimdi sorunuzu yanıtlamak , "Doğru sökücü nedir?" Doğru bir sökücünün, program kurtarma sürecinin davranışını açıkça tanımlayan ve bu tanıma uyan biri olduğuna inanıyorum. BUNU yapan sökücüler elde ettiğimizde, programları kurtardıkları makinelerin davranışını en iyi tanımlayanlar daha iyi sökücüler olacaktır.

#2
+1
perror
2013-03-25 23:29:05 UTC
view on stackexchange narkive permalink

Bir sökücü nedir?

Bir sökücüyü iki parçaya ayırırdım, ilk olarak onaltılık bir kod alan ve bir montaj talimatı veren bir kod çözücü (muhtemelen uzunluğu derleme dili değişken uzunluklu talimatlara sahipse kodu çözülmüş talimat). Ve sonra, çalıştırılabilir koda göz atmak için kod çözücüyü kullanacak bir sökme algoritması .

Benim mütevazı görüşüme göre bir sökücünün genel amacı, tüm verileri kurtarmak olacaktır. belirli bir yürütülebilir dosyadan oluşturulabilen ve onu kısa ve insan tarafından okunabilir bir biçimde sunulabilen olası çalıştırmalar.

Demontajda sorunlar

Bir sökücünün sökerken karşılaşabileceği birçok sorun vardır ikili bir program. En zorlarından biri, kendi kendini değiştiren kodla uğraşmaktır. Gerçekten de, şimdiye kadar kendi kendini değiştiren program için insan tarafından okunabilir gerçek bir temsil yok. Dolayısıyla, kendi kendini değiştiren bir kodla karşılaştıklarında tüm parçalayıcılar, açıkça anlaşılabilir bir şey çıktığında perişan bir şekilde başarısız olurlar.

Bir sökücüyü durdurabilecek ikinci sorun, ikili programın zaman zaman başka bir yere atlayarak bazılarını yürütmesidir kod (işlev çağrıları, if-then-else, anahtarlar, ...). Ve bu atlamaların çoğu statik ise (atlanacak adres statik olarak koda kodlanmışsa), yürütme bağlamına bağlı olarak bazı sıçramalar vardır. Bu sıçramalara genellikle dinamik sıçramalar diyoruz ( statik sıçramaların aksine). Bu dinamik sıçramalar, demonte ediciyi yalnızca talimatların sözdizimini değil, aynı zamanda onunla karşılaşıldığında kaybolmamak için anlamlarını da izlemeye zorlar.

Son olarak, son bir sorun, tüm ikili programların, işlev çağrıları için kesin bir arabirim veya veri yapılarını ele almak için bir yol tanımlayan kesin bir ABI'yi (Uygulama İkili Arabirimi) takip ettiğinin varsayılamamasıdır. Aslında, bazı ikili programlar ya elle ya da sökücüleri yanıltmaya çalışacak değiştirilmiş bir derleyici ile hazırlanmışlardır. Bu nedenle, sökücünün bir işlev çağrısını yalnızca sözdizimiyle değil, anlamıyla da tanıması gerekir.

Bir sökücünün doğruluğu

Daha önce de belirttiğimiz gibi, bir sökücünün nihai hedefi bir ikili programdan tüm olası yürütme izlerini yeniden oluşturmaktır. Elbette, çoğu zaman bu son derece zordur, bu nedenle üç tür sökücü tanımlayabiliriz:

  • Tam sökücü : Varsayımsal olarak, tüm doğru izleri vermelidir ikili programda çalıştırılabilir ve yalnızca bu izler.
  • Aşırı yaklaştırılmış sökücü : Bunun çıktısı, olası tüm bilgileri içermelidir . izler, muhtemelen fazladan olanlarla.
  • Az yaklaştırılmış sökücü : Bunun çıktısı olası izlere dahil edilmelidir , ancak hiçbir uygulanabilir olmayanlar.

Mevcut teknikler ve bunların nerede sınıflandırılacağı

Şimdilik en popüler iki teknik doğrusal süpürme ve yinelemeli geçiş (daha fazla ayrıntı için buraya bakın).

Her ikisi de vahşi doğada çok sayıda tersine mühendis tarafından oldukça yaygın olarak kullanılmaktadır. Ancak, aslında, bu tekniklerin hiçbiri ne kesin, ne aşırı yaklaştırma ne de eksik yaklaşım değildir. İkisi de daha önce gördüklerimizden hiçbiri olmayan bir şey çıkarıyorlar (bazen asla ulaşılamayacak bir yol icat edecekler ve bazen başka bir yolu unutacaklar).

Doğrulukla ilgili daha fazla endişe içeren daha gelişmiş teknikler mevcuttur (ör. Jakstab, McVeto, kendi kendini değiştiren kod üzerine McVeto, ... ), ancak tam iyileşme arayışı kesinlikle ulaşılamaz.

Bu nedenle, altında ve fazla yaklaşık güçlü arasında seçim yapmak > sökücü çıktısının kullanımının ne olacağına bağlıdır.



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...