Phase 13: Tools & Protocols

تفاوت دوگانه و اجرای نماد: مطابقت عملکردها و حل ورودی

یک مطابقت بین دو تابع یک ادعای است که توسط یک امضا با یک کیفیت انجام می شود و یک ورودی حل شده یک مدل از یک شرایط مسیر است؛ این درس هر دو را ایجاد می کند و آنها را در برابر radiff2 ، Ghidra ، angr و z3 بررسی می کند.

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 منمونک رو هاش می کنه:

output
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()برای هر مرحله، عملکردهای هنوز هم بی نظیر را در هر طرف با امضای مرحله جمع می کند و هر مقدار را که دقیقاً یک عملکرد در هر طرف دارد، پذیرفته است.

python
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:

FunctionStageAgreeing signaturesSimilarity
percent_changeexact bytesall five1.000
gradeexact bytesall five1.000
totalnamename only0.171
grade_labelexact bytesall five1.000

totalاز 31 بایت و 13 دستورالعمل به 140 بایت و 41 دستورالعمل رشد کرد، زیرا clang لوله را با SSE2 وکتوریزه کرد و لوله باقی مانده اسکالر را حفظ کرد. شکل آن از پنج بلوک و پنج لبه به ده بلوک و سیزده لبه منتقل شد. هیچ چیزی ساختاری زنده نمی ماند و تنها نماد دو را به هم می پیوندد.

برای-O0مخالف-O1در همان ترتیب یک مطابقت اشتباه پیدا می کند:

Function at -O0Matched at -O1StageNames agree
percent_changegrade_labelflow-graph shapeno
gradegradenameyes
totaltotalnameyes
grade_labelunmatched

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
.text0x100000, 159 bytes0x100000, 271 bytes
.rodata0x1000a00x100110
.rodata.str1.10x1000f00x100160

.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، نسبت، و اندازه و آدرس درست. ردیف های ضبط شده برای اشیاء ما:

Pairpercent_changegradetotalgrade_label
-O0 vs -O1UNMATCH 0.130435UNMATCH 0.426829UNMATCH 0.106061UNMATCH 0.269841
-O1 vs -O2MATCH 1.000000MATCH 1.000000UNMATCH 0.171429MATCH 1.000000
-O1 vs -O1MATCH 1.000000MATCH 1.000000MATCH 1.000000MATCH 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 Match4 functions4 functions, 5 data items (labels.rel, .L.str.1 to .L.str.4)
Exact Data Match00
Exact Function Bytes Match02 (percent_change, grade_label)
Exact Function Instructions Match03 (adds grade)
Exact Function Mnemonics Match03
Duplicate Function Instructions Match00

هر فانکشن در بین-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:

output
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 ارزیابی و چند میلی ثانیه. حل هر ورق برای مجموعه ورودی به این نتیجه می رسد:

LeafReturnsConditionScores in the bound
0x764!(q >u 4) && (q == 3 || q == 4)90 to 109, 20 inputs
0x7f3!(q >u 4) && q == 280 to 89, 10 inputs
0x882!(q >u 4) && q == 170 to 79, 10 inputs
0x911!(q >u 4) && q == 060 to 69, 10 inputs
0x9a0q >u 41,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 بدون تخليه

آن را بسازید

نمایش نمایش را اجرا کن:

bash
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در این ترتیب:

  1. ElfObjectبخش ها، نمادها و.rela.*سوابقparse_listing()میخوادllvm-objdumpمتن
  2. jump_table_targets()وbuild_cfg()بلوک های قابل دسترس و لبه های تایپ شده را فراهم کنید.FunctionRecord.signatures()پنج امضا را به وجود می آورد.
  3. load_image()بخش های اختصاصی را مشخص می کند و اعمال می شود S + A - PوS + A. .
  4. match_functions(). همکار سازندهlevenshtein()وradare2_ratio()شباهت را نشان می دهد.
  5. parse_radiff2()وparse_ghidra_vt()برای مقایسه، نتایج ابزار ضبط شده را بخوانید.
  6. evaluate()،substitute()وBoundedSearchدر واقع، این ها عبارت های معنوی و حل کننده هستند.
  7. execute()مسیرها رو فهرست ميکنهsolve_returns()هر برگ را برای یک مجموعه ورودی می طلبد.
  8. 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 در این ترتیب در دو ساخت برنامه خود استفاده کنید.

  1. برای هر شی لیست بگیرید و بگذاریدfunction_record()با بت ها رو بررسي کن، قبل از هر چيزي ديگه فهرست رو درست کن
  2. ابتدا فایل های شی را تفاوتی کنید. مرحله هر تطابق را بخوانید و تطابق شکل گراف جریان را به عنوان پیشنهادات نگاه کنید تا امضای دوم موافق باشد.
  3. تفاوت تصاویر بارگذاری شده. یک تابع که از بایت های دقیق به بایت های پوشیده شده در رابطه با داده های خود حرکت می کند، و حسابداری جابجایی بخش را نام می دهد که حرکت کرده است.
  4. برای هر مسابقه، جدول های مرجع را مقایسه کنید. همان کد با ثابت های مختلف یک تابع اصلاح شده است.
  5. مرحله نام ها را اجرا کنید و مقایسه کنید. وقتی که ساخت دارای نمادها باشد، ترتیب BinDiff را اجرا کنید و تنها برای طبقه بندی مراحل از نتیجه ساختاری استفاده کنید.
  6. وقتی یک ابزار نسبت را گزارش می دهد، قبل از مقایسه آن با خود، بفهمید که بائتهایی که وارد آن شده اند.
  7. برای تابع که ورودی های آن را می خواهید، IR را با یک آدرس در هر عبارت بنویسید، اجرا کنید execute()با یک خط در هر شماره حلقه نمادین، و هر صفحه را حل کنید. خط را با نتیجه گزارش دهید.
  8. همان سوال را از طریق angr یا z3 اجرا کنید و حدود کلاس را مقایسه کنید. یک نمونه یک مدل است.

آزمایشگاه تعاملی

لابراتوار A: پنج امضا دست

ازcodeدایرکتوری، پیتون باز:

bash
cd phases/13-tools-and-protocols/44-binary-diffing-and-symbolic-execution/code
python3 -q

راه رفتن:

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

لابراتوار ب: نگاه کن به جابجایی با بیت هاش

python
case = grade_relocation_case()
case["layout"]
case["displacements"], case["rodataShift"]
case["objectBytesEqual"], case["imageBytesEqual"], case["maskedImageBytesEqual"]

حساب کردن0x100110 + 0x14 - 0x10003aقبل از اينکه بخواني روي کاغذdisplacementsپس پايين رو درload_image()به 0x400000 و تایید کنید که جابجایی ها تغییر نمی کنند، زیرا هر دو اپراند به طور همزمان حرکت می کنند.

لابراتوار C: مطابقت نادرست و ترتیب که از آن اجتناب می کند

python
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: مسیرها و مرز

python
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. از آن برای تبدیل دو ساخت و یک تابع به یک تفاوت مرحله ای با یک کیفیت مشخص شده در هر مسابقه، یک توضیح از هر عملکرد بی نظیر یا تغییر و یک گزارش مسیر با یک مجموعه ورودی حل شده در هر برگ و مرز تولید آن استفاده کنید.

بررسی کنید

نمایش و سويت رو اجرا کن:

bash
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 را کوتاه می کند
  • داده های ارقام هر دو دیدگاه، شماره های نقل مکان و پنج برگ با مجموعه ورودی خود را در خود دارد و ماژول سایت همان داده ها را در خود قرار می دهد

روش های شکست تولید

FailureWhat the weak tool reportsWhat the analysis must prove
Byte hash on a loaded image"grade modified" between two builds with identical codeThe 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 aloneA confident pair of unrelated functionsA second signature agrees, or the names contradict and the match is dropped
Names before structure on a stripped buildNothing matchesThe 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 boundA timeoutThe bound or the cap, the paths returned, truncated, and never started
Closed tool described as runNumbers with no captureA capture file with the command and version, or a sentence saying documentation only

قاعده عملیاتی

با یک امضا در یک زمان مطابقت داشته باشید، فقط ارزش های منحصر به فرد را در هر دو طرف قبول کنید و مرحله و کیفیت آن را با مسابقه نگه دارید. اشیاء و تصاویر بارگذاری شده را متمایز کنید و هر عملکردی را که مرحله را بین دو تغییر می دهد توضیح دهید. مسیرها را با یک حل کننده در هر شاخه شماره دهید، هر حلقه نمادین را محدود کنید و مجموعه ورودی را با مرز آن گزارش کنید. یک مدل بدون مرز نمونه ای است.

خواندن بیشتر

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.