تفاوت دوگانه و اجرای نماد: مطابقت عملکردها و حل ورودی
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
اهداف یادگیری
- پنج امضای تابع را از یک شی و لیست آن بسازید: بایت های دقیق، بایت هایی با زمینه های نقل مکان پنهان شده، ردیف mnemonic، شکل گرافی جریان و نام نماد.
- یک مسابقه ساز طمع آمیز را در سبک BinDiff اجرا کنید، جایی که یک امضا فقط زمانی مطابقت دارد که از هر دو طرف منحصر به فرد باشد، و مرحله و کیفیت پشت هر مسابقه را ثبت کنید.
- این حالت را تکرار کنید که دو تابع بایت متمایز در یک تصویر بارگذاری شده بایت همگام کاربری را از دست ندهند و بعد از پوشاندن آن را با حساب نقل مکان که چهار بایت تغییر یافته را توضیح می دهد، منتقل کنید.
- نسبت های شباهت را از فاصله لئونشتاین تکرار کنید و توضیح دهید که چرا تنها زمانی که مقایسه از 82 بایت رادار2 استفاده می شود، یک نسبت ظاهر می شود.
- مسیرهای یک تابع را در یک IR کوچک، یک شرط را در هر مسیر ثبت کنید و هر ورق را برای ورودی با جستجوی محدود حل کنید.
- انفجار مسیر را در یک حلقه با یک مرز نمادین اندازه گیری کنید و شمارش، کلاس ها و مدل ها را با angr 10.0.3 و z3 5.1.0 مقایسه کنید.
مشکل
تو دوباره ساختيledger.cدر-O2و از يه مامور پرسيدم که آيا از زمان "-O1مامور يه گزارش رو از دست داد و گزارش دادgradeاین برنامه در حال تغییر بود، زیرا بائتهای آن در دو برنامه بارگذاری متفاوت است. سپس بودجه خود را صرف توضیح یک تغییر که وجود ندارد. 46 بائتهای gradeدر دو فایل شی یکسان هستند. تفاوت تصاویر مقایسه شده پس از انتقال، و .rodataدر قسمت بعدی در -O2برنامه، پس یک جابجایی درgradeبا 0x70 رشد کرد
همون بعد از ظهر که ازت پرسيدم چه نمره اي دارهgradeبازپرداخت 4. عامل کد پشوودکد را خواند و جواب "90" داد. این یک پاسخ است. تابع برای هر نمره از 90 تا 109 4 بازپرداخت می کند. و سوال بدون محدودیت بود، بنابراین پاسخ عامل نمونه ای بود که شما نیاز به مجموعه ای دارید.
هر دو شکست از یک شکاف ناشی می شود. یک مطابقت و یک ورودی حل شده هر یک یک ادعا با یک روش پشت آن است. این درس دو روش را در کتابخانه استاندارد پایتون ایجاد می کند و ابزارهای تولید را در کنار آنها اجرا می کند. جایی که ابزارها و کد با هم موافق هستند شما دو مشتق دارید. جایی که آنها با هم موافق نیستند شما یک آدرس، یک بایت یا یک پابند برای نگاه کردن دارید.
امضا عملکردی ادعا با کیفیت است
فلیک در سال 2004 تفاوت دوگانه را به عنوان ساخت یک آیسمورفیسم بین مجموعه های عملکرد دو اجراگر مشابه تعریف کرد. در سال 2005، Dullien و Rolles آن را به بلوک های پایه و دستورالعمل ها گسترش دادند. صفحه مفاهیم بن دیف استراتژی را که از آن کار آمده توصیف می کند. برای هر تابع در هر دو طرف یک ویژگی محاسبه کنید. یک مقدار که دقیقاً یک بار در هر طرف ظاهر می شود، یک تعادل است. یک مقدار که بیش از یک بار ظاهر می شود، مبهم است و با ویژگی بعدی در داخل این کلاس معادلات، به پایین کشیده می شود. یک ارزش بدون همتای بدون مقایسه باقی می ماند. پس از هر گذر، کالرها و کالرها از بازی های جدید مجموعه های کوچک را تشکیل می دهند که ویژگی بعدی احتمالا منحصر به فرد است و فرآیند با ویژگی بعدی تکرار می شود.
هر الگوریتم تطابق دارای یک کیفیت است. صفحات میزان مطابقت هش با بیت های عملکرد خام و مطابقت هشت نام به عنوان بسیار خوب، شاخص MD گراف جریان و مطابقت امضا اولیه (هر mnemonic یک عدد اولیه کوچک، محصول بر روی عملکرد) به عنوان خوب، مرجع رشته به عنوان متوسط و تعداد حلقه یا ردیف آدرس به عنوان ضعیف. اعتماد به نفس یک مسابقه، کیفیت متوسط الگوریتم هایی است که آن را تولید کرده اند، با وزن یک سیگمائید. شباهت عملکرد حدود 25٪ کنار های گراف جریان مطابقت دارد، 15٪ بلوک های پایه مطابقت دارد، 10٪ دستورالعمل های مطابقت دارد و 50٪ تفاوت در شاخص MD گراف جریان، ضرب شده با اعتماد.
این درس پنج ویژگی را حفظ می کند و یک قانون مهم: منحصر به فرد در هر دو طرف یا هیچ تطابق. این شاخص MD را رها می کند، زیرا صفحات مفاهیم نامگذاری را بدون فرمول می کنند و در جای آن یک ردیف درجه ساده را استفاده می کنند. برچسب های کیفیت باقی می مانند، زیرا تطابق فقط به اندازه ضعیف ترین واقعیت است که آن را تولید کرد.
پنج امضا از یک دفترچه
تفاوت به هر شی دو چیز می خواند. ELF باایت ها، اندازه های نماد ها و .rela.*سوابقllvm-objdump -dفهرست کردن مرزهای دستورالعمل و mnemonics را می دهد و درس 33 نشان داد یک decoder برابر با فهرست کردن در هر دستورالعمل از این اشیاء است.function_record()بررسی می کند که بائتهای هر دستورالعمل ذکر شده بائتهای شی در آن آدرس برابر هستند و به طور دیگری افزایش می یابد. یک لیست قدیمی یک تنظیمات تغییر یافته است.
اینو بگیرgradeدرledger-x86_64-O1.o. نماد ميگه تعويض 0x10 و اندازه 46 ، پس ثبت شامل 0x10 تا 0x3e مي شود و دو بايت را خارج مي کند nopکه تابع بعدی را هموار می کند.
امضای بائیت های دقیق SHA-256 از 46 بائیت است. امضای بائیت های ماسک شده هر زمینه ی نقل مکان را اول صفر می کند. یک میدان وجود دارد: ثبتR_X86_64_PC32 .rodata+0x10در آفسهت 0x36، چهار بایت عرض، جابجایی leaq (%rip), %rcxدر یک شی RELA این چهار بایت در حال حاضر صفر را دارند، بنابراین دو امضا در مورد هر عملکرد هر شی در اینجا موافق هستند. ماسک برای بخش بعدی وجود دارد.
امضا منمونک سلسله 14 منمونک رو هاش می کنه:
movslq imulq movq sarq shrq addl addl xorl cmpl ja movl leaq movl retqشکل شکل گراف جریان از بلوک های پایه و لبه های تایپ شده در درس 33 است، محدود به بلوک هایی که می تواند وارد شود. gradeدر-O1سه بلوک و سه لبه داره. بلوک 0x10 درja 0x3dبا یک کناره گرفته و یک کناره سقوط، بلاک 0x31 به 0x3d می رسد و 0x3d بازمی گردد. ردیف درجه در هر بلاک در ترتیب مرتب شده است، بنابراین امضا می خواند 3b 3e [0/2,1/1,2/0]. برایgradeدر-O0رکورد حل ميکنه که به طور غير مستقيم از پنجم عبور کرد.rela.rodataاین نوشته ها دقیقاً مثل درس 33 هستند که 8 بلوک و 11 لبه با 4tableحواسن
امضای نام نام علامت نام است. این قوی ترین واقعیت زمانی است که وجود دارد و هیچ چیزی زمانی که ساخت و ساز را از بین می برد.
یک میدان دیگر برای بسته بندی بعد به حرکت می رسد. وقتی یک تابع دارای یک leaنقل مکان به .rodata، چک محدودیت ها و بار شاخصه ایreferenced_table()جدول رو به همون شکل که درس 36 انجام داد میخواد:cmpl $0x4قبل ازjaپنج تا ورودی و بارmovl (%rcx,%rax,4), %eaxهر کدام چهار بایت می دهد.gradeدر-O1میز در .rodata+0x14میخواد1, 2, 3, 4, 4. .
متقابل طمع
match_functions()برای هر مرحله، عملکردهای هنوز هم بی نظیر را در هر طرف با امضای مرحله جمع می کند و هر مقدار را که دقیقاً یک عملکرد در هر طرف دارد، پذیرفته است.
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))ترتیب درس چهار مرحله ساختاری را ابتدا و نام ها را در آخر اجرا می کند، بنابراین مراحل ساختاری مورد آزمایش قرار می گیرند و نام ها آنها را بعد از آن رتبه بندی می کنند.-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 |
totalاز 31 بایت و 13 دستورالعمل به 140 بایت و 41 دستورالعمل رشد کرد، زیرا clang لوله را با SSE2 وکتوریزه کرد و لوله باقی مانده اسکالر را حفظ کرد. شکل آن از پنج بلوک و پنج لبه به ده بلوک و سیزده لبه منتقل شد. هیچ چیزی ساختاری زنده نمی ماند و تنها نماد دو را به هم می پیوندد.
برای-O0مخالف-O1در همان ترتیب یک مطابقت اشتباه پیدا می کند:
| 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در-O0الماس چهار بلوکی است: یک ورودی که شاخه هایی از آن استbefore == 0، دو دست و یک جوانه که به آن برمی گردد.0/2, 1/1, 1/1, 2/0.grade_labelدر-O1.gradeدر این مرحله، یک سنگ الماس در اطراف مرزها قرار دارد. شکل منحصر به فرد در هر دو طرف است و قانون آن را قبول می کند. برچسب کیفیت متوسط هشدار است و مرحله نام، پس از آن اجرا می شود، با آن متناقض است. مطابقت نادرست نیز مصرف می کند.grade_labelراست، پس راستpercent_changeوgrade_labelجفت ها بدون مقایسه باقی می مانند.
ترتیب بن دیف نام مطابقت را به عنوان مرحله دوم اجرا می کند که نام های واقعی وجود دارد وBINDIFF_ORDERدر اين کد هم همينطوره با اين ترتيب همشون چهارتا-O0عملکردها با آنها مطابقت دارند-O1درسی هر دو دستور را در نمایش نمایش نگه می دارد تا شکست قابل مشاهده باشد. شکل گراف جریان چهار گره شکل هر یک از آنها است.ifوelseکه قبل از بازگشت به هم پیوسته
بائیت های یکسان، عملیات تغییر مکان
Ghidra هنگام واردات یک شی، نقل مکان ها را اعمال می کند. بنابراین، باطِ آن، تصاویر بارگذاری شده را مقایسه می کند و درسی 36 زمینه های نقل مکان پنهان شده را به همین دلیل استفاده می کند. load_image()واردات را تکرار می کند. بخش های اختصاصی را به ترتیب سر و کله ها نشان می دهد، هر یک را به عنوان خود تنظیم می کند sh_addralign، و از 0x100000 به بعد از هر رکوردی اعمال می شود:S + A - Pبه عنوان یک مقدار 32 بت امضا شده برای R_X86_64_PC32وR_X86_64_PLT32،S + Aبه عنوان 64 بیت برای R_X86_64_64. .
طرح با Ghidra 12.1.4 در هر بخش شروع در هر دو برنامه مطابقت دارد که مجموعه آزمایش با ورژن ردیابی ضبط شده بررسی می کند:
| Section | -O1 program | -O2 program |
|---|---|---|
.text | 0x100000, 159 bytes | 0x100000, 271 bytes |
.rodata | 0x1000a0 | 0x100110 |
.rodata.str1.1 | 0x1000f0 | 0x100160 |
.text112 بايت بیشتر است-O2، رشدtotal، پس.rodataشروع به 0x70 بايت در ادامهgradeدر هر دو برنامه در 0x100010 قرار دارهleaqدر آفسه 0x33 میدان جابجایی آن در 0x36 و به 0x3a پایان می یابد. اضافه جابجایی 0x10 به علاوه 4 معمول جدول را در .rodata+0x14. .
در-O1تصویر: 0x1000a0 + 0x14 - 0x10003a = 0x7a = 122. در-O2تصویر: 0x100110 + 0x14 - 0x10003a = 0xea = 234بايت هاي فيلد7a 00 00 00در یک تصویر وea 00 00 00در مرحله ی دیگر، یک بایت از 46 متفاوت است، نسبت لئونشتاین 0.978 است و مرحله بایت های دقیق شکست می خورد. مرحله بایت های ماسک شده میدان را صفر می کند و عبور می کند.grade_labelبا همان 0x70 با جدول حرکت می کند، بنابراین جابجایی های آن برابر باقی مانده و باایت های دقیق را در هر دو دیدگاه منتقل می کند.
گيدرا گزارش ميده که همين شکاف رو داشته-O1مخالف-O2, باط های دقیق تابع مطابقت یافتpercent_changeوgrade_label، دستورالعمل های دقیق عملکرد مطابقت این دو اضافه پیدا کردgradeدر این مطالعه، یک نمونه از ویژگی های یکپارچه در نظر گرفته شده در مورد یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با یک کاربری با کاربری با یک کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کاربری با کار کار کاربری با کاربری با کار کار کار کار کار کار کار کار کار کار کار کار و کاربری با کاربری با کاربری با کار و کاربری با کاربری با کار خود کار خود کار را با کار خود را با کار و کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار با کار
۶.۵.۰compare_functionsمتن ارائه دهنده خطوط خروجی. در ابعاد مونتاژ آن محدودیت "نورمال سازی جابجایی در دسترس نیست" متصل می شود. بارگذاری و ماسک در این درس این نرمال سازی را فراهم می کند.
چه تدابیر
رادار2 6.2.4 سفينهايradiff2. با-ACاین هر دو فایل را تجزیه و تحلیل می کند و یک ردیف را به هر تابع چاپ می کند: اندازه چپ و آدرس، MATCH یا UNMATCH، نسبت، و اندازه و آدرس درست. ردیف های ضبط شده برای اشیاء ما:
| 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 |
نسبت در منبع رادار2 1 - distance / max(len_a, len_b), جایی که فاصله فاصله Levenshtein بین دو اثر انگشت و یک اثر انگشت است، کنکاتیناسیون بلوک های پایه تابع در ترتیب آدرس است.radare2_ratio()درcode/main.pyاین فرمول را بر روی بایت های تابع خام اجرا می کند و 0.130435, 0.106061, 0.269841, و 0.171429 را تا شش دسمایل بازتولید می کند.
این ماده 0.426829 برای gradeدر-O0. بر روی 118 بایت تابع نسبت 0.296610 است .118بدون تغییر مکان های اعمال شده نمی تواند جدول پرتاب را حل کند، بنابراین تجزیه و تحلیل آن به بلوک ورود، بلوک که به jmpq *%rax، مورد پیش فرض و بازگشت: 82 بایت، همان 82 که درسی 33 کاهش مکرر ساده ادعا می کند. فاصله Levenshtein بین این 82 بایت و 46 بایت در -O147ـه و1 - 47/82 = 0.426829. با-e bin.relocs.apply=trueradare2 همه 118 بایت را پیدا می کند و 0.288136 را چاپ می کند، که برابر با نسبت درس بر روی تصاویر نقل مکان شده است، جایی که چهار بایت جابجایی از زمینه های صفر موجود متفاوت است. دو ابزار تنها زمانی موافق هستند که بایت های مشابه را مقایسه می کنند و ستون اندازه نمی گوید که بایت های داخل کدامند.
-Oانگشت را به بايت های آپکود محدود می کند و اپراندها را صفر می کند.-O0در مقابل-O1نسبت ها به 0.239130, 0.512195, 0.303030 و 0.523810 افزایش می یابد وtotalدر-O1در مقابل-O2به 0.192857 افزایش می یابد. فاصله های فایل کامل وجود دارد:-s(میرز) گزارش شباهت 0.956 و فاصله 162 بین دو جسم-ss(لوینشتاین) 0.927 و 137. این اعداد شامل سر و سر، جدول های نماد و بخش های نقل مکان هستند و هیچ چیز در مورد عملکردها نمی گویند.
ارتباطات ردیابی نسخه های Ghidra
ابزار ردیابی نسخه Ghidra یک برنامه منبع را با یک برنامه مقصد با ارتباط مطابقت می دهد. همبستگی های تابع عبارتند از تطابق باایت های عملکرد دقیق، تطابق دستورالعمل های عملکرد دقیق (operands masked) ، تطابق معاینه عملکرد دقیق و تطابق دستورالعمل های عملکرد تکراری (1:N و N:M). ارتباط داده ها دقیق، تکراری و مشابه داده ها است. ارتباطات نماد با اسم ها دقیقاً، به عنوان دوگانه یا با شباهت مطابقت دارند. همبستگی های مرجع با استفاده از تطابق های پذیرفته شده برای پیدا کردن اطلاعات بیشتر استفاده می کنند. تابع ها باید در برنامه مقصد تعریف شوند و حداقل طول تابع به طور پیش فرض به 10 بایت می رسد. ردیابی نسخه خودکار نام سمبول دقیق، داده های دقیق، بایت های عملکرد دقیق، دستورالعمل عملکرد دقیق، نمونیک عملکرد دقیق، دستورالعمل عملکرد تکراری، سپس یک ارتباط مرجع را اجرا می کند و تطابق ضمنی برای پذیرفته شده ها ایجاد می کند. یک کرولاتور BSim در 11.2 اضافه شد.
درس همگامي ها رو بدون سر گرفتcapture_ghidra_vt.shسه تا موشک وارد پروژه می شود و اجرا می شودListVersionTrackingMatches.java، يه اسكريپ کوتاه که طول مي کشيدAbstractGhidraVersionTrackingScript, برنامه های منبع و مقصد را با مسیر باز می کند، شش ارتباط غیر مرجع را در ترتیب ردیابی نسخه خودکار اجرا می کند و یک خط در هر بلوک، تابع، ارتباط و مطابقت چاپ می کند. هر شماره در این بخش از آن دو فایل متن است.
| 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 |
هر فانکشن در بین-O0و-O1در صفحه کمک، ارتباط دقیق به عنوان شباهت 1.0 و اعتماد 1.0 توصیف می شود، بنابراین مقیاس اعتماد چاپ شده یک سوال باز است که این درس ثبت می کند و حل نمی کند.
تفاوت برنامه ها، در زیر ابزارها، چیز دیگری است. این دو برنامه را با فضای آدرس یکسان در بایت ها، برچسب ها، واحد های کد، مرجع ها، نظرات و عملکردها در آدرس های یکسان مقایسه می کند. این یک تفاوت آدرس است و هیچ چیزی که حرکت کرده است، مطابقت ندارد.
دیافورا و نینجا دوگانه از اسناد آنها
Diaphora یک افزونه IDA Pro است که برای اولین بار در سال 2015 منتشر شد و در نسخه 3.4.2 از سال 2026-08-18 منتشر شد. از زمان 2.0 AGPL-3.0 است و به IDAPython نیاز دارد، بنابراین در IDA Home یا IDA Pro اجرا می شود و نه در IDA Free. این هر پایگاه داده را به SQLite صادر می کند و هوریستیک خود را به عنوان سوالات SQL اجرا می کند. هر هوریستیک دارای نام، دسته بندی بهترین، جزئی یا غیر قابل اعتماد، نوع نسبت و پرچم های اختیاری مانند SAME_CPU یا SLOW است. نام ها در منبع فعلی مانند مراحل این درس با بیشتر آنها خوانده می شود: بائیت هاش، آدرس و mnemonics یکسان، مجموعه تمیز شده یکسان، Mnemonics کوچک-primes-نتج، گره های مشابه، حاشیه ها و اجزای به شدت متصل، Topological sort hash، و pseudo-code fuzzy hashs که نیاز به Hex-Rays decompiler. یادداشت های انتشار آن نشان می دهد که تاریخ تنظیم: هوریستیک های کند فقط زیر حدود 2000 تابع اجرا می شوند و "گراف مشابه" به دسته غیر قابل اعتماد منتقل می شود. این حرکت الماس چهار بلوک این درس است، در مقیاس دیده می شود.
باینری نینجا ۶.۰ که در سال ۲۰۲۶-۰۹-۰۳ منتشر شد، به طور چارچوبی با ارائه دهندگان و حل کننده ها، باینری شباهت را اضافه کرد. این سرویس بین دیف را به عنوان یک ارائه دهنده ساختاری و WARP برای مطابقت دقیق عملکردی که تحمل اپراند های قابل انتقال را دارد، ارسال می کند و راهنمای آن می گوید که WARP را زمانی که عملکردها با دستورالعمل های قابل انتقال مطابقت داشته باشند و بین دیف را زمانی که آنها پس از بازسازی به طور ساختاری مرتبط باقی می مانند، استفاده کنید. اين خصوصيت فقط در نسخه آخر هست باینری نینجا هیچ مدیر بسته ای را در اینجا نصب نکرده و اجرا نشده است، بنابراین این پاراگراف از اسناد آن آمده و هیچ چیز دیگری نیست.
BinDiff خود از سال 2023-09-25 با Apache 2.0 با آخرین نسخه v8 منبع باز است. به یک جداکننده و افزونه BinExport نیاز دارد که از IDA Pro 9.4 یا بعدتر، Binary Ninja و Ghidra پشتیبانی می کند. مسیر رایگان برای یک دانش آموز Ghidra به علاوه BinExport به علاوه خط فرمان BinDiff است. درس آن را اجرا نکرد و آزمایشگاه عملش از شما می خواهد.
همان کد، ثابت متفاوت
درس 36 باعث شد که يه نامزد دوباره ازgradeکه جدولش 3 را به عنوان آخرین ورودی دارد، در حالی که اصلی 4 را دارد. grade_case10_wrong.oبا 46 بايت کد مشابه gradeدر-O1. سازنده آن ها را به بايت های دقیق با هر امضا موافق می کند. چک جدول مرجع به خواندن1, 2, 3, 4, 4از طریق یک نقل مکان و1, 2, 3, 4, 3از طریق گزارشات و گزارشاتdataEqual: false. سه تا ديگه-O1تابع ها در سمت چپ بی نظیر هستند، زیرا شی کاندید یک تابع دارد.
این شکل تجزیه و تحلیل پیچ است. یک تابع متفاوت که در بائتهای متوقف می شود هیچ تغییری نمی کند. مطابقت دقیق داده های Ghidra و مطابقت با مرجع رشته های BinDiff به همین دلیل وجود دارد. نسخه درس کوچک است: برای هر جفت مطابقت پذیر، باایتهای نقطه نقل مکان هر تابع را با تعداد از محدودیت ها و عرض از بار مقایسه کنید.
اجرای نمادین: راه ها، شرایط، حل کننده ها
کنگ در سال 1976 اجرای نمادینی را توصیف کرد. ورودی ها به نماد تبدیل می شوند. هر بیانیه یک ذخیره نمادینی را به روز می کند. هر شاخه یک شرط را به مسیر اضافه می کند و یک حل کننده تصمیم می گیرد که آیا مسیر قابل اجرا است و ورودی مشخصی را تولید می کند که از آن پیروی می کند. یک تابع با شاخه ها به یک درخت مسیر تبدیل می شود و یک برگ یک بازگشت با یک شرط متصل است.
بالدونی، کوپا، دیلیا، دیمیتریسکو و فینوچی در سال 2018 این زمینه را بررسی کردند. بخش ۵ آنها انفجار مسیر را به عنوان هزینه مرکزی نام می دهد: یک اجراگر می تواند در هر شاخه فورک کند، بنابراین شمارش حالت می تواند به طور نمایی در تعداد شاخه ها رشد کند و یک حلقه که مرز آن به ورودی نمادین بستگی دارد مجموعه ای از مسیرها را بدون محدودیت می دهد. کاهش هایی که آنها ذکر می کنند، مسیرهای غیرقابل تحقق را با حل در هر شاخه، خلاصه برای عملکردها و حلقه ها، ادغام حالت و تقرب کمتر می کنند. اجرای کنکول به طور مشخص و نمادین برنامه را به یکباره اجرا می کند، شرایط را در طول راه اندازی بتنی ثبت می کند، یکی را رد می کند و از حل کننده برای ورودی بعدی می خواهد. سیستم های DART (2005) ، CUTE (2005) و SAGE (2008) سیستم های نامگذاری شده هستند.
KLEE (Cadar, Dunbar, Engler, OSDI 2008) یک ماشین مجازی نمادین بر روی بیت کد LLVM است، بنابراین ورودی آن clang -emit-llvmKLEE 3.2 تحت مجوز NCSA در سال 2025-12-23 منتشر شد و LLVM 16 توصیه شد. KLEE 3.2 در سال 2025-12-23 تحت مجوز NCSA منتشر شد.
اينگر در دوگانه ها کار ميکنهangr.Projectدارای یک بارگذاری CLE است که نقشه برداری از شی و اعمال نقل مکان ها را انجام می دهد، یک بلند کننده که یک بلوک را به VEX IR تبدیل می کند (block.vex) با کد پایپ به عنوان یک جایگزین و یک کارخانه برای ایالت ها.SimState.از ثبت و حافظه و یک حل کنندهSimulationManagerقدم ها مخزن ايالات نامگذاری شدهactive،deadended،found،avoidedوerroredوexplore(find=..., avoid=...)در هر مرحله موتورها به ترتیب اجرا می شوند: شکست، سیسکل، هک، تک سینگی برای داده های بتنی و VEX به عنوان عقب نشینی. claripy در Z3، و در Angr 10.0 یک پیاده سازی Rust به فروش می رسد که به عنوان from angr import claripy. angr 10.0.3 در 2026-10-10 آپلود شد، BSD-2-Clause است و نیاز به Python 3.12 یا بعد دارد. Z3 5.1.0, منتشر شده در 2026-08-16 تحت MIT، راه حل پشت angr، Triton و KLEE پس زمینه اختیاری است.
یک اجرائی کوچک در مورد درس 34 IR
اعدام کننده درcode/main.pyبا استفاده از یک IR کوچک با شکل های بیان درس 34: Assign،Branch،Jump،Return، به علاوهSwitchاين عبارت ها عبارتند از:Const،Var،Binبا عرض،Cast،Loadاز یک میز بتونی با نام، وNot. چهار تابع ثابت به دست در سطح درس 34 پس از ساده سازی می رسد، جایی که 0x66666667ضرب شدن شدهscore / 10، و هر بلوک IR آدرس دستورالعمل را از آن آمده است.check_ir_against_listing()ادعا می کند که آدرس ها لیست عملکرد را دقیقاً یک بار پوشش می دهند.
gradeدر-O0در این IR:
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_4هدف هاي سوئیچ از کجا اومدنjump_table_targets()، همان حساب نقل مکان با درس 33، بنابراین IR می خواند ثابت.
execute()یک حالت دارای بلوک فعلی، ردیابی بلوک ها، لیست شرایط و محیطی است که هر متغیر را به یک عبارت در داخل ورودی نقشه می زند. Assignمحیط زیست را به منبع جایگزین می کند و نتیجه را ذخیره می کند. Branchدر این حالت، یک بار با اضافه کردن شرط، یک بار با رد آن، از حل کننده دو بار می پرسد. یک طرف که حل کننده نمی تواند را برآورده کند، رها می شود، که این کشتن مشتاق است که بررسی توصیف می کند. Switchگروه ورودی های جدول به هدف و فورک ها یک بار در هر هدف جداگانه با جداسازی مساوات ورودی، که این گونه Angr به یک هدف پرتاب نمادین نیز برخورد می کند. Returnیک ردیف طولانی تر از حد قدم مسیر را قطع می کند و متوقف می کند.
راه رو دنبال کنreturn 4دستي به دستي به دستي به دستي به دستي به دستي به دستيlocal_10 = score / 10 - 6. حالت شاخهlocal_10 >u 4در اين راه اشتباه است، پس فهرست شرط ها برقرار است!(score / 10 - 6 >u 4). واردات سوئیچ 3 و 4 هر دو نقطه در 0x76 است ، بنابراین فورک به 0x76 اضافه می شود score / 10 - 6 == 3 || score / 10 - 6 == 4. بلاک 0x76 اختصاص داده شدهlocal_4 = 4, به 0xa1 میپرسه و جایگزین برگشت به 4برگ جفت از اون شرط و اون ارزشه
راه حلشBoundedSearch. این یک دامنه محدود در هر ورودی را دارد، محصول دامنه ها را به شمار می آورد و هر محدودیت را با سیمانیک C ارزیابی می کند: 32 بیت بسته بندی، تقسیم کوتاه کردن، مقایسه های امضا شده و غیر امضا شده، و تغییرات ریاضی یا منطقی. تقسیم با صفر یا شاخص جدول خارج از جدول باعث می شود که این اختصاص محدودیت را شکست دهد. برای scoreدر -200 تا 1200 پنج مسیر ازgradeهزینه 44،460 ارزیابی و چند میلی ثانیه. حل هر ورق برای مجموعه ورودی به این نتیجه می رسد:
| 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 |
qبرای score / 10 - 6. همون کلاس ها ازgradeدر-O1, جایی که IR دو مسیر دارد، مسیر جدول به بازگشت می رسد lookup_14[q]و مسیر پیش فرض به 0 باز می گردد و سوال به یک محدودیت در ارزش بازگردانده می شود، زیرا هیچ بلوک موردی برای رسیدن وجود ندارد. جدول lookup_14از متن این شی خوانده می شود.rodataدر 0x14
مرز مرز است. یک جستجو محدود در داخل دامنه خود کامل است و در خارج از آن خاموش است. در -200 تا 1200 هیچ امتیاز در 60 تا 109 0 را باز نمی آورد و هیچ امتیاز 110 یا بیشتر یک مقدار غیر صفر را باز نمی آورد. z3 هر دو را برای تمام امتیاز 2^32 ثابت می کند و بخش بعدی نشان می دهد که در کجا دو روش گواهی متفاوت را باز می دهند.
اندازه گیری انفجار مسیر
totalدر-O1دروس 33 در حال انجام است.count، یک بدن حلقه ای که اضافه می کندvalues[rdx]و افزونه هاrdx، و یکjneبرگرديد به بدن وrdx != rcx. در IRrcx.zext64(count)وrdxهر گزينه از طرف پشت فورک شروع ميشهrdx != countباrdxثابت، پس راه برایcount = cبدن رو اداره ميکنهcزمان ها و خروج هاcountبا 0 تا 2 اجراگر 3 مسیر پیدا می کند. با 0 تا 4 5 پیدا می کند و با 0 تا 8 9 پیدا می کند. هر مسیر مجموعه سه گوشه شمارش را باز می گرداند: (0, 0) ، (1, 1), (2، 3) ، تا (8, 36). angr گزارشات 3 ، 5 و 9 حالت متوقف شده و همان نه جفت شمارش و مجموع در سه سطح بهینه سازی، از جمله -O2، که لوله ویکتور آن نیاز به شمارش حداقل 8 دارد و بنابراین هرگز شمارش مسیر در این محدوده را تغییر نمی دهد.
بدون هیچ محدودیت اجراگر هرگز پایان نمی یابد، زیرا هر تکرار شمارش یک مسیر قابل اجرا بیشتر است.countدر این گزارش، این سه عدد را داده می شود. هزینه حل نیز رشد می کند: 33 ارزیابی در خط 2, 115 در 4, 531 در 8, و 6,900 برای اجرا محدود.
angr و z3 در مورد سوالات مشابه
capture_angr.pyCLE هر شی را که می توان با backend ELF در 0x400000 بارگذاری کرد، 13 بار بارگذاری را برای-O0و 8 تا برای بقیه، و چهار نماد حل کرد.gradeبا یک استدلال نمادین 64 بت،run()با 5 کشور در پایان رسید-O0و دو تا در-O1و-O2، در 0.475، 0.408 و 0.318 ثانیهeax == vبه هر دولت متوقف شده و از حل کننده برای حداقل و حداکثر امضا شده 60 تا 69, 70 تا 79, 80 تا 89, و 90 تا 109 برای vاز 1 تا 4 در هر سطح و -2147483648 تا 2147483647 برای 0. هر دو چک عبور انجام نشد.
فرم Reach-a-block استفاده شده CFGFast در gradeدر-O0، که فهرست هشت بلوک درس 33 پیدا شده است، پسexplore(find=0x400076)برای بلوک که ذخیره می کند 4. آن را پیدا کرد یک حالت با سه هنوز فعال در 0.47 ثانیه، با حداقل 90 و حداکثر 109 در استدلال و نمونه های 91, 93, 94, 97 و 101.
برایpercent_change، دو کشور با محدودیتbefore[31:0] != 0وbefore[31:0] == 0. از حالت غیر صفر درخواست می کنمeax == 50داده شدbefore = 21055744, after = 332315210در-O0،40566804, 834296877در-O1و-24484867, 993934694در-O2. جستجو محدود در -16 تا 16 پاسخbefore = -10, after = -15. z3 سوال مشابهی در مورد لیست درس 34 پرسید، پاسخ ها before = -25092599, after = 305712160. مجموعه آزمایش با ارزیابی کننده IR همه پنج جفت را ارزیابی می کند و هر یک 50 را می دهد. یک مدل ثابت می کند که یک ورودی وجود دارد. ورودی نیست و سه ابزار صحیح سه مورد متفاوت را ارائه می دهد.
capture_z3.pyمدل های-O1فهرست gradeدر 32 بت بایت متری با ضرب، دو تغییر و جدول، و پرسید چهار سوال دیگر. لیست متفاوت از منبع switchبرای برخی از 32 بیت امتیاز: غیر قابل تنظیم در 0.068 ثانیه، بنابراین تابع مرتب شده برابر با منبع در تمام ورودی 2^32 است. لیست متفاوت از کلاس 36 است.score / 10این تفاوت محدود به 0 تا 109 است: غیر قابل تنظیم، به همین دلیل شبکه درس 36 نمی تواند آن را ببیند. برای percent_change،before == 3با نتیجه -133 با after = 1073741823، سلول پرتاب درسي 36 و جستجو محدود شاهد دومي در قلمرو خودش پيدا ميکنهafter = -1، کجا(-1 - 3) * 100 / 3به -133 بدون تخليه
آن را بسازید
نمایش نمایش را اجرا کن:
cd phases/13-tools-and-protocols/44-binary-diffing-and-symbolic-execution
python3 code/main.pyمحصول یک گزارش JSON است. diffsفایل های شی و تصاویر بارگذاری شده را برای -O0مخالف-O1و-O1مخالف-O2، به علاوه-O0جفتي در ترتيب بن ديفtoolComparisonمرحله درس را کنار حکم و نسبت radiff2 و همبستگی های Ghidra برای هر تابع قرار می دهد. patch.grade_case10_wrong.oپروندهradare2Ratiosتعداد radiff2 را بازتولید می کند.gradeRelocationCaseطرح و دو نقل مکان را نشان می دهد وsymbolicراه ها، کلاس ها و تعداد انفجارها رو نگه داره
بخونcode/main.pyدر این ترتیب:
ElfObjectبخش ها، نمادها و.rela.*سوابقparse_listing()میخوادllvm-objdumpمتنjump_table_targets()وbuild_cfg()بلوک های قابل دسترس و لبه های تایپ شده را فراهم کنید.FunctionRecord.signatures()پنج امضا را به وجود می آورد.load_image()بخش های اختصاصی را مشخص می کند و اعمال می شودS + A - PوS + A. .match_functions(). همکار سازندهlevenshtein()وradare2_ratio()شباهت را نشان می دهد.parse_radiff2()وparse_ghidra_vt()برای مقایسه، نتایج ابزار ضبط شده را بخوانید.evaluate()،substitute()وBoundedSearchدر واقع، این ها عبارت های معنوی و حل کننده هستند.execute()مسیرها رو فهرست ميکنهsolve_returns()هر برگ را برای یک مجموعه ورودی می طلبد.grade_ir_o0()،grade_ir_o1()،percent_change_ir_o1()وtotal_ir_o1()اونها دست بلند کردن ها و آدرس آموزششون هستن
سه فرمان ديگه وجود دارهpython3 code/main.py diff A.o B.oدو شی را که لیست آنها در کنار آنها قرار دارد، متفاوت می کند و--imageعکس های بارگذاری شده شان را متفاوت می کند.python3 code/main.py paths grade O0مسیرها و کلاس های یک تابع را چاپ می کند. paths total 8حلقه با یک خطpython3 code/main.py figure-dataداده هایی را که شکل تعاملی به آن ها می دهد چاپ می کند.
ازش استفاده کن
از diff و executor در این ترتیب در دو ساخت برنامه خود استفاده کنید.
- برای هر شی لیست بگیرید و بگذارید
function_record()با بت ها رو بررسي کن، قبل از هر چيزي ديگه فهرست رو درست کن - ابتدا فایل های شی را تفاوتی کنید. مرحله هر تطابق را بخوانید و تطابق شکل گراف جریان را به عنوان پیشنهادات نگاه کنید تا امضای دوم موافق باشد.
- تفاوت تصاویر بارگذاری شده. یک تابع که از بایت های دقیق به بایت های پوشیده شده در رابطه با داده های خود حرکت می کند، و حسابداری جابجایی بخش را نام می دهد که حرکت کرده است.
- برای هر مسابقه، جدول های مرجع را مقایسه کنید. همان کد با ثابت های مختلف یک تابع اصلاح شده است.
- مرحله نام ها را اجرا کنید و مقایسه کنید. وقتی که ساخت دارای نمادها باشد، ترتیب BinDiff را اجرا کنید و تنها برای طبقه بندی مراحل از نتیجه ساختاری استفاده کنید.
- وقتی یک ابزار نسبت را گزارش می دهد، قبل از مقایسه آن با خود، بفهمید که بائتهایی که وارد آن شده اند.
- برای تابع که ورودی های آن را می خواهید، IR را با یک آدرس در هر عبارت بنویسید، اجرا کنید
execute()با یک خط در هر شماره حلقه نمادین، و هر صفحه را حل کنید. خط را با نتیجه گزارش دهید. - همان سوال را از طریق angr یا z3 اجرا کنید و حدود کلاس را مقایسه کنید. یک نمونه یک مدل است.
آزمایشگاه تعاملی
لابراتوار A: پنج امضا دست
ازcodeدایرکتوری، پیتون باز:
cd phases/13-tools-and-protocols/44-binary-diffing-and-symbolic-execution/code
python3 -qراه رفتن:
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()قبل از چاپ 4 بایت را در آفست 0x26 از تابع بنویسید grade.rawپس همون خط رو ادامه بدهgradeازledger-x86_64-O0.oو شمارش رو بکنtableلبه ها در grade.edges. .
لابراتوار ب: نگاه کن به جابجایی با بیت هاش
case = grade_relocation_case()
case["layout"]
case["displacements"], case["rodataShift"]
case["objectBytesEqual"], case["imageBytesEqual"], case["maskedImageBytesEqual"]حساب کردن0x100110 + 0x14 - 0x10003aقبل از اينکه بخواني روي کاغذdisplacementsپس پايين رو درload_image()به 0x400000 و تایید کنید که جابجایی ها تغییر نمی کنند، زیرا هر دو اپراند به طور همزمان حرکت می کنند.
لابراتوار C: مطابقت نادرست و ترتیب که از آن اجتناب می کند
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]چاپrecords(...)["percent_change"].cfg_shape()برای-O0وgrade_labelبرای-O1و دو درجه را بخونید. سپس مرحله ششم را بنویسید که mnemonics مرتب شده را هاش می کند، بنابراین ترتیب دیگر مهم نیست، و ببینید که آیا آنها را جدا می کند.
آزمایشگاه D: مسیرها و مرز
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"]تغییرSCORE_DOMAINبهrange(0, 110)و دوباره اجرا شدgrade_paths("O0"). کلاس برای 0 به 60 ورودی کاهش می یابد و دو چک عبور هنوز هم برقرار است. سپس دامنه را به range(90, 100)و بخونيد که چه برگ ها نماد ندارن
آزمایشگاه تمرین
بيني ديف رو بر روي تيرانداز ها اجرا کن و با سه نتيجه که قبلاً داشتي مقایسه کن
الزامات:
- افزونه BinExport را در Ghidra 12.1.4 نصب کنید و سه برنامه دفترچه را صادر کنید. برچسب انتشار BinExport و نسخه Ghidra را ثبت کنید.
- خط فرمان BinDiff 8 رو نصب کن و محصول رو تولید کن
-O0در مقابل-O1و-O1در مقابل-O2نتایج با گزینه ی فقط شباهت. - به طور کلی، به طور کلی، این قابلیت ها را به طور کامل در نظر بگیرید.
code/fixtures/با دستورات دقیق درbuild_fixtures.sh. . - طولاني
tool_comparison()با یکbindiffستون و اضافه کردن یک تست که مقایسه با BinDiff's متناظر مجموعه در-O1در مقابل-O2با مجموعه بايت هاي مخفي درس - يه پاراگراف بنویس که اسم الگوریتم استفاده شده توسط بن دیف رو برایش بنویس
gradeو اینکه آیا تصاویر بارگذاری شده را مقایسه کرده است.
موفقیت به این معنی است که دمو چهار ستون ابزار را در هر تابع چاپ می کند و آزمون جدید یک مساوات یا یک تفاوت توضیح داده شده را بیان می کند.
درس هنرپیشه
این درس شاملoutputs/skill-binary-diffing-and-symbolic-execution.md. از آن برای تبدیل دو ساخت و یک تابع به یک تفاوت مرحله ای با یک کیفیت مشخص شده در هر مسابقه، یک توضیح از هر عملکرد بی نظیر یا تغییر و یک گزارش مسیر با یک مجموعه ورودی حل شده در هر برگ و مرز تولید آن استفاده کنید.
بررسی کنید
نمایش و سويت رو اجرا کن:
cd phases/13-tools-and-protocols/44-binary-diffing-and-symbolic-execution
python3 code/main.py
python3 -m unittest discover -s code/tests -vبررسی باید ثابت کند:
- جدول های نماد چهار تابع را با اندازه های 46، 118، 66 و 39 در
-O0، 16 ، 46 ، 31 ، 63 در-O1، و 16 ، 46 ، 140 ، 63 در-O2 - .
.rela.textثبتات-O1این موضوع را به عنوانllvm-objdump -rچاپشون مي کنه - هر دستورالعمل ذکر شده در دامنه نماد خود قرار دارد و بائتهای آن برابر با شی هستند و بائتهای تغییر یافته افزایش می یابد
totalدر-O1پنج بلوک، پنج لبه و یک حلقه خود دارد و رشته شکل آن تعیین کننده استgradeدر-O0پنج هدف از میز پرتاب را از.rela.rodataو هشت بلوک و یازده لبه دارد.- بدون میز
gradeدر-O082 بايت در 4 بلوک percent_changeدر-O0وgrade_labelدر-O1شکل چهار بلوک همگی داشته باشند- هشت های دقیق و پنهان در هر عملکرد یک شی قابل انتقال موافق هستند
-O1و-O2بائتهای اشتراک گذاری برای سه تابع-O0و-O1هیچ سهم- جدول اشاره شده از
gradeمیخواد1, 2, 3, 4, 4و خواننده ی نامزد1, 2, 3, 4, 3 - محل های بارگیری
.text،.rodataو.rodata.str1.1که گيدرا آنها را در هر دو برنامه قرار داد R_X86_64_PC32نوشته شده است:S + A - Pو باعث تسکین 122 می شود وR_X86_64_64نوشته ها در.dataآدرس های رشته ای را دریافت کنیدgradeبائتهای بائتهای با هم در اشیاء موافق هستند و با تغییر 0x70 در تصاویر متفاوت هستند و ماسک کردن مطابقت را به حالت درست می کند-O1در مقابل-O2با سه تابع در بايت هاي دقیق مطابقت دارد وtotalبا اسمش مطابقت داردgradeبا بائتهای پوشیده با شباهت 1 - 1/46- ترتیب درس یک تطابق شکل خطای جریان را در
-O0در مقابل-O1، و دستور بن دیف با همچين چهار نفر با اسم هم مطابقت داره - نامزده ی پیچ در بایت ها مطابقت دارد و در داده های مرجع شده شکست می خورد
- نسبت لڤنشتین 0.130435, 0.106061, 0.269841, 0.171429, 0.426829 بر روی 82 بایت و نسبت های بایت های نقل مکان شده را با نقل مکان های اعمال شده نشان می دهد.
- مجموعه MATCH radiff2 برابر با مرحله باایت های دقیق است و بائتهای Ghidra و همبستگی های دستورالعمل برابر با مجموعه های دقیق و پوشیده در نمایش تصویر است
- گيدرا فقط نام ها رو پيدا کرد
-O0در مقابل-O1، با شباهت 1.0 و اعتماد 10.0 در هر مسابقه - IR دستی یک بار هر دستورالعمل ذکر شده را پوشش می دهد و ارزیابی کننده از سیمنتک C پیروی می کند
gradeپنج راه داره-O0با شرایط تغییر و دو تا در-O1با همان کلاس ها- کلاس های محدود 60 تا 69, 70 تا 79, 80 تا 89, 90 تا 109 برابر angr در هر سه سطح و z3، با 5 و 2 حالت محدود و محدوده بلوک 90 تا 109
- دو چک عبور در مرز، در angr، یا در z3 هیچ مدل ای ندارند و z3 نشان می دهد که لیست برابر با سوئیچ منبع است
- هر
percent_changeمدل از جستجوی محدود، angr و z3 به ارزش مورد نیاز ارزیابی می شود total3، 5، 9 مسیر را با مجموعات مثلث، برابر با angr، و step cap 22 را باز می دهد و 2 را کوتاه می کند- داده های ارقام هر دو دیدگاه، شماره های نقل مکان و پنج برگ با مجموعه ورودی خود را در خود دارد و ماژول سایت همان داده ها را در خود قرار می دهد
روش های شکست تولید
| 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 |
قاعده عملیاتی
با یک امضا در یک زمان مطابقت داشته باشید، فقط ارزش های منحصر به فرد را در هر دو طرف قبول کنید و مرحله و کیفیت آن را با مسابقه نگه دارید. اشیاء و تصاویر بارگذاری شده را متمایز کنید و هر عملکردی را که مرحله را بین دو تغییر می دهد توضیح دهید. مسیرها را با یک حل کننده در هر شاخه شماره دهید، هر حلقه نمادین را محدود کنید و مجموعه ورودی را با مرز آن گزارش کنید. یک مدل بدون مرز نمونه ای است.
خواندن بیشتر
- 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 notesوBinary Similarity user guide
- radare2 book: radiff2و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)و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 pipelineو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.