İkilik Diff ve Sembol İcra: Eşleşen Fonksiyonlar ve Girdiler için Çözüm
Type: Build
Languages: Python, C, x86-64 assembly, Java (one Ghidra script)
Prerequisites: Phase 13 · 33 (disassembly and control flow), 34 (lifting to pseudocode), 36 (rebuild and prove equal)
Time: ~150 minutes
Öğrenme Hedefleri
- Bir nesnenin ve listelenmesinden beş işlev imza oluşturun: tam baytlar, maskeli yerleşim alanları olan baytlar, mnemonik dizisi, akış-grafi şekli ve sembol adı.
- BinDiff tarzındaki açgözlülükle düzenlenen bir maç çalıştırın, burada bir imzanın sadece her iki tarafta eşsiz olduğu zaman eşleşir ve her maçın arkasındaki aşama ve kaliteyi kaydetin.
- İki byte-içinli fonksiyonun yüklenmiş görüntülerde byte korelatörü eksik olduğu durumunu yeniden üretin ve değiştirilen dört byteyi açıklayan yer değiştirme aritmetikası ile maskeliştirildikten sonra geçin.
- Radiff2'nin benzerlik oranlarını Levenshtein mesafesinden yeniden üretin ve bir oranın neden yalnızca 82 byte radare2 elde edildiğinde göründüğünü açıklayın.
- Küçük bir IR üzerinde bir fonksiyonun yollarını sayın, yol başına bir koşul taşıyin ve sınırlı bir arama ile girişler için her yaprakı çözün.
- Simvolik bir sınırlı bir döngü üzerinde yol patlama ölçüm ve sayılar, sınıflar ve modelleri angr 10.0.3 ve z3 5.1.0 ile karşılaştırın.
Sorun
Yeniden inşa ettin .ledger.c- ...-O2Ve bir ajanı sormuştu , ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...-O1Ajan bir farklılık yaptı ve rapor etti kigradeBu programın altındaki 46 byet, mevcut olmayan bir değişimi açıklamak için bütçesini harcadı.gradeBu iki nesne dosyasında aynı görüntüleri kullanır..rodata -O2Program, yani bir yer değiştirme grade0x70 oranında büyümüş.
Aynı öğleden sonra hangi puanı istediğini sordun .gradeBu bir cevap. fonksiyon 90 ila 109 arasındaki her puan için 4'ü gönderir. Sorunun bir sınırlılığı yoktu, bu yüzden ajanın cevabı bir örnekti.
Bu ders, iki yöntemi standart kütüphane Python'da inşa eder ve bunların yanında üretim araçlarını çalışır. Araçlar ve kod anlaştığında iki türden çıkış vardır. Anlaşmaz olduklarında bir adres, bir bayt veya bakmak için bir bağ vardır.
İşlev İmzası - Bir Kaliteli İddia
Flake 2004 yılında iki benzer yürütülebilir fonksiyon kümesi arasındaki izomorfizmin yapımı olarak ikili farklılık çerçevesini oluşturdu. Dullien ve Rolles 2005 yılında temel bloklara ve talimatlara kadar genişletti. BinDiff kavramlar sayfası, bu çalışmanın ortaya çıkardığı stratejiyi açıklar. Her iki tarafta da her fonksiyon için bir özelliği hesaplayın. Her tarafta tam olarak bir kez görünen bir değer eşleşir. Birden fazla kez görünen bir değer belirsizdir ve bu eşdeğerlik sınıfı içinde bir sonraki özelliği ile aşağıya çekilir. Eşdeğersiz bir değer eşsiz kalır. Her geçitten sonra, yeni eşleşmelerin çağrıcıları ve çağrıcıları, bir sonraki özelliğin benzersiz olması muhtemel olan küçük kümeler oluşturur ve işlem bir sonraki özelliği ile tekrarlanır.
Her eşleşen algoritmanın bir kalitesi vardır. Sayfalar çiğ fonksiyon baytlarının ve isimlerin eşleşmesi ile eşleşme ile çok iyi, akış-grafi MD indeks ve baş imza eşleşmesi (her bir mnemonik küçük bir baş, fonksiyon üzerinde ürün) iyi, dizileri referansları ortalama olarak ve döngü sayısı veya adres dizisi kötü olarak değerlendirir. Bir maçın güvenliği, onu üreten algoritmaların ortalama kalitesi, bir sigmoid ile ağırlaştırılır. Fonksiyon benzerliği yaklaşık %25 eşleşen akış grafik kenarları, %15 eşleşen temel bloklar, %10 eşleşen talimatlar ve %50 güvenilirlikle çarpılan akış grafik MD indeksindeki farkdır.
Bu ders, bu özelliklerden beşi ve önemli olan tek kuralı korur: her iki tarafta da benzersiz veya eşleşmez. MD indeksini düşürür, çünkü kavram sayfaları formül olmadan isimlendirir ve yerine basit bir derece dizisini kullanır. Kalite etiketleri kalır, çünkü eşleşme sadece onu üreten en zayıf gerçek kadar iyidir.
Bir fonksiyon kaydından Beş İmza
Farklılık her nesne için iki şeyi okur. ELF bayt, sembol boyutları ve .rela.*Kayıtlar.llvm-objdump -dlisting talimat sınırları ve mnemonik verir ve ders 33 bu nesnelerin her talimat üzerinde listede eşittir dekoder kanıtladı. function_record()listelenen talimatların baytlarının bu adresdeki nesnenin baytlarına eşit olduğunu kontrol eder ve başka bir şekilde yükselter.
Al .gradeİçerideledger-x86_64-O1.oSimbolde 0x10 ve boyut 46 oranında sıfırlama yazıyor . Bu yüzden kayıt 0x10 ile 0x3e arasında yer alır ve iki baytı hariç tutulur .nopBu da bir sonraki fonksiyonu düzeltir.
Bu sayede, bu sayede, bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binanın altındaki bir binin altının altındaki bir binin altının altındaki bir binbinte bir binin altındaki bir binin altının altındaki bir binbinte bir binin altındaki bir binin altının altındaki bir binbinte bir binin altının altındaki bir binbin altındaki bir binbinte bir bin bin bin bin binin altının altının altındaki bir bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin bin binR_X86_64_PC32 .rodata+0x100x36'da, dört byte genişliğinde, leaq (%rip), %rcxRELA nesnesinde bu dört bayt zaten sıfır tutar, bu yüzden iki imza burada her nesnenin her fonksiyonuna katılır.
Mnemonik imzası 14 mnemonik sekansını hash eder:
movslq imulq movq sarq shrq addl addl xorl cmpl ja movl leaq movl retqAkış grafik şekli imzası, girişin ulaşabileceği bloklara sınırlı olan ders 33'ün temel bloklarından ve tiplenmiş kenarlarından gelir. grade- ...-O10x10 blokları, 3 blok ve 3 kenarı ile tamamlanır.ja 0x3dAlınan kenar ve düşme kenarıyla, blok 0x31 0x3d'ye düşer ve 0x3d geri gelir. Derece dizisi blok başına sıralanmış bir sırada (girin, çık) listeler yapar, böylece imza okur 3b 3e [0/2,1/1,2/0]- Evet .grade- ...-O0Kayıt , beşinci sıçrama yoluyla indirek sıçramaları çözüyor ..rela.rodata33 dersinde olduğu gibi girişi yapar. Bu da sekiz blok ve dört ile on bir kenar verir.tableKenarları.
İsim imzası, sembol adı, var olduğu zaman en güçlü gerçek ve yapı çıkarıldığında hiçbir şey.
Bir fonksiyonun bir lea.rodata, bir sınır kontrolü ve bir indeks yükü,referenced_table()Tablo 36 dersinde olduğu gibi okunuyor:cmpl $0x4Daha öncejaBeş tane giriş ve yük verildi.movl (%rcx,%rax,4), %eaxHer biri 4 byte verir.grade- ...-O1.rodata+0x14okur 1, 2, 3, 4, 4- Evet .
Açgözlü Eşyacı
match_functions()Bu sayede, her aşamada tam olarak bir işlevi olan her değer kabul edilir. maç aşama, aşamanın kalitesi, aynı zamanda aynı olan diğer her imza ve benzerlik oranını kaydeder.
for stage in order:
for signature, candidates in left_groups.items():
partners = right_groups.get(signature, [])
if len(candidates) != 1 or len(partners) != 1:
continue
a, b = candidates[0], partners[0]
agreeing = [s.id for s in STAGES if a.signatures()[s.id] == b.signatures()[s.id]]
matches.append(Match(a, b, stage, agreeing, radare2_ratio(a.raw, b.raw), data_equal))Ders sırası, ilk olarak dört yapısal aşamayı ve son olarak isimleri yürütür, böylece yapısal aşamalar test edilir ve isimler onları daha sonra sınıflandırır.-O1-O2- ...
| Function | Stage | Agreeing signatures | Similarity |
|---|---|---|---|
percent_change | exact bytes | all five | 1.000 |
grade | exact bytes | all five | 1.000 |
total | name | name only | 0.171 |
grade_label | exact bytes | all five | 1.000 |
totalClang, 31 byte ve 13 talimattan 140 byte ve 41 talimatlara yükseldi, çünkü clang, bu döngüyü SSE2 ile vektörleştirdi ve bir skalar kalıntı döngüsü korudu.
- Evet .
-O0-O1Aynı sırada bir yanlış eşleşme oluşur:
| Function at -O0 | Matched at -O1 | Stage | Names agree |
|---|---|---|---|
percent_change | grade_label | flow-graph shape | no |
grade | grade | name | yes |
total | total | name | yes |
grade_label | unmatched |
percent_change- ...-O0Dört bloklu bir elmas: bir giriş ki dalları before == 0Bu da bir arıza, iki kol ve bir birleşim.0/2, 1/1, 1/1, 2/0- Evet .grade_label- ...-O1- Evet .gradeBu nedenle, bir diğer değerli değerli değerler, yani değerli değerler, değerli değerler ve değerler, değerli değerler ve değerler ile ilgili olarak, değerlendirilmiş değerler ve değerler ile ilgili olarak, değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler ile değerlendirilmiş değerler arasında bağlantılıdır.grade_labelSağda, yani gerçekpercent_changeve grade_labelÇiftler eşsiz kalır.
BinDiff siparişi gerçek isimlerin var olduğu ikinci aşama olarak isim eşleşimi yürütür ve BINDIFF_ORDERBu şekilde dörtü de aynı şekilde.-O0fonksiyonları eşleşir.-O1Ghidra'nın aşağıdaki raporları, Ghidra'nın aşağıdaki sonuçları olan isimle versiyonları belirler. Ders, her iki siparişini de demo'da tutar, böylece başarısızlık görünür.ifve elseGeri dönmeden önce bir araya gelir.
Aynı baytlar, yer değiştirilmiş operatörler
Ghidra bir nesneyi ithal ettiğinde yer değiştirme uyguluyor. Bu nedenle byte korelatörü yüklenmiş görüntüleri karşılaştırır ve ders 36 maskeli yer değiştirme alanları bu nedenle. load_image()Üretimleri, bölgeleri başlık sırasıyla gösterir, her bir bölümün kendi başlıklarına uyum sağlayarak sh_addralign, ve 0x100000'den sonra her kayıt uygulanır:S + A - P32 bitlik bir değer olarak yazılmış .R_X86_64_PC32ve R_X86_64_PLT32- Evet .S + A64 bit olarak R_X86_64_64- Evet .
Düzenleme, her iki programda her bölümün başlamasındaki Ghidra 12.1.4 ile uyumludur. Test süiti, alınan Versiyon Takip çıkışına karşı kontrol eder:
| Section | -O1 program | -O2 program |
|---|---|---|
.text | 0x100000, 159 bytes | 0x100000, 271 bytes |
.rodata | 0x1000a0 | 0x100110 |
.rodata.str1.1 | 0x1000f0 | 0x100160 |
.text112 byte daha uzun -O2, total- Evet ..rodata0x70 bayt daha ileriye başlar. gradeHer iki programda 0x100010'da oturuyor.leaq0x33'te, 0x36'da ve 0x3a'da sona erer..rodata+0x14- Evet .
- Evet .
-O1Resim:0x1000a0 + 0x14 - 0x10003a = 0x7a = 122- İçeride .-O2Resim:0x100110 + 0x14 - 0x10003a = 0xea = 234- Alan baytları7a 00 00 00Bir görüntüde veea 00 00 00Bu da bir diğerinden farklıdır. 46'ın bir baytı farklıdır, Levenshtein oranı 0.978, ve tam bayt aşaması başarısız olur.grade_labelBu sayede, masa ile aynı 0x70 ile hareket eder, böylece yer değiştirme oranı eşit kalır ve her iki bakışta da tam baytlar ile geçer.
Ghidra aynı bölünmeyi rapor ediyor.-O1-O2, Tam fonksiyon byte eşleşimi bulundu percent_changeve grade_labelTam fonksiyon talimatları eşleşirken bu iki kişiyi bulduk .grade, ve Tam Fonksiyon Mnemonik Uyumları aynı üçü bulmuştur. Görev korelatörü, yer değiştirmeyi kapsar. Dersin görüntü görüntüsü, Ghidra'nın bayt korelatörü bulduğu iki fonksiyon için tam-bayt eşleşmelerini ve talimat korelatörü bulduğu tam üç için maske-bayt anlaşmasını verir. Test kümesi her iki eşitliği de doğruluyor.
6.5.0 rea'lar compare_functionsBu dersdeki yükleme cihazı ve maske bu normallaşmayı sağlar.
Hangi tedbirler
6.2.4 radar gemileriradiff2- Evet .-ACDosyaları analiz eder ve her fonksiyona bir satır yazdırır: sol boyut ve adres, MATCH veya UNMATCH, bir oran ve sağ boyut ve adres.
| Pair | percent_change | grade | total | grade_label |
|---|---|---|---|---|
-O0 vs -O1 | UNMATCH 0.130435 | UNMATCH 0.426829 | UNMATCH 0.106061 | UNMATCH 0.269841 |
-O1 vs -O2 | MATCH 1.000000 | MATCH 1.000000 | UNMATCH 0.171429 | MATCH 1.000000 |
-O1 vs -O1 | MATCH 1.000000 | MATCH 1.000000 | MATCH 1.000000 | MATCH 1.000000 |
Radar2 kaynağının oranı 1 - distance / max(len_a, len_b), burada iki fonksiyonun parmak izi ile parmak izi arasındaki Levenshtein mesafesi fonksiyonun temel bloklarının adres sırasındaki bağlanmasıdır.radare2_ratio()İçeridecode/main.pyçiğ fonksiyon baytları üzerinde aynı formülü uyguluyor ve 0.130435, 0.106061, 0.269841, ve 0.171429'u altı onluklara kadar yeniden üretir.
0.426829' u çoğaltmıyor.grade- ...-O0. Fonksiyonun 118 bayt üzerinde oran 0.296610. radar 2 baskılarıdır 118Bu nedenle, analiz giriş blokuna ulaşır, blok sonunda jmpq *%rax, öntanımlı durum ve geri dönüş: 82 byte, ders 33'ün düz geri dönüşsel düşüşü iddia ettiği aynı 82 .-O147'e kadar.1 - 47/82 = 0.426829- Evet .-e bin.relocs.apply=trueradar2 tüm 118 baytı bulur ve 0.288136 yazdırır. Bu, dört yer değiştirme baytının nesnenin sıfır alanlarından farklı olduğu yer değiştirilen görüntüler üzerindeki ders oranına eşittir.
-OParmak izi opkod baytlarına sınırlandırır ve operandları sıfırlandırır.-O0karşılaştırıldığında-O1Bu oranlar 0.239130, 0.512195, 0.303030 ve 0.523810'a yükseldi.total- ...-O1karşılaştırıldığında-O2Tüm dosya mesafeleri de var: -s(Myers) benzerlik 0.956 ve iki nesne arasındaki mesafe 162 rapor ediyor.-ssBu sayılara başlıklar, sembol tabloları ve yer değiştirme bölümleri dahil.
Ghidra Versiyon Takip Korellatörleri
Ghidra'nın Versiyon Takip aracı, kaynak programını bir hedef programına ilişkili bir programla eşleştirir. Fonksiyon korelörleri, Tam Fonksiyon Bytes Düzeneği, Tam Fonksiyon talimatları Düzeneği (maskeli operandlar), Tam Fonksiyon Mnemonik Düzeneği ve Duplikasyon Fonksiyon talimatları Düzeneği (1:N ve N:M). Veriler ilişkilileri Tam, Duplikat ve Benzer Veriler Düzleşir. Sembol ilişkileri isimlerle aynı şekilde, kopya olarak veya benzerlik ile eşleşir. Referans korelatörleri daha fazla bilgi bulmak için kabul edilen eşleşmeleri kullanır. İşlevler hedef programda tanımlanmalıdır ve en az işlev uzunluğu 10 bayt'a varır. Otomatik Versiyon Takip, Tam Simbol Adı, Tam Veriler, Tam Fonksiyon Bytes, Tam Fonksiyon talimatları, Tam Fonksiyon Mnemonikleri, Çift Fonksiyon talimatları, sonra bir referans korelatörü çalıştırır ve kabul edilenler için içten eşleşmeler oluşturur. 11.2'de BSim korelatörü eklendi.
Ders, ilişkileri başsızca yakaladı.capture_ghidra_vt.shÜç nesneyi bir projeye aktarıp çalıştırır.ListVersionTrackingMatches.java, kısa bir senaryo .AbstractGhidraVersionTrackingScript, kaynak ve hedef programlarını yolla açar, Otomatik Versiyon Takip sırasındaki altı referans olmayan korelatörleri çalıştırır ve blok, işlev, korelatör ve eşleşme başına bir satır yazdırır. Bu bölümdeki her sayı bu iki metin dosyasından gelir.
| Correlator | -O0 to -O1 | -O1 to -O2 |
|---|---|---|
| Exact Symbol Name Match | 4 functions | 4 functions, 5 data items (labels.rel, .L.str.1 to .L.str.4) |
| Exact Data Match | 0 | 0 |
| Exact Function Bytes Match | 0 | 2 (percent_change, grade_label) |
| Exact Function Instructions Match | 0 | 3 (adds grade) |
| Exact Function Mnemonics Match | 0 | 3 |
| Duplicate Function Instructions Match | 0 | 0 |
Arada her fonksiyon değişmiş .-O0ve -O1Bu nedenle, bu sayfa, tüm benzerlikleri 1.0 ve güven 1.0 olarak tanımlar. Bu nedenle, basılan güven ölçeği, bu dersin kaydettiği açık bir sorudur ve çözülmez.
Program Farkları, Aletler altında farklı bir şeydir. Aynı adres alanı olan iki programı aynı adreslerde byte, etiket, kod birimleri, referanslar, yorumlar ve işlevlerle karşılaştırır.
Diaphora ve Binary Ninja, Belgelerinden
Diaphora, ilk olarak 2015 yılında ve 2026-08-18 tarihli sürüm 3.4.2'de yayınlanan bir IDA Pro eklentisidir. 2.0'dan beri AGPL-3.0'dur ve IDAPython'a ihtiyaç duyar, bu yüzden IDA Home veya IDA Pro'da çalıştırılır ve IDA Free'da değil. Her veritabanını SQLite'ye ihraç eder ve heuristiklerini SQL sorguları olarak çalışır. Her heuristik bir isim, en iyi, kısmi veya güvenilir olmayan bir kategorinin, oran türünün ve SAME_CPU veya SLOW gibi seçmeli bayrakların vardır. Mevcut kaynaktaki isimler, bu dersin aşamaları gibi daha fazla okunuyor: Bytes hash, Aynı adres ve mnemonics, Aynı temizlenmiş birim, Mnemonics küçük prim ürün, Aynı düğümler, kenarlar, döngüler ve güçlü bağlantılı bileşenler, Topolojik sıralama hash, ve Hex-Rays dekompilerine ihtiyaç duyan pseudo-kod bulanık hashler. Yayın notları ayarlama tarihini gösterir: yavaş heuristikler sadece yaklaşık 2.000 fonksiyonun altında çalışır ve "Eşit grafik" güvenilir olmayan kategorilere taşındı. Bu hareket, bu dersin dört bloklu elmasıdır.
2026-09-03'te yayınlanan Binary Ninja 6.0, sağlayıcılar ve çözücülerle bir çerçeve olarak Binary Similarity'yi ekledi. BinDiff'i, yer değiştirülebilir operandlara dayanan tam fonksiyon eşleşmeleri için yapısal bir sağlayıcı ve WARP olarak gönderir ve rehberinin, yer değiştirülebilir talimatlardan ayrı fonksiyonlar eşleştiklerinde WARP'yi ve yeniden birleştirildikten sonra yapısal olarak ilişkili kaldığında BinDiff'i kullanmalarını söyler. Özellik sadece Ultimate baskısında. Binary Ninja'nın burada paket yöneticisi bulunmuyor ve çalıştırılmamıştır. Bu paragraf, onun belgelerinden ve başka hiçbir şeyden alınmıştır.
BinDiff, Apache 2.0'da 2023-09-25'ten beri açık kaynaklı bir uygulama olarak kullanılıyor. Son sürümle v8. Bir sökme cihazı ve IDA Pro 9.4 veya daha sonraki, Binary Ninja ve Ghidra'yı destekleyen BinExport eklentisine ihtiyaç duyuyor. Bir öğrenci için ücretsiz yol Ghidra artı BinExport artı BinDiff komut satırı. Ders onu çalıştırmadı ve pratik laboratuvarı bunu sizden istiyor.
Aynı Kod, Farklı Sürekli
Ders 36 bir aday yeniden inşa etti gradeTablosunun son girişinde 3 olduğu, orijinalinde ise 4 olduğu. grade_case10_wrong.oAynı 46 kod bytesine sahip grade- ...-O1.Matcher, her imzanın onayladığı tam baytlara eşleştiriyor.1, 2, 3, 4, 4Tek bir yer değiştirme yoluyla ve1, 2, 3, 4, 3Diğerleri ve raporlar dataEqual: falseDiğer üçü .-O1sol tarafta eşsiz fonksiyonlar vardır, çünkü aday nesne bir fonksiyonu tutar.
Bu, yama analiz şeklidir. Byte'lerde durur ve hiçbir şey değişmediğini söyler. Ghidra'nın Tam Veri Düzeneği ve BinDiff'in İpucu-Stream Reference Düzeneği aynı nedenden dolayı var. Dersin versiyonu küçüktür: her eşleşen çift için, her fonksiyonun yer değiştirme noktası olan byte'leri, sınırların sayısını ve yükün genişliğini kontrol ederek karşılaştırın.
Simvolik İdam: Yollar, Koşullar, Çözücüler
King, 1976'da sembolik yürütmeyi tanımladı. Girişler semboller haline gelir. Her ifade sembolik bir depoya güncellenir. Her dal yoluna bir koşul ekler ve çözücü yolun uygulanabilir olup olmadığını belirler ve ardından bir beton giriş üretir. Dalları olan bir işlev yol ağacı olur ve bir yaprak bir koşulla bir dönüştür.
Baldoni, Coppa, D'Elia, Demetrescu ve Finocchi 2018 yılında bu alanı araştırmışlardı. Bölüm 5'te, yol patlaması merkezi maliyet olarak adlandırılır: bir yürütücü her dalda çatlak yapabilir, bu nedenle devlet sayısı dal sayısında eksponansiel olarak büyüyebilir ve bir döngü, sınırları sembolik bir girişten bağlı olan bir döngü sınırsız bir yol kümesi verir. Listelerindeki hafiflemeler, her dalda çözülmeyen yolları kesmek, fonksiyon ve döngüler için özetler, devlet birleşimi ve az yaklaşım. Konkoloş yürütme, programı bir anda, konkret ve sembolik olarak çalıştırır, beton çalışması boyunca koşulları kaydeder, birini reddeder ve çözücüden bir sonraki giriş için sorar. DART (2005), CUTE (2005), ve SAGE (2008) isimlendirilmiş sistemlerdir.
KLEE (Cadar, Dunbar, Engler, OSDI 2008) LLVM bitkod üzerinde sembolik bir sanal makine, bu nedenle girişleri clang -emit-llvmKLEE 3.2'nin, NCSA lisansı altında 2025-12-23'te yayımlandı ve LLVM 16 önerildi.
Angr ikili işlemlerde çalışır.angr.Projectnesneyi haritalayan ve yer değiştirme uygulayan bir CLE yüklemeci, bir bloku VEX IR'ye dönüştüren bir kaldırıcı (block.vex) ve devletler için bir fabrika ile alternatif olarak pypcode ile.SimStateKayıtlar, hafıza ve çözücü.SimulationManagerAdlı devletlerin adımları active- Evet .deadended- Evet .found- Evet .avoidedveerroredveexplore(find=..., avoid=...)Çelişki, Z3 üzerinde çözücü ön ucudur ve Angr 10.0'da ise ithalat edilen bir Rust uygulamasıdır.from angr import claripy. angr 10.0.3 2026-10-10'da yüklendi, BSD-2-Clause'dir ve Python 3.12 veya daha sonraki bir program gerektirir. MIT'in 2026-08-16 altında yayınlanan Z3 5.1.0, angr, Triton ve KLEE'nin seçmeli arka uçlarının arkasındaki çözücüdür.
Ders Üzerinde Küçük Bir İnkârcı 34 IR
İdamcı ,code/main.pyDersin ifade şekilleri ile küçük bir IR kullanıyor:Assign- Evet .Branch- Evet .Jump- Evet .Return, artı SwitchDers 34'ün Pratik Laboratuvarı'nın istediği terminatör.Const- Evet .Var- Evet .Bingenişliği ile, Cast- Evet .LoadAdlı bir beton masadan, ve Not. Dört sabit işlev basitleştirilmesinden sonra ders 34'ün ulaştığı seviyede el ile kaldırılır.0x66666667katılaştırmak oldu score / 10, ve her IR blokundan gelen talimat adresleri listelenir.check_ir_against_listing()adreslerin fonksiyonun listesini tam olarak bir kez kapsadığını belirtir.
grade- ...-O0Bu IR'de:
0x30: local_8 = score; local_10 = score / 10 - 6; if (local_10 >u 4) goto 0x9a else 0x62
0x62: switch local_10 -> 0x91, 0x88, 0x7f, 0x76, 0x76
0x76: local_4 = 4; goto 0xa1 0x7f: local_4 = 3; goto 0xa1
0x88: local_4 = 2; goto 0xa1 0x91: local_4 = 1; goto 0xa1
0x9a: local_4 = 0 0xa1: return local_4Değişken hedefler jump_table_targets(), 33 ders ile aynı yer değiştirme aritmetikası, IR'nin sabitlemeyi okuduğu gibi.
execute()Bir durum, mevcut blok, blokların izleri, koşul listesi ve her değişkeni girişlerin üzerinde bir ifadede haritası yapan bir ortamı içerir. AssignÇevreyi kaynağa değiştirir ve sonucu saklar. BranchBu durumda, solver, solver'in yerine getirmesini ve solver'e iki kez sormasını ister: bir kez koşul eklenmiş, bir kez ise negatifleştirilmiştir.SwitchTablo girişlerini hedef ve çatallar olarak bir kez ayrı bir hedef için giriş eşitliklerinin ayrılması ile gruplar, Angr simgesel atlama hedefine de böyle davranır. ReturnAdım sınırı'ndan uzun bir iz, kısaltılmış yolu işaretler ve durdurur.
Yolumuzu takip edin .return 4Giriş, görevlendirme yapar.local_10 = score / 10 - 6- Şubenin durumulocal_10 >u 4Bu yolda yanlış, bu yüzden durum listesi geçerli.!(score / 10 - 6 >u 4).Switch girişleri 3 ve 4 her ikisi de 0x76'da belirtilir, bu yüzden çatal 0x76'a eklenir score / 10 - 6 == 3 || score / 10 - 6 == 4. 0x76 blokları .local_4 = 4, 0xa1'e atlar ve geri dönüş yerine 4Yaprak, bu durum ve bu değerin çiftidir.
Çözücü BoundedSearch. Giriş başına sınırlı bir alanı tutar, alanların ürünü sayılır ve her kısıtlamayı C semantik ile değerlendirir: 32 bitlik sarmalama, kısaltma bölümü, imzalanan ve imzalanmamış karşılaştırmalar ve aritmetik veya mantıksal değişimler.score-200'den 1200'e kadar, gradeBu değerlendirme, 44460 değerlendirme ve birkaç milisaniye sürer.
| Leaf | Returns | Condition | Scores in the bound |
|---|---|---|---|
| 0x76 | 4 | !(q >u 4) && (q == 3 || q == 4) | 90 to 109, 20 inputs |
| 0x7f | 3 | !(q >u 4) && q == 2 | 80 to 89, 10 inputs |
| 0x88 | 2 | !(q >u 4) && q == 1 | 70 to 79, 10 inputs |
| 0x91 | 1 | !(q >u 4) && q == 0 | 60 to 69, 10 inputs |
| 0x9a | 0 | q >u 4 | 1,351 inputs, the rest of the bound |
qscore / 10 - 6Aynı sınıflar çıkıyor .grade- ...-O1, IR'nin iki yolu olduğu yerde, masa yolu geri döner lookup_14[q]ve varsayılan yol 0'u geri verir ve soru geri gönderilen değere bir kısıtlama olur, çünkü ulaşılması gereken bir durum blok yoktur.lookup_14nesnenin görüntüsünden okunuyor..rodata0x14'te.
Sınır, yöntemin sınırıdır. Sınırlı bir arama alanının içinde tamamlanır ve dışındaki sessiz olur. -200 ila 1200 arasında 60 ila 109 arasında hiçbir puan 0 göndermez ve 110 veya daha fazla puan sıfır dışı bir değer göndermez. z3 tüm 2^32 puanlar için her ikisini de kanıtlar ve sonraki bölüm iki yöntemin farklı tanıklar gönderdiğini gösterir.
Yol Patlaması Ölçülmüş
total- ...-O1Dersin 33'ü: bir testcount, ekleyen bir döngü vücudu values[rdx]ve artışlar rdx, ve bir jneVücuduna dönerkenrdx != rcx- IR'de .rcx- Evet .zext64(count)ve rdx0'dan başlıyor. Arka kenarından geçen her yol, çatalların üzerinde.rdx != count- Evet .rdxBir sabit, bu yüzden yol için count = cVücudunu yönetir.cZaman ve çıkışlar.count0 ile 2 arasında sınırlı olan uygulayıcı 3 yol bulur. 0 ile 4 arasında 5 ve 0 ile 8 arasında 9 bulunur. Her yol sayısının üçgen toplamını gönderir: (0, 0), (1, 1), (2, 3), (8, 36). angr, 3, 5 ve 9 bitiş durumunu ve aynı dokuz sayım ve toplam çiftini üç optimizasyon düzeyinde gönderir.-O2, vectör döngüsünün en az 8 sayısına ihtiyacı vardır ve bu nedenle bu aralığın yol sayısını asla değiştirmez.
Hiçbir bağlanmadan uygulayıcı asla bitmez, çünkü her tekrar sayımı bir daha uygulanabilir bir yoldur.countBu rakamlar, 64'e kadar, 22 yol geri verir, 2'yi kısaltır ve var olan 65'in diğer 41'ini asla başlatmaz. Rapor bu üç rakamı verir.
Angr ve z3 Aynı Sorular
capture_angr.pyCLE, her yer değiştirilebilir nesneyi 0x400000'de ELF arka uçla yükledi.-O0Ve diğerleri için 8 ve dört sembolü çözmüş.gradeSimvolik bir 64 bit argüman ile,run()5 ülkenin sonu gelmişti .-O0Ve 2 tane .-O1ve -O2, 0.475, 0.408 ve 0.318 saniye içinde.eax == vBu durumun sonucunda, her bir döngüden önce belirlenen ve çözücüye imzaladığı minimum ve maksimum miktarı soran kişi 60 ila 69, 70 ila 79, 80 ila 89, 90 ila 109 arasında bir miktar ödeme yaptı.vHer seviyede 1 ila 4 arasında ve 0'da -2147483648 ila 2147483647 arasında iki çapraz kontrol de yerine getirilmedi.
CFGFast' ın kullanıldığı Reach-a-Block formunda grade- ...-O0, 33 ders bulduğumuz sekiz blok listesi, o zaman explore(find=0x400076)4. depolayan blok için 0.47 saniye içinde üç hali olan bir durum buldu. Argument ve örnekler 91, 93, 94, 97 ve 101'de minimum 90 ve maksimum 109'u buldu.
- Evet .
percent_change, iki sınırlı devlet .before[31:0] != 0vebefore[31:0] == 0- Zıfır dışı durumu sormak .eax == 50Verdi .before = 21055744, after = 332315210- ...-O0- Evet .40566804, 834296877- ...-O1ve-24484867, 993934694- ...-O2-16 ' den 16 ' a kadar sınırlı arama cevaplarıbefore = -10, after = -15Z3, Ders 34 listesi ile ilgili aynı soruyu sordu, cevaplarbefore = -25092599, after = 305712160. Test kümesi, IR değerlendirici ile beş çiftin hepsini değerlendirir ve her biri 50 verir. Bir model bir giriş varlığını kanıtlar. Giriş değil ve üç doğru araç üç farklı bir giriş verdi.
capture_z3.pymodellerini-O1listesi grade32 bit bit vektörlerinde çarpma, iki şifte ve tablo ile ve daha dört soru sorar.switch32 bit skor için: 0.068 saniye içinde ayarlanmamış, böylece oluşturulan işlev tüm 2^32 girişleri için kaynağa eşit.score / 10Bu fark 0 ile 109 arasında sınırlıdır: Satılamıyor, bu yüzden ders 36'nın şebekesi onu göremiyor.percent_change- Evet .before == 3-133 ile oturdu.after = 107374182336 dersindeki aşırı hücre, sınırlı aramalar, alanında ikinci bir tanık buldu.after = -1, nerede (-1 - 3) * 100 / 3-133'e kadar kesilmiş, hiç bir aşırı akış yok.
Yapın
Demo çalıştır:
cd phases/13-tools-and-protocols/44-binary-diffing-and-symbolic-execution
python3 code/main.pyÇıktı bir JSON raporu. diffsnesne dosyası ve yüklenmiş görüntü eşleşmelerini tutmaktadır -O0-O1ve -O1-O2, artı -O0BinDiff sırasındaki çift.toolComparisonher fonksiyon için radiff2 hüküm ve oran ve Ghidra korelatörlerinin yanında ders aşamasını koyar. patch- Bu ...grade_case10_wrong.o- Davayı.radare2RatiosRadiff2 sayısını yeniden üretir.gradeRelocationCasedüzenini ve iki yer değiştirmesini gösterir ve symbolicYolları, sınıfları ve patlama sayısını tutar.
Oku code/main.pyBu sırada:
ElfObjectBölümleri, sembolleri ve.rela.*Kayıtlar.parse_listing()okurllvm-objdumpMesaj.jump_table_targets()vebuild_cfg()ulaşılabilir bloklar ve tiplenmiş kenarlar.FunctionRecord.signatures()Beş imza oluşturur.load_image()Bölümlerin belirlenmesi ve uygulanmasıS + A - PveS + A- Evet .match_functions()- O zaman sen de oyunculuğun teklifi yap.levenshtein()veradare2_ratio()Benzerliği gösterir.parse_radiff2()veparse_ghidra_vt()karşılaştırma için kaydedilen araç çıkışlarını okuyun.evaluate()- Evet .substitute()veBoundedSearchBu ifade semantik ve çözücüdür.execute()Yolları sayıyor.solve_returns()her yaprak için bir giriş kümesi istiyor.grade_ir_o0()- Evet .grade_ir_o1()- Evet .percent_change_ir_o1()vetotal_ir_o1()- El kaldırmaları ve talimat adresleri.
Üç emir daha var.python3 code/main.py diff A.o B.olisteleri yanlarında bulunan iki nesneyi ayırt eder ve --imageyüklenmiş görüntülerini farklılaştırır. python3 code/main.py paths grade O0Bir fonksiyonun yollarını ve sınıflarını yazdırır paths total 8Bir sınırlı döngü.python3 code/main.py figure-dataİnteraktif figürün yerleştirdiği verileri yazdırır.
Kullan
Kendi programınızın iki yapısında bu sırada farklı ve uygulayıcı kullanın.
- Her nesne için bir listeyi yakalayın ve bırakın
function_record()Bayeye karşı doğrulayın. - Önce nesne dosyalarını ayırt edin. Her maçın aşamasını okuyun ve ikinci bir imzanın kabul edilene kadar akış grafik şekli eşleşmelerini öneriler olarak değerlendirin.
- Yüklü görüntüleri ayırt edin. Tam baytlardan maskeli baytlara düşen bir fonksiyon verilerine göre hareket eder ve yer değiştirme aritmetikası hareket eden bölüme isim verir.
- Her maç için referans tabloları karşılaştırın. Aynı kod farklı sabitlerle değiştirilmiş bir fonksiyon.
- Adlar aşamasını çalıştırın ve karşılaştırın. Yapılama sembollere sahip olduğunda, BinDiff sırasını çalıştırın ve yapısal sonucu sadece aşamaları sınıflandırmak için kullanın.
- Bir araç bir oran rapor ettiğinde, kendi ile karşılaştırmadan önce hangi baytların içine girdiğini öğrenin.
- İsteğiniz girişleri olan fonksiyon için, IR'yi her ifade için bir adresle yazın, çalıştır
execute()Her simgesel döngü sayıcısı üzerinde bir çizgi ile, ve her yaprak çöz. - Aynı soruyu angr veya z3 üzerinden kullanın ve sınıf sınırlarını karşılaştırın.
İnteraktif Laboratuvar
Laboratuvar A: El ile beş imza
- Evet .
codeDizin, açık Python:
cd phases/13-tools-and-protocols/44-binary-diffing-and-symbolic-execution/code
python3 -qÇık:
from main import *
grade = {r.name: r for r in fixture_records("ledger-x86_64-O1.o")}["grade"]
grade.raw.hex(" ")
grade.masked_bytes() == grade.raw
grade.mnemonics
grade.cfg_shape()
grade.signatures()Yazdırmadan önce fonksiyonun 0x26 oranında dört bayt yazın grade.raw- O zaman aynı çizgileri kullan .grade-ledger-x86_64-O0.oVe sayın table kenarlarıgrade.edges- Evet .
Laboratuvar B: Yer değiştirme bayt hashini kırmaya bak
case = grade_relocation_case()
case["layout"]
case["displacements"], case["rodataShift"]
case["objectBytesEqual"], case["imageBytesEqual"], case["maskedImageBytesEqual"]Hesaplama0x100110 + 0x14 - 0x10003aokumadan önce kağıt üzerinde .displacementsSonra tabanı değiştir .load_image()0x400000'e kadar ve iki operandın birlikte hareket ettiği için yer değiştirmelerin değişmediğini onaylayın.
C laboratuvarı: yanlış eşleşme ve onu önleyen sırayla
report = diff_fixtures("ledger-x86_64-O1.o", "ledger-x86_64-O2.o")
[(m.left.name, m.right.name, m.stage) for m in report.matches]
report = diff_fixtures("ledger-x86_64-O0.o", "ledger-x86_64-O1.o")
[(m.left.name, m.right.name, m.stage, m.names_agree) for m in report.matches]
report = diff_fixtures("ledger-x86_64-O0.o", "ledger-x86_64-O1.o", stages=BINDIFF_ORDER)
[(m.left.name, m.right.name, m.stage) for m in report.matches]Yazdır records(...)["percent_change"].cfg_shape()için-O0ve grade_labeliçin-O1Sonra sıralamayı değiştiren 6. aşamayı yazın. Böylece sıralama artık önemli değil ve onları ayırıp ayırmayacağını görelim.
Laboratuvar D: Yollar ve sınırlar
report = grade_paths("O0")
[(p["trace"], p["condition"], p["returns"]) for p in report["paths"]]
report["returns"]["4"]
total_paths(2), total_paths(4), total_paths(8)
total_paths(64, step_limit=24)["truncated"]DeğişiklikSCORE_DOMAIN- ...range(0, 110)Ve tekrar çalıştır .grade_paths("O0")0 için sınıf 60 giriş olarak küçülür ve iki çapraz kontrol hala geçerlidir.range(90, 100)Ve hangi yaprakların hiç modeli olmadığını okuyun.
Pratik Laboratuvar
BinDiff'i oyunlara koy ve üç sonuçla karşılaştır.
Gereksinimler:
- BinExport uzantısını Ghidra 12.1.4'e yükleyin ve üç defter programını ihraç edin. BinExport yayın etiketini ve Ghidra sürümünü kaydetin.
- BinDiff 8 komut satırını yükle ve
-O0karşılaştırıldığında-O1ve-O1karşılaştırıldığında-O2Sadece benzerlik seçeneği ile sonuçlar. - Fonksiyon başına benzerliği ve güvenini yakalayın
code/fixtures/Tam emirleri ile.build_fixtures.sh- Evet . - Uzaklaştırma
tool_comparison()birbindiffBinDiff'in eşleşen seti ile karşılaştırılan bir test ekle.-O1karşılaştırıldığında-O2Dersin maskeli baytları ile. - BinDiff algoritmasının adı verilen bir paragraf yazın .
gradeve yüklü görüntülerin karşılaştırıldığını.
Başarılı olmak, demo'nun her fonksiyona dört araç sütunu yazdırdığını ve yeni testin bir eşitlik veya bir açıklanmış fark belirttiğini gösterir.
Ders Artifakti
Bu ders de içerir .outputs/skill-binary-diffing-and-symbolic-execution.md. İki yapılandırmayı ve bir fonksiyonu, her maç için belirtilen bir kalitede, her eşleşmeyen veya değiştirilmiş fonksiyonun açıklaması ve her yaprak için çözülmüş bir giriş seti ve onu üreten sınır ile bir yol raporu için kullanın.
Kontrol et
Demo ve süiti çalıştır:
cd phases/13-tools-and-protocols/44-binary-diffing-and-symbolic-execution
python3 code/main.py
python3 -m unittest discover -s code/tests -vVerifikasyon, şunu kanıtlamalıdır:
- Simgolu tablolar, 46 , 118, 66, 39 boyutları olan dört işlevi gösterir.
-O016, 46, 31, 63 ' te-O1, ve 16, 46, 140, 63'te-O2 .rela.text-O1nesneyi şöyle tanımlayın:llvm-objdump -rbasıyor.- listelenen her talimat simgesel boyutunda ve baytları nesneyle eşit ve değiştirilmiş bayt yükseltilmektedir
total- ...-O1Beş blok, beş kenar ve bir kendi döngüsü vardır ve şekil dizilisi belirleyicigrade- ...-O05 atlama masası hedefini kurtarır ..rela.rodataSekiz blok ve on bir kenarı vardır.- Masası olmadan,
grade- ...-O04 blokta 82 byte'ye ulaşır. percent_change- ...-O0vegrade_label- ...-O1Aynı dört blok şekli- Tam ve maskeli hashler yer değiştirilebilir bir nesnenin her işlevi üzerinde anlaşılır
-O1ve-O2Üç fonksiyon için bayt paylaşıyor,-O0ve-O1payı yok- Referanslı tablo
gradeokur1, 2, 3, 4, 4ve adayın okuyuşları1, 2, 3, 4, 3 - yükleme alanı
.text- Evet ..rodatave.rodata.str1.1Ghidra onları her iki programda da yerleştirdi. R_X86_64_PC32yazıyor:S + A - Pve 122 yer değiştirme sağlar.R_X86_64_64.dataİletiş dizini adreslerigradeByte nesnelerde uyumlu ve görüntülerde 0x70 bir değişim ile farklıdır ve maskeleme eşleşimi geri getirir-O1karşılaştırıldığında-O2Tam baytlarda üç işlevi eşleştiriyor vetotalAdıyla; görüntü görünümü eşleşirgrade1 - 1/46 benzerliği olan maskeli baytlar- Ders sırası bir yanlış akış grafik şekli eşleşmesi üretir .
-O0karşılaştırıldığında-O1BinDiff siparişleri de dörtüyle aynı . - Yapıştırma adayı byte ile eşleşir ve referans verilerde başarısız olur
- Levenshtein oranı, 0.130435, 0.106061, 0.269841, 0.171429, 0.426829'u 82 byte üzerinde yeniden üretir ve yer değiştirilen bayt oranları, yer değiştirme uygulanması ile radiff2 baskıları
- radiff2'nin MATCH seti, exact-byte aşamasına eşit, ve Ghidra'nın byte ve talimat korelörleri görüntü görünümünün tam ve maskeli setlerine eşit
- Ghidra sadece isimleri buldu .
-O0karşılaştırıldığında-O1, her maçta 1.0 benzerlik ve 10.0 güven ile - El kaldırılmış IR, listelenen her talimatı bir kez kapsar ve değerlendirici C semantikasını takip eder.
grade5 yollu bir yol var.-O0- Evet. - Evet.-O1Aynı sınıflar- sınırlı sınıflar 60 ila 69, 70 ila 79, 80 ila 89, 90 ila 109'da her üç seviyede ve z3'lerde, 5 ve 2 sınırlı durumlarla ve 90 ila 109'da ulaşma blok aralığı ile
- İki çapraz kontrolün sınırda, angr'de veya z3'te bir modeli yoktur ve z3 listenin kaynağı anahtarına eşit olduğunu kanıtlar
- Her zaman
percent_changeSınırlı arama, angr ve z3'den model, istenen değere değerlendirir total3, 5, 9 yolları verir ve üçgen toplamları angr ile aynıdır ve adım kapı 22'yi geri verir ve 2'yi keser.- Resim verileri, her iki görüntü, yer değiştirme numaraları ve giriş setleri ile birlikte beş yaprak içerir ve sitedeki modül aynı verileri içerir.
Üretim Başarısızlık Modları
| Failure | What the weak tool reports | What the analysis must prove |
|---|---|---|
| Byte hash on a loaded image | "grade modified" between two builds with identical code | The field offset, the two displacements, and the section shift; the masked hash matches |
| Masked hash on a relocatable object | "masking made no difference" | The fields were already zero; the relocation records and the referenced constants carry the change |
| Flow-graph shape alone | A confident pair of unrelated functions | A second signature agrees, or the names contradict and the match is dropped |
| Names before structure on a stripped build | Nothing matches | The structural stages with their qualities, and the unmatched list |
| A ratio compared across tools | "radiff2 says 0.43 and the lesson says 0.30" | Which bytes each side fingerprinted; 82 bytes without relocations, 118 with |
| Same code, different constant | "exact match" | The table read through the relocation and the bounds check |
| One model reported as the input | "the score is 90" | The class 90 to 109 with its count, and the bound it was found in |
| Bounded search reported as unsat | "no input gives -133" | Unsat inside the bound only; z3 finds 1073741823 outside it |
| Symbolic loop without a bound | A timeout | The bound or the cap, the paths returned, truncated, and never started |
| Closed tool described as run | Numbers with no capture | A capture file with the command and version, or a sentence saying documentation only |
İşlem Kuralı
Bir imza ile aynı anda tek tek değerleri kabul edin ve her iki tarafta da benzersiz değerler kabul edin ve sahneyi ve kalitesini maçla tutun. Nesneleri ve yüklü görüntüleri ayırt edin ve iki arasında aşama değiştiren her fonksiyonu açıklayın. Her dalda bir çözücü ile yolları sayın, her sembolik döngüyü bağlayın ve giriş seti sınırlarıyla bildirin.
Daha Fazla Okumak
- BinDiff concepts: matching strategy, algorithms, and quality ratings
- BinDiff repository and the v8 open-source release
- BinExport README: IDA Pro, Binary Ninja, and Ghidra exporters
- Flake, "Structural Comparison of Executable Objects" (DIMVA 2004) and Dullien, Rolles, "Graph-based comparison of Executable Objects" (SSTIC 2005), shipped in the BinDiff repository
- Diaphora README and heuristics source
- Ghidra Version Tracking correlators help page
- Ghidra Auto Version Tracking help page
- Ghidra 12.1.4 release
- Binary Ninja 6.0 "Krypton" release notesve Binary Similarity user guide
- radare2 book: radiff2ve radare2 6.2.4 source
- King, "Symbolic execution and program testing" (CACM 1976)
- Baldoni et al., "A Survey of Symbolic Execution Techniques" (ACM Computing Surveys 2018)
- Cadar, Sen, "Symbolic execution for software testing: three decades later" (CACM 2013)
- Cadar, Dunbar, Engler, "KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs" (OSDI 2008)ve KLEE 3.2 release
- Shoshitaishvili et al., "SoK: (State of) The Art of War: Offensive Techniques in Binary Analysis" (IEEE S&P 2016)
- angr documentation: loading, simulation managers, and the simulation pipelineve angr 10.0.3 on PyPI
- Z3 5.1.0 release
- Triton dynamic binary analysis library
- System V Application Binary Interface, AMD64 Architecture Processor Supplement, Table 4.9: Relocation Types
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.