Phase 13: Tools & Protocols

المشهد الهندسي العكسي: التاريخ، أدوات الأسر، وكيفية بناء جهاز إزالة

خمس أدوات تقرأ نفس الكائن وتعطى أربعة عناوين، ثلاثة حسابات كتلة، و اثنين من الإجابات لمفتاح واحد، وهذا الدروس يبني الخيط الذي يظهر أي هو أي.

Type: Build

Languages: Python, C, x86-64 assembly, Java (one Ghidra script)

Prerequisites: Phase 13 · 32 (ELF from scratch), Phase 13 · 33 (disassembly and control flow), Phase 13 · 34 (lifting to pseudocode)

Time: ~150 minutes

أهداف التعلم

  • ضع أدوات الميدان الرئيسية على جدول زمني يُؤرخ من عام 1973 إلى عام 2026 واطلق اسم العائلة التي تنتمي إليها كل واحدة.
  • أسمائ الدورات الثمانية لتحليل الملفات والمعنى الذي يستخدمه غيدرا، النينجا الثنائية، الأشعة السبعية، الرادار2، الريزين، و Angr لكل مرحلة.
  • ارفع تعليمات واحدة إلى ESIL و RzIL و P- code و VEX و اشرح من بينها يكتب العلامات بحماس و الذي يحفظ قطعة.
  • خفض عناوين خمسة أدوات إلى واحد .textتعويض وتثبت الحد من وظيفة واحدة.
  • قم ببناء خط مقارنة يقرأ نتائج الأداة المكتسبة ويعلن الاتفاق على بدء التعليمات والكتلة والحواف والعمل.
  • اسم، من الأدلة المسجلة، حيث كل أداة يختلق الرمز، يفتقد الرمز، أو يتوقف عند قفزة غير مباشرة.

المشكلة

تطلب من العميل أن يجمع ما تقول عنه ثلاثة أدوات هندسة عكسيةgradeفيledger-x86_64-O1.o. العميل يدير كل أداة، يقرأ ثلاثة قائمة، ويقول أن الوظيفة تقع في 0x08000050في أداة واحدة0x400010في آخر، و0x100010في الثالثة، يخلص إلى أن الأدوات تختلف حول مكان الوظيفة.

الأدوات توافق. يمكن نقل الكائن و ليس لديه عنوان تحميل، لذلك كل أداة تختار واحدة. خصم العنوان الذي أعطاه كل أداة .textوكل إجابة هي0x10لقد قارن العميل العناوين الخامة لأن لا شيء يخبرها ما يعنيه العنوان في كل أداة

لاحقاً نفس العميل يقرأgradeفي-O0بناء وتقديم تقارير عن 3، 8، 8، و 9 كتلة أساسية من أربعة أدوات. كل الأرقام الأربعة حقيقية. أداة واحدة توقفت فيjmp raxاثنان من الأدوات تقرأ جدول القفز من خلال عمليات إعادة توزيعه. أداة واحدة تقسم كتلة عند القفز لوضع علامة. حساب كتلة دون سبب وراءه هو رقم دون دعوى.

هذه الدروس هي الخريطة التي تحتاجها قبل أن تثق بأي من هذه الأرقام دروس 32 إلى 36 قاموا ببناء جهاز تشخيص واحد، ورفع واحد، و سجل واحد من الأدلة، و إعادة بناء واحد. النصف الثاني من المسار يضعهم بجانب الأدوات التي يستخدمها الناس. للقيام بذلك تحتاج إلى تاريخ الحقل، والعائلات التي تقع فيها الأدوات، والخط الأنابيب التي تعمل كل مفصل، والحبل الذي يقارن ما تقول الأدوات على الأشياء التي قمت بتجميعها بنفسك.

ثلاث وخمسين عاماً في خطوات متأرخة

هذا الحقل قديم أكثر من معظم أدواته. كل تاريخ أدناه لديه مصدر أساسي في القراءة المتقدمة.

1973 إلى 1991: أول من يقوم بتحريف المعلومات، ثم من يقوم بتفكيكها

أول أطروحة إزالة هي من عام 1973. كتبها هولاندر في ستانفورد وهوسل في بوردو، وكلاهما معروف اليوم من خلال الاقتباسات. كانت الأدوات العملية في الفترة هي المخططات. كتب مارانزانو وبورنadbوذلك في عام 1977، وذلك في عام 1979، وذلك في عام 1979، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1979، وذلك في عام 1979، وذلك في عام 1979، وذلك في عام 1979، وذلك في عام 1979، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام 1977، وذلك في عام عام 2007، وذلك في عام 2008، وذلك في عام 2008، في عام 2008، وذلك في عام 2008، في عام 2008، وذلك في عام 2008، في عام 2008، في عام 2008،DEBUG، مع إزالة 8086 ، تم إرسالها في PC-DOS 1.00 في أغسطس 1981. دخلت GDB من ريتشارد ستالمان التوزيع في عام 1986. وضع SoftICE إزالة عوارض النواة تحت DOS في عام 1987.

جاءت أجهزة تفكيك المجموعات التالية. قام Sourcer ، من V Communications في عام 1988 ، بتشغيل مرورات متعددة على برنامج DOS وكتب قائمة تعليقات. بدأت أجهزة GNU Binutils مع صور سريعة غير عددية في عام 1988 ، و objdumpيحمل حق النشر في عام 1990. كتب إلفاك غيلفانوف أول سطر من IDA في يناير 1991 و أصدرت IDA 0.1 كبرنامج مشارك في 20 مايو 1991.

1991 إلى 2009: مفكّرات تفكّر وتفكّرات أولى

أكملت كريستينا سيفونيتس "تقنيات التجميع العكسي" في جامعة كيوت في يوليو 1994.dcc، أخذ i80286 برامج DOS إلى C ، ورقتها 1995 مع غوف وضع المراحل التي تبقيها كل مفكّر لاحقا. تابع REC في عام 1997 و Boomerang في عام 2002 ، أول مفكّر مفتوح المصدر ، تحت رخصة BSD.

أصبحت IDA منتجًا تجاريًا في DataRescue في عام 1996 ، واكتسب SDK التضمين في عام 1999 ، ثم انتقل إلى Hex-Rays ، التي تأسست في عام 2005. تم شحن Hex-Rays Decompiler 1.0 في 17 سبتمبر 2007. في نفس العام قدم مايك فان إيمريك "التعيين الواحد الدولي لتحميل" ، وهو أطروحة وضعت SSA في مركز تدفق البيانات لتحميل. بدأ "المقارنة الهيكلية للأشياء القابلة للتنفيذ" (2004) من هالفار فلايك عائلة مختلفة، ودخل بنديف للبيع في أغسطس 2004.

بدأت radare في فبراير 2006 كمحرر شفرة للطب الشرعي مع تعويضات 64 بت. كان radare2 ، الإعادة كتابة المودولية تحت LGPL-3.0 ، تم إصدارها لأول مرة في 7 مارس 2009.

2009 إلى 2019: الإطار والتمثيلات الوسطى

أعلنت LLDB كشركة LLVM في 8 يونيو 2010. ظهرت BAP ، منصة تحليل ثنائي مع لغتها المتوسطة BIL ، في CAV 2011. اشترت Google zynamics ، صانعي BinDiff ، في 1 مارس 2011. ظهرت Hopper على متجر Mac App حوالي نهاية عام 2011. بدأ Matt Godbolt Compiler Explorer في عام 2012 بحيث يمكن لمبرمج C ++ رؤية الجمعية التي ينتجها المُحَرِّق.

تلقت angr أول سطر من الشفرة في أغسطس 2013. أظهرت ورقة فينيكس (Schwartz, Lee, Woo, Brumley, USENIX Security 2013) الهيكلات التي تحافظ على التسمية مع 40 gotoالتعبيرات عبر 8676 وظيفة.gotoالبيانات ذات الهيكل المستقل عن النمط. تأسست شركة Vector 35 في 14 يناير 2015 ، وبدأت Binary Ninja للبيع في 23 يوليو 2016 مع IL منخفض المستوى و API Python. تم إطلاق Angr علناً في عام 2015 ، وتم تحدي DARPA Cyber Grand Challenge في أغسطس 2016. أصبحت بنديف مجانية في مارس 2016. أعطى Cutter 1.0 radare2 واجهة تعريف Qt في ديسمبر 2017. في عام 2018 قدم غيلفانوف "الجهاز الداخلي لـ Decompiler: microcode" في Recon ، وهو أول وصف عام لـ Hex-Rays IR.

2019 إلى 2026: فتح المتحللين والتحقيقات

تم إصدار Ghidra 9.0 من قبل وكالة الأمن القومي في مؤتمر RSA في 5 مارس 2019 تحت Apache-2.0, مع المصدر الكامل على GitHub بعد شهر. إضافة إضافة إضافية إضافية في نفس العام. أصدرت Binary Ninja 2.0 جهاز تحرير IL عالي المستوى في 20 مايو 2020. أعلن عن ريزين كشوكة من رادار2 في 8 ديسمبر 2020 ، وانتقل فريق كاتر إليه. إيدا فريوار 7.6 أضاف إصدارًا لـ cloud x64 decompiler في مايو 2021.

تم إطلاق BinDiff 8 بموجب Apache-2.0 مفتوحًا في 25 سبتمبر 2023. أصبحت SAILR (بالباسك وغيرها ، USENIX Security 2024) مهيمنًا افتراضيًا لـ Angr وقالت إنها مجرد مزيفة gotoيجب إزالة البيانات ، لأن لينكس 6.1 لديه 3754 منها في مصدرها. إضافة النينجا الثنائية 4.0 إصدار مجاني في فبراير 2024, وإضافة IDA 9.0 idalibيبدأ دراسة "SLaDe" (2023) من "LLM4Decompile" (2024) إلى "DecompileBench" (2025) ، ودوران دراسات 2026 حول القراءة بمساعدة الوكيل وعن المتحللين الذين يقومون بإعادة جمع المزيد والحفاظ على أقل.

الإصدارات التي تم تشغيلها هذه الدروس هي الإصدارات الحالية في 14 أكتوبر 2026: غيدرا 12.1.4 (21 سبتمبر 2026) ، الرادار2 6.2.4 (5 أكتوبر 2026) ، الريزين 0.9.1 (29 يونيو 2026) ، و Angr 10.0.3 (10 أكتوبر 2026). النينجا الثنائية 6.0 "كريبتون" (3 سبتمبر 2026) و IDA 9.4 (13 يوليو 2026) هي الأدوات المغلقة الحالية. لم تشغلها هذه الدروس.

العائلات الأدوات

الأداة تنتمي إلى عائلة من خلال ما تنتجها العائلات تتداخل في برنامج واحد، والتداخل هو حيث يبدأ معظم الخلط.

المزج

تشكيل صفوف خطي من أول بايت من قسم الرمز إلى آخر.objdump -dوllvm-objdump -dيعمل بهذه الطريقة، ولا أحد يبني رسمية تدفق التحكم.objdumpيعامل الرموز على أنها حدود التعليمات ويتم مسحها بينها. binutils 2.47 (26 يوليو 2026) هو GPL-3.0 أو أحدث. LLVM 23.1.3 هو Apache-2.0 مع استثناء LLVM. أبل أدوات خط الأوامر السفينة llvm-objdump"أبل LLVM نسخة 17.0.0"، وهذا هو النسخة هذه الدروس التقاط.

يقوم جهاز تفكيك تفكيكي بتشغيل النزول الترددي من الإدخالات المعروفة، ويضيف الهورستيات لبدء الوظيفة، ويحتفظ بقاعدة بيانات.Disassemblerبالإضافة إلى المحللات التلقائية ، النينجا الثنائية (النزول المتكرر ، ثم التصفية الخطية على مناطق غير معروفة) ، هوبر ، رادار2 و ريزين (aa،aaa،af), مع كاتر وإياتو كGUI، جميعها في هذه العائلة. قياس أندرييس وغيرها (USENIX Security 2016) تسعة منهم على ثنائيات التي يولدها المُجمّع. كانت دقة التعليمات قريبة من 100 في المائة، وكانت البدائية الصلبة هي بدء الوظيفة، مع معدلات سلبية كاذبة من 20 في المائة أو أكثر.

المتحللات

المتحللات التجارية: Hex-Rays Decompiler (عشرة عشرة عائلة هدفا من x86 إلى RISC-V) ، HLIL من Binary Ninja مع تقديمها Pseudo C ، ومشاهدة هوبر من رموز مزيفة. المتحللات المفتوحة: تحلل Ghidra، محرك C ++ تحت Apache-2.0 الذي r2ghidra و rz-ghidra يستخدمون مرة أخرى كمنشط و الذي pypcode يستخدمون مرة أخرى كرفيع؛ تحلل Angr على AIL مع SAILR هيكلة تحت BSD-2-Clause؛ r2dec و jsdec في JavaScript؛ بوميرانغ و dccكما هو الحال في التاريخ. رادار2 لديه أيضاً مدمجpdc"إخراج مفصل مزيف في نحو تشبه "سي" "ريسين" ليس لديه مفصل متكاملpdcلا توجد في الريزين 0. 9. 1 و pdgيحتاج إلى مضخة RZ-Gidra.

إزالة الأخطاء

GDB (1986) مع GEF و pwndbg front-end ، LLDB (2010) ، WinDbg مع Time Travel Debugging (2017) ، OllyDbg (مجمود في 2014) ، x64dbg (GPL-3.0, 2014) ، Ghidra Debugger مع وصلات Python ، Binary Ninja debugger ، والمنشطات المدمجة ل radare2 و rizin. يستخدم الدروس 42 اثنين منهم على بناءاتك الخاصة.

إطار تحليل ثنائي

(VEX IR، التنفيذ الرمزي، CFGFastوCFGEmulated(BIL, OCaml), Dyninst, Jakstab, و ByteWeight هي الإطارات التي سميت أنديس.import binaryninja، و إدارة الدفاع عبرidalib. . .

المكتبات المنسيقية والحرك

يصفح LIEF 1.0.0 (12 يوليو 2026, Apache-2.0) ELF، PE، Mach-O، COFF، و تنسيقات أندرويد. CLE، "CLE Loads Everything" ، هو محرك تحميل Angr. كابستون 5.0.9 (28 مايو 2026, BSD-3-Clause) يقرر؛ كايستون 0.9.2 (GPL-2.0) تجمع؛ يونيكورن 2.1.4 (GPL-2.0) محاكاة. radare2 6.2.4 حزم كابستون 5، و رزين 0.9.1 بائع كابستون، زيدس، و محارس الأشجار.

أدوات التفريغ ومشاهد جانبية للمحاكم

بنديف 8 (أباتشي-2.0) مع ملحق BinExport 12 له ل IDA Pro ، Binary Ninja ، و Ghidra ؛ Diaphora 3.4.3 (11 أكتوبر 2026, AGPL-3.0) كملحق IDA ؛ radiff2وrz-diff. يظهر متصفح المجمعين (BSD-2-Clause) الجمعية التي ينبعث منها المجمعين لقطعة المصدر ، والتي هي الاتجاه الأمامي لكل شيء آخر في هذه القائمة. يستخدم الدروس 44 العائلة المختلفة.

الإصدارات والترخيصات وما كان هذا الدروس

ToolVersion read on 2026-10-14LicenceHeadless entryRan here
Ghidra12.1.4Apache-2.0analyzeHeadless, pyghidra.start()yes, on all four objects
radare26.2.4LGPL-3.0r2 -qc '<cmds>' file, rabin2yes
rizin0.9.1LGPL-3.0rizin -qc '<cmds>' file, rz-binyes
angr10.0.3BSD-2-Clauseangr.Project in Pythonyes
llvm-objdumpApple LLVM 17.0.0Apache-2.0 with LLVM exceptionllvm-objdump -d -ryes
Binary Ninja6.0 "Krypton"commercial; Free edition for non-commercial usebinaryninja.load() with a Commercial, Ultimate, or headless licenceno, documentation only
IDA Pro9.4commercial subscription; IDA Free for non-commercial x86 and x86-64idat, ida -A -S, idalibno, documentation only
Hopper6.6.0commercial, perpetualnone documentedno, documentation only
Cutter2.5.0GPL-3.0GUI over rizinno

الإصدار المجانى من ثنائي نينجا يفكّر x86, x86-64, ARMv7 و AArch64 فقط وليس لديه API. لا يوجد IDA Free IDAPython، لا SDK، ولا idalibكل بيان عن هذين الأدويتين في هذه الدروس يأتي من وثائقهم وملاحظات الإفراج، والرقم يُعَلِّمهم بأنهم لا يعملون.

خط أنابيب إزالة المواد، خطوة بخطوة

سمي سيفوانتس المراحل في عام 1994: تحليل النص، التحليل الترجموي، توليد الرمز المتوسط، توليد الرسم البياني للتدفق التحكم، تحليل التدفق البيانات، تحليل التدفق التحكم، وتوليد الرمز. وقسمتهم إلى نهاية مقدمة تعتمد على الآلة، ووسط مستقل عن الآلة واللغة، وآخر خلفي تعتمد على اللغة. كل مُفكّر منذ ذلك الحين يبقي هذا الشكل ويعيد تسمية الأجزاء. الجدول أدناه يعطي الثمانية مراحل تستخدم هذه الدروس والاسم الذي يعطيه كل أداة. الرسمي يظهر نفس الجدول مع أعمدة الأدوات قابلة للاختيار.

StageGhidraBinary NinjaHex-Rays / IDAradare2rizinangr
LoaderElfLoader, MachoLoader, PeLoader; .ldefs picks the languageBinaryView, BinaryViewTypeloader module (LDSC)RBin (rabin2)RzBin (rz-bin)CLE (cle.Loader, main_object)
DisassemblyDisassembler; SLEIGH .slaspec compiled to .sla; analyzers "Disassemble Entry Points", "Function Start Search"architecture plugin; Recursive Descent, then linear sweep phasesprocessor module (ana.cpp, emu.cpp, out.cpp); autoanalysis queues; FLIRTRArch plugin to RAnalOp; aa, aaa, afRzAnalysis plugin; aa, aaa, afCapstone blocks; CFGFast function start search
CFG recovery"Generate Basic Blocks and the CFG"; BlockGraph; "Decompiler Switch Analysis"Function, BasicBlock; "Control Flow Graph (CFG) Analysis" phasembl_graph_t, ready at MMAT_LOCOPTafb, agf, aabafb, agf, aab (Nucleus)CFGFast, CFGEmulated; kb.functions; IRSB
Lifting"Generate Raw P-code"; Varnodes in ram, register, const, uniqueLifted IL, LLIL, Mapped MLIL, MLILmicrocode (minsn_t, mop_t); MMAT_GENERATEDESIL (asm.esil, ae)RzIL (aoi, aez)VEX (pyvex.lift, IRSB), then AIL
SSAHeritage, ActionHeritage; MULTIEQUAL, INDIRECTLLIL SSA, MLIL SSA, HLIL SSA; HLIL_VAR_PHIno named SSA; use-def data flow in MMAT_GLBOPT1 to 3none; ESIL is built for emulationnone; RzIL is built for emulation_stage_transform_to_ssa_level0 and level1; SeqNodeDephication
Data flow and typesActionDeadCode, ActionInferTypes, the Rule pool; prototype from .cspecMLIL constant propagation, variables and types; analyzeReturns"Transform microcode"; MMAT_CALLS, MMAT_GLBOPT, MMAT_LVARS; TILafv, afc, aaft; ESIL emulationafv, afc, aftCallingConventionAnalysis, VariableRecoveryFast, Typehoon
StructuringCollapseStructure; BlockIf, BlockWhileDo, BlockSwitch, BlockGotoHLIL_IF, HLIL_WHILE, HLIL_SWITCH; AST at root"Generate ctree"; structural analysis; goto regionspdc; pdd (r2dec); pdg (r2ghidra)pdg (rz-ghidra); jsdecRegionIdentifier; RecursiveStructurer with SAILRStructurer
Emission"Emit Final C Tokens"; PrintC, ActionNameVars, ActionSetCastsHLIL rendering; Pseudo C, Pseudo Rust, Pseudo Python"Beautify ctree; Print ctree"; cfunc_ttext of pdc, pdd, pdgpdg textCStructuredCodeGenerator; codegen.text

الحمولة

يقوم الشاحن بتحليل الحاوية، ويقوم بتحليل القسمات، ويقرأ الرموز والتحويلات. في كائن قابل للتحويل لا يوجد شيء لديه عنوان بعد، لذلك يختار الشاحن واحد.0x08000000، مما يضع.textفي0x08000040لأن القسم يبدأ عند تعويض الملف 0x40. أماكن CLE.textفي0x400000-جيدراElfLoaderيضعها في0x100000. .llvm-objdumpيُطبعُ مُزَحَفَاتَ القسمِ و لا قاعدةَ على الإطلاقِ.

يختلف الحملات أيضاً في عمليات التنقل. تقوم Ghidra بمعالجةها عند الاستيراد، وتطبقها CLE.bin.relocs.apply=trueما يفعله الحامل مع عمليات التنقل يقرر ما يمكن أن يراه كل مرحلة لاحقة، وسوف تلتقي بالنتيجة في -O0قفزوا على الطاولة من أسفل.

التفكيك

دراسة 33 بنيت كلا الطرق كل أداة في الطاولة باستثناءllvm-objdumpيدير التنزل الترددي ثم يضيف بحث عن البداية تسمي وثائق Ninja الثنائية المراحل بالترتيب: التراجعية التنازلية، تحليل الهدف الدعوة، تحليل CFG على أنها "انزلاق خطي للمناطق غير المعروفة"، وتحليل الدعوة الذيل. تقوم "غيدرا" بتشغيل المحللات حسب الأولوية، مع "فك نقاط الدخول" و "بحث بدء الوظيفة" مبكراً. إدارة التحليلات المركزية تحتفظ بعلامات التحليل الذاتي، كل منها مع الأولوية، وقراعات FLIRT للكود المكتبي. غر CFGFastوثائق أربعة مصادر من الوظيفة تبدأ: الرموز، مسح مقدمة، استدعاء أهداف، والمسح الكامل للبايتات المتبقية. هذا المصدر الأخير هو حيث أنغر يختلق الوظائف في التدفق.

استعادة CFG

كل أداة تقطع حظر بالطريقة التي فعل الدرس 33، مع فرق واحد سوف تقيس.callلأن IRSB هو مدخل واحد، كتلة خروج متعددة والاتصال هو الخروج.grade_labelفي-O0، الذي يدعوgrade، و"إنجر" تقرير 2 كتلة والثلاثة الأخرى تقرير 1.

رفع

تعرّف النينجا الثنائية رفع "ترجمة من لغة مستوى أقل إلى لغة متوسطة تعتبر أعلى". تختلف IRs في ما هي له. تم بناء P-code و VEX للتحليل و إزالة. تم بناء ESIL و RzIL للتقليد ، ولا يوجد في أي منها مرحلة SSA. يبدأ Hex-Rays ميكرو كود RISC يشبه 72 opcodes و يمر من خلال مستويات النضج من MMAT_GENERATEDإلىMMAT_LVARS. يرفع النينجا الثنائي إلى Lifted IL ، ثم يطوي العلامات إلى ظروف في LLIL ، و "يترجم MLIL السجلات والوصول إلى الذاكرة إلى متغيرات". القسم التالي يضع أربعة من هذه IR جنبا إلى جنب على إمرأة واحدة.

الـ SSA

يصف أطروحة فان إمريك ما يشتريه SSA في جهاز تحرير: انتشار التعبيرات والبرامج وتحديد العودة دون افتراض ABI ، وتحليل الحفاظ على الوصول ، وتحليل النوع كمشكلة ضئيلة في تدفق البيانات ، وتحليل القفزات والمكالمات غير المباشرة. تدعو Ghidra بناء SSA Heritageو يضيف عمليتين موجودتين فقط في الرسم البيانيMULTIEQUALللـ (في) و (INDIRECTالنينجا الثنائية تعرض شكل من أشكال SSA في كل مستوى IL. angr لديها مرحلتين من SSA داخل Clinic. هيكس-رايز لا تسمي شكل SSA وتستخدم تدفق البيانات في مرسومات التحسين العالمية. ليس لدى ESIL و RzIL أي واحدة.

تدفق البيانات وأنواعها

يبدأ حلقة تبسيط الرئيسية لـ Ghidra "إزالة الرمز الميت" و "ترويج الأنواع المحلية" و "إجراء إعادة كتابة المدة" حتى لا يتغير أي شيء، مع إعادة كتابة يتم بواسطة مجموعة من Ruleالـ (هيكس-راي) تحول الرمز الميكرو، واكتشاف حجج الدعوة فيMMAT_CALLS، ويعطي المتغيرات المحلية في MMAT_LVARS. غر رينزCallingConventionAnalysis،VariableRecoveryFastوTypehoon، تنفيذ من نونان، لوجينوف، وكوك النوع البوليمورفية استنتاج. الدروس 41 حول هذه المرحلة.

الإنشاءات

غيدرا CollapseStructureيبحث عن الرسومات الفرعية التي تتطابق مع هيكل، ينهارها إلى عقدة واحدة، وعندما يصبح عالقا يزيل حافة ويجعلها غير مهيكلة.if،while،doوswitchوتترك البقية على أنها مناطق غوتو.SAILRStructurerبطبيعة الحال ، مع PhoenixStructurerوDreamStructurerدرجة 34 كتب من قبل أحد المهنيين

الإصدار

غيدرا تنشر رموز C عبرPrintCمع طباعة اوبن جميلة بعدActionNameVarsوActionSetCasts. هيكس-رايز تجميل وتطبيق الشجرة. نينجا ثنائي تقديم HLIL كـ Pseudo C، Pseudo Rust، أو Pseudo Python. angr يعود codegen.text. بصمات الرادار2pdc،pddأوpdg. . .

تعليم واحد في أربع إطار

خذ48 83 ec 10،subq $0x10, %rsp. فكّرها على الورق مع القواعد من الدروس 33

  1. 48هل REX مع W = 1-الآوبراندي 64 بت
  2. 83هو مجموعة-1 رمز حسابي مع 8 بتات مباشرة. حقل ModRM reg يختار العملية.
  3. ecهو ModRM 11 101 100. .mod = 11هو نموذج السجل. reg = 101هو/5، وهوsub. .r/m = 100هو%rsp. . .
  4. 10هو الفورية، 16.

أربعة رفعيين أعطوا هذه الأربعة بايتات.

ESIL من radare2 6.2.4 هو سلسلة واحدة منفصلة عن العنصر العكسي من 30 رمزا:

text16,0x8000000000000000,-,!,16,rsp,-=,63,$o,^,of,:=,63,$s,sf,:=,$z,zf,:=,$p,pf,:=,64,$b,cf,:=,4,$b,af,:=

إنها آلة تحميل16,rsp,-=يُسحب في مكان كل علم يكتب بعد ذلك مع عامل داخلي: $oالتجاوز$sعلامة$zصفر$pالمساواة$bاقترض

RzIL من rizin 0. 9. 1 هو تعبير S مع 14 setالآثار:

text(seq (set op1 (var rsp)) (set op2 (bv 64 0x10)) (set sub (- (var op1) (var op2))) (set rsp (var sub))
     (set _result (var sub)) (set pf (! (lsb (let _val (cast 8 false (var _result)) ...))))
     (set zf (is_zero (var _result))) (set sf (msb (var _result))) ... (set cf (|| ...)) (set of (|| ...)) (set af (|| ...)))

كل علم هو تعبير بولي على متجهات البيت. علم المساواة وحدها هو أربع مستوياتlet. . .

رمز "ب" من مواصفات "سليغ"x86:LE:64:defaultعبر الرمز النقدي 4.0.1 هو تسعة عمليات بعدIMARK:

textCF = RSP < 0x10
OF = sborrow(RSP, 0x10)
RSP = RSP - 0x10
SF = RSP s< 0x0
ZF = RSP == 0x0
unique[58300:8] = RSP & 0xff
unique[58400:1] = popcount(unique[58300:8])
unique[58500:1] = unique[58400:1] & 0x1
PF = unique[58500:1] == 0x0

سجل التحويلات مع المؤقتين في uniqueيتم حساب العلامات عند التعليمات، بحماس،CFوOFيتم حسابها قبل أن يتم تغطية الحسابRSP. . .

ويكس من pyvex 10. 0. 3 هو سبعة بيانات بعد IMark:

textt2 = GET:I64(offset=48)
t0 = Sub64(t2,0x0000000000000010)
PUT(offset=144) = 0x0000000000000008
PUT(offset=152) = t2
PUT(offset=160) = 0x0000000000000010
PUT(offset=168) = 0x0000000000000000
PUT(offset=48) = t0

لا يظهر أي علم. تسجل أسماء VEX حسب تعويضاتها في دولة الضيوف، وتعويض 48 هو rsp. الرسوم المُسَدَّدة 144 إلى 168 هيcc_op،cc_dep1،cc_dep2وcc_ndep. الرفع يحتفظ برقم العملية 8 ، وهو 64 بتة خصم ، والعملين. فروع لاحقة التي تقرأ العلم يحسبها من العصا. لهذا السببpcode.writesFlagsهو صحيح وvex.computesFlagsهو خاطئ في تقرير الحزام، ولماذا VEX هو أقصر من الأربعة.

نفس أربعة رماة48 63 c7،movslq %edi, %rax، أول تعليمات منgradeفي-O1، أعط 5 رموز ESIL (32,edi,~,rax,=), 1 رزيل set, 1 عمل ب- كود (RAX = sext(EDI)لا يوجد رافعي يكتب راية، لأن التعليمات لا تملكها. قائمة غيدرا الخاصة بتلك التعليمات، التي تم التقاطها من خلال النص بدون رأس، طباعة نفس العملية مثل (register, 0x0, 8) INT_SEXT (register, 0x38, 4): سجل تعويض 0 هو RAX، تعويض0x38هوRDIوالحجم هو 8 و 4 بايت

83 f9 04،cmpl $0x4, %ecx، من المراقبة الحدوديةgrade، يعطي 30 رمزا ESIL، 13 RzIL setالآثار، 10 عمليات رمز P، و 7 بيانات VEX مع cc_op7، الحد من 32 بت، لا شيء يكتب%ecx. عرضان الحد من العد الذي ستقابلونه في VEX 7 ل 32 بت و 8 ل 64 بت ، وترجمة تقوم بناؤها تحمل تلك الجدول.

أربعة قواعد عنوان لمهمة واحدة

قبل أن يتمكن الحزام من مقارنة أي شيء يجب أن يتفق مع نفسه حول مكان الوظيفة.gradeفيledger-x86_64-O1.o. . .

ToolAddress of .textAddress of gradeOffset
llvm-objdump0x00x100x10 - 0x0 = 0x10
radare2, rizin0x080000400x080000500x08000050 - 0x08000040 = 0x10
angr0x4000000x4000100x400010 - 0x400000 = 0x10
Ghidra0x1000000x1000100x100010 - 0x100000 = 0x10

جدول الرمز يقولgradeهو في.text + 0x10كل أداة تتفق بعد إزالة القاعدة.iSjفي الرادار2 والريزن،.textإدخال قسم في التقاط اللوحات، .textحظر الذاكرة في التقاط الغيدرا، و صفر للمسح.test_every_tool_places_grade_at_offset_0x10_from_its_own_baseيصلح هذا الحقيقة

أين تتوافق الأدوات وأين تفرق

الحزام فيcode/main.pyيقرأ الأخذات، يقلل من كل عنوان، ويقارن هذه هي الأرقام التي يبلغ عنها، والاختبارات تؤكد كل منها.

حالة الاتفاق: دفتر التسجيل عند -O1

أربعة وظائف، 56 تعليمات في التصفية، 54 داخل الرموز و 2 في التدليك. كل أداة تقرير نفس التعليمات تبدأ في كل وظيفة: 9، 14، 13، و 18. أربعة صانعي الرسوم البيانية تقرير 3، 3، 5، و 4 كتلة و 2، 3، 5، و 4 حواف، ومجموعات الحافة هي نفسها، زوج للزوج، عبر الرادار، ريزين، Angr، و Ghidra. خمسة كتلة وخمس حواف من totalهذه هي الدرسة 33 رسمها يدوياً

الفرق الوحيد هو في التدليك.66 90بعدgrade،90بعدtotal) يتم فك رموزها من قبل التصفح ، الذي ليس لديه سبب للاستمرار ، و من قبل الغضب ، الذي يخلق sub_40003eوsub_40005fلا يوجد رمز، لا يُدعي الرادار، لا يُدعى الريزين، ولا يُدعى غيدرا أيًا منهم

الحالة المتجهة: دفتر التسجيل عند -O2

totalهو 41 تعليمات في 10 كتب مع 13 حافة، في كل من أربعة مُصنعي الرسوم البيانية. حلقة SSE2 والحلقة المتبقية من الدروس 33 يتم قطعها بنفس الطريقة في كل مكان. angr يضيف مرة أخرى وظائف اثنتين في التدليك.

طاولة القفز: درجة عند -0

هنا أدوات تقسيم، والقسم هو الدرس.

ToolBlocksEdgesWhat the capture says
radare232the block at 0x62 has no successor; bytes 0x76 to 0x9a are never reached; 8 instruction starts missing
rizin811the block at 0x62 carries a switch_op with 5 cases and 4 distinct targets
angr87the case blocks exist, and the transfer at 0x62 goes to an unresolvable target node
Ghidra912switchD label at 0x74 splits the block; four COMPUTED_JUMP flows to 0x76, 0x7f, 0x88, 0x91

كلّ الأربعة قاموا بتفكير نفس التعليمات 33 عندما وصلوا إليهاjmp raxوترك 36 بايت غير مسموح بها، وسمات الحاسوب التي تتراوح بين كود مفقود. ريزين و غيدرا وجدوا الأهداف الأربعة المختلفة التي قرأ الدروس 33 من خمسة عمليات نقل في.rela.rodata. Angr يردد كتلة القضية داخل gradeولا يزال لا يملك حافة من حجر القفز إليهم ؛ تسجل القبض عليه نقل في 0x62حيث يؤدي إلى عقدة هدف لا يمكن حلها ، و طبع مفكّرهاgoto. غيدرا لديها كتلة واحدة وحافة واحدة أكثر من الريزين لنفس تدفق التحكم لأن تحليل المفتاح وضع علامة علىjmp raxوبدأ نموذج الكتل كتل جديد في علامة.

الرسم البياني للدرس-33 كان لديه 8 كتلة و 11 حافة. يطابق rizin تماما. النقطة هي أن نرى أن 9 و 11 و 7 و 2 ليست أربعة قياسات من الرمز وجدت. إنها أربعة إجابات إلى مدى أداة اتبعت قفزة واحدة غير مباشرة وأين اختارت للقطع.

البيانات في الرمز: فخ

lookupهو 24 بايت مع 4 بايت الجدول 31 c0 90 48في0x10. التفاصيل التفاصيل 8 التعليمات تبدأ في هذا النطاق.0x10،0x12و0x13، و بداية مفقودة في0x14هذا هوaddq $0x1, %raxمن الدروس 33 بيع واحد مبكراً. رادار2، ريزين، و غيدرا تقرير 6 يبدأ، 2 كتلة، 1 حافة، و مغادرة 0x10إلى0x14لا يُطالب بها . Angr تقرير نفس 2 كتلة و 1 حافة ل lookupثم يختلقsub_400010على الجدول بايت: 2 تعليمات في كتلة 4 بايت التي تنتهي في 0x14، حيث الكتلة الثانية من lookupيبدأ، لذلك البايت REX في 0x13آخر ما وجدته الحبل لهذا الكائن هو أنه لا يوجد بناء للكرائح0x10إلى0x14، لذلك تلك البايتات تقع داخل وظيفة و هي بيانات.

اختراعى وفق الأدوات

عبر الأجسام الأربعة، يطلق الحزام أسماء 9 وظائف التي يختاره Angr دون رمز، كل واحدة عند الغطاء أو على طاولة الفخ. يطلق على نطاق واحد يفوت الرادار2، 36 بايت حالة من gradeفي-O0. يطلق على 9 نطاقات التي يقوم بها المصفح الخطى بتفكيرها ولا يعامل أي بناء للجراف كرمز: ثمانية فجوات التدفق بالإضافة إلى جدول الفخ.

ثلاثة مُحللين على الصف

ثلاثة من الأدوات التي تم التقاطها تنبعث نصاً تشبه Cgradeفي-O1المصدر هوswitch (score / 10)مع خمسة حالات، تم تجميعها على شكل فحص الحدود وجدول قيم العائد.

غيدرا 12.1.4:

cuint grade(int param_1)
{
  uint uVar1;
  uint uVar2;

  uVar2 = param_1 / 10 - 6;
  uVar1 = -(param_1 >> 0x1f) ^ (uint)((ulong)((long)param_1 * 0x66666667) >> 0x3f);
  if (uVar2 < 5) {
    uVar1 = *(uint *)(&DAT_001000b4 + (ulong)uVar2 * 4);
  }
  return uVar1;
}

Angr 10.0.3:

cextern unsigned int g_4000b4[4];

unsigned int grade(int a0)
{
    unsigned int v1;  // ecx
    unsigned int v2;  // eax

    v1 = (unsigned int)((long long)(a0 * 1717986919) >> 0x22) + (unsigned int)(a0 * 1717986919 >> 63) - 6;
    v2 = 0;
    if (v1 <= 4)
        v2 = g_4000b4[v1];
    return v2;
}

الـ 6.2.4pdc:

cvoid sym.grade (int64_t arg1) {
    rax = edi
    rax = rax * 0x66666667
    rcx = rax
    rcx >>= 0x22
    rax >>>= 0x3f
    ecx += eax
    ecx += 0xfffffffa
    eax = 0
    v = ecx - 4
    if (((unsigned) v) <= 0) {
        eax = ecx
        rcx = rip
        eax = dword [rcx + rax*4]
    }
    return
}

قراءة الثلاثة ضد خط الأنابيب.0x66666667و التحول ب 34 مرة أخرى إلىparam_1 / 10، وهو لغة الدروس 34 . Angr رفع نفس البايت وترك الحسابa0 * 1717986919 >> 0x22. رادار2's pdcهو ESIL emulation plus pseudo syntax: أسماء السجلات، لا متغيرات، لا أنواع، والتحقق الحدود مطبوعة على شكل <= 0بعد خصم غير مؤشر غيدرا كتب تحميل الطاولة من خلالDAT_001000b4; إعلان غر g_4000b4[4]لا غيدرا ولا أنغر استعادت إحصاء الحالات، لأن في-O1لا يوجد مبدّل في البايتات-O0، حيث يوجد طاولة القفز، غيدرا طبعت switch(param_1 / 10)مع الحالات 6 إلى 10 والطريقة الافتراضية، و Angr طبعتgoto. . .

ليس لدى (ريزن) مفكّر خاص به، و سجلات التقاط تلكpdcإنّ HLIL من Ninja ثنائيّة و شجرة الأشعة السبع هي النتائج التي لم تتمكن هذه الدروس من التقاطها

بناءها

أطلق التجربة:

bashcd phases/13-tools-and-protocols/37-the-reverse-engineering-landscape
python3 code/main.py

إنتاج هو تقرير JSON واحد. يفتح مع نسخ الأدوات المسجلة في وقت التقاط وأدوات موجودة على جهازك، والتي قد تكون غائبة. ثم لكل من الأجسام الأربعة يعطي التوسع الرمزي، وفرق التدليك، والقاعدة كل أداة تستخدم، والعمل يبدأ كل أداة وجدت أو اخترع، و لكل وظيفة الاتفاقية التعليمات-بدء، حسابات الكتل، حسابات الحافة، والحافة كل أداة تفتقر. إنه ينتهي بمحاسبة البايت لكل أداة، وملاحظات الأدوات نفسها، وقائمة النتائج في جمل بسيطة، وقطاع IR: إنتاج المترجم للمعليمات الثلاثة بجوار العد القاس على المصاعد التي تم التقاطها.

الشكل المتوقع:

json{
  "captureTools": {"llvm-objdump": "Apple LLVM version 17.0.0", "radare2": "radare2 6.2.4 ...", "rizin": "rizin 0.9.1 ...", "angr": "10.0.3", "ghidra": "12.1.4"},
  "localTools": {"radare2": "absent", "...": "..."},
  "fixtures": {
    "ledger-x86_64-O0.o": {
      "bases": {"llvm-objdump": "0x0", "radare2": "0x8000040", "angr": "0x400000", "ghidra": "0x100000", "...": "..."},
      "functions": {"grade": {"blocks": {"radare2": 3, "rizin": 8, "angr": 8, "ghidra": 9}, "edges": {"radare2": 2, "rizin": 11, "angr": 7, "ghidra": 12}, "...": "..."}},
      "findings": ["radare2 never reaches bytes 0x76-0x9a inside grade that the other graph builders decode", "..."]
    }
  },
  "ir": {"translator": [{"text": "subq $0x10, %rsp", "flags": {"pcodeLike": "eager", "vexLike": "thunk"}, "...": "..."}], "observed": {"...": "..."}}
}

اقرأcode/main.pyفي هذا الترتيب:

  1. read_text_symbols()يقرأ عناوين القسم و STT_FUNCرموز .textالطاولة الرمزية هي الحقيقة الوحيدة التي يمتلكها الحزامTextSection.gaps()يستخرج من ذلك التدليك
  2. parse_objdump()،parse_r2_family()،parse_angr()وparse_ghidra()كل واحد يُحوّل إلى ...ToolView: قاعدة، التعليمات كعكس إلى الطول، و واحد FunctionViewلكل وظيفة مع الكتل، الحواف، وأي نص تم فكيه. كل محلل يعرف مخزون لغات أداة واحدة ولا شيء آخر.
  3. majority()وranges()" أَنَّ المُسَاعِدَين " أي المُسَاعِدين " كلَّ مُقَارَنٍ يُفِيدُهُم .
  4. function_report()يُقارن الإرشادات التي تبدأ مع معظم مُبني الرسوم البيانية، ثم يُعدّ الحدود، ثم يُحدد الحافة، ويرسل ما يفتقر إليه كل أداة.
  5. byte_report()يحسب كل بايت كرمز داخل رمز، ملء، غير المطالبة، المخترع، أو المفقود، وسمي البايت داخل الرموز التي لا يفكرها بناء الرسوم البيانية.
  6. findings()يُحوّل هذه الجمل، وcompare()يجمع تقرير واحد لكل كائن.
  7. decode_small()،to_pcode_like()وto_vex_like()هو مترجم: ثلاثة تشفيرات في شكل سجل، ونمط واحد حريص، ونمط واحد ثنك.
  8. observed_ir()قياس المصاعد التي تم القبض عليها، و figure_data()يجمع جدول الزمني و جدول المرحلة والدليل الذي يظهر الرسم

هناك ثلاثة أوامر أخرىpython3 code/main.py compare FIXTURE.oيطبخ تقرير كائن واحد. python3 code/main.py ir 4883ec10يطبخ المترجم النماذج الثنائية لتعليم واحد. python3 code/main.py figure-dataيطبخ البيانات المضمنة في الرسم.

تم القبض على هذه الأقراص مرة واحدة من قبلcode/fixtures/capture_tools.py، الذي يسجل كل أمر و نسخة فيcaptures.json. لا يبدأ الحزام والاختبارات أداة أبداً. إذا كان لديك الأدوات، قم بتشغيل نص التقاط لتجديد الملفات، وقراءة إضافات README للبيئة التي تحتاجها.

استخدمها

استخدم الحزام على كائن جديد بهذا الترتيب

  1. قم ببناء الكائن بنفسك واحفظ أمر المُحْتَرِق. اقرأ جدول رموزه قبل فتح أي أداة، حتى تعرف كم وظيفة هناك وأين المُغطاة.
  2. التقاط كل أداة مرة واحدة في وضع بدون رأس. تخزين الخروج الخام والإرشاد الدقيق إلى جانب الموضوع. عدم توافق لا يمكنك إعادة قراءته ليس اكتشافا.
  3. تحقق من القاعدة. اختر وظيفة واحدة وتأكد من أن كل أداة يضعها في نفس التوازن بعد أن تقوم باستبعادها .textإذا لم يكن هناك واحد، توقف وتعرف ما أداة تحميل.
  4. تبدأ تعليمات المقارنة أولاً. إذا كان المبدعين على الرسم البياني يختلفون هنا، فإن بقية المقارنة تتعلق بتشخيص وليس بتحليل.
  5. مقارنة الكتل والحواف، وقرأ ملاحظات كل أداة قبل أن تحكم على العد.switch_op، أCOMPUTED_JUMPأو عقدة هدف لا يمكن حل لها تفسر معظم الاختلافات
  6. حساب البايتس. إضافة أن أداة تدعي هوهيرية في العمل. البايتس الرمزية التي ترك أداة هي المشي وقف. البايتس الرمزية التي لا يدعي بناء الرسم البياني هي البيانات.
  7. اكتب أدوات لم تشغلها. وصف من الوثائق مفيد وهو نوع مختلف من الأدلة من التقاط.

المختبر التفاعلي

المختبر (أ): وظيفة واحدة، أربعة قواعد

منcodeالإرشادات، مفتوحة Python:

bashcd phases/13-tools-and-protocols/37-the-reverse-engineering-landscape/code
python3 -q

أركض

pythonfrom main import *
views = load_views("ledger-x86_64-O1.o")
{tool: hex(view.base) for tool, view in views.items()}
{tool: hex(view.functions["grade"].start + view.base) for tool, view in views.items()}

اكتب الأدوات الأربعة الخامة قبل تشغيل الخط الثاني و تحقق منها ضد الجدول في هذه الدروسgradeمعgrade_labelويحسب يدوياً أين يجلس في غيدرا

المختبر ب: طاولة القفز من أربعة جانبي

pythonreport = compare("ledger-x86_64-O0.o")
report["functions"]["grade"]["blocks"]
report["functions"]["grade"]["edgesMissingPerTool"]["radare2"]
report["notes"]["rizin"]
report["notes"]["ghidra"]
report["bytes"]["radare2"]["misses"]

عد الحواف التي تفتقر الرادار2 وتطابق كل واحد من خط من -O0بعد ذلك اقرأ ملاحظة غيدرا و ابحث عنswitchDاللقب في القبض على "غيدرا".

المختبر "ج": العلامات المهتمة ضد قطعة

pythontranslate("48 83 ec 10")["pcodeLike"]
translate("48 83 ec 10")["vexLike"]
translate("83 f9 04")["vexLike"]
{row["name"]: (row["pcode"]["ops"], row["vex"]["statements"]) for row in observed_ir()["instructions"]}

إبحث عنcc_opثابتا في كلتا النتائج وأيضح لماذا واحد هو 8 والآخر 7. ثم حاولtranslate("48 01 c8")و قراءة TranslateError. . .

المختبر D: الفخ تحت خمسة أدوات

pythonreport = compare("sweep-trap.o")
report["functions"]["lookup"]["instructionStarts"]
report["bytes"]["dataInsideSymbols"]
report["functionStarts"]["angr"]

فك رموز البايت 31 c0 90 48 83 c0 01على الورق مثل مسح، ثم مثل الهبوط بعدjmp. تطابق قائمتك مع الإضافات و تبدأ تقارير الضغط المفقودة

مختبر التدريب

أضف قبضة خامسة و تمدد الحزام

المتطلبات:

  • اختر أداة واحدة لم يتم التقاطها في هذا الدروس ويمكنك تشغيلها على جهازك: GNU objdump, LIEF مع Capstone , جلسة Binary Ninja Free المصدرة يدوياً ، أو Ghidra مع مجموعة تحليل مختلفة.captures.json. . .
  • اكتب محلل واحد يحول الاعتقال الىToolViewمع قاعدة الأداة، والإرشادات، والمهام، والبلوكات حيث الأداة لديها، والحواف حيث لديها.
  • إضافة الأداة إلى TOOLSو إذا كان يبني رسمياً،DESCENT_TOOLSأطلقي الظهور وقرأي ما تغير في مجموعات الأغلبية
  • اكتب اختبار يؤكد أن حجر الأداة يعتبرledger-x86_64-O1.oو اختبار يثبت ما تفعله مع طاولة الفخ
  • اكتب فقرة واحدة للدرس التي تقول، بكلمات الأداة نفسها، ما يسميه الشحن، المفكّك، و CFG.

النجاح يعنيpython3 code/main.pyتقرير عن الوسيلة الجديدة في captureTools، كل وظيفة فيledger-x86_64-O1.oيحتفظallDescentToolsAgreeصحيح، والنتائجsweep-trap.oأخبرني ما فعله الأداة الجديدة مع البايتات 0x10إلى0x14. . .

درساً أساسياً

هذا الدروس يتضمنoutputs/skill-the-reverse-engineering-landscape.mdاستخدمها لتشغيل العديد من الأدوات على أحد الأشياء التي قمت ببناءها ، وقلل عناوينها إلى قاعدة واحدة ، وذكر ، لكل وظيفة ، حيث يتفقون على إطلاق التعليمات ، والكتائب ، والحواف ، وما هو البايت كل أداة يخترا أو يفتقد. يتطلب ذلك التقاط مع الأوامر والإصدارات المسجلة ، و جدول رموز يقرأ من الملف ، وإصدار بيان عن الأدوات التي وصفت من الوثائق فقط.

تحقق من ذلك

إشغال التجربة والسلسلة التحديدية:

bashcd phases/13-tools-and-protocols/37-the-reverse-engineering-landscape
python3 code/main.py
python3 -m unittest discover -s code/tests -v

يجب أن تثبت التحقق:

  • قراءة ELF يجد أربعة رموز وظيفة في ledger-x86_64-O1.oمع أحجام 16، 46، 31، و63، وفرق إطارات
  • التوصل إلى الملاحظات 86, 56, 84 و 11 للأشياء الأربعة
  • رادار2 و ريزين تقرير نفس التعليمات، الكتل، والحواف على ledger-x86_64-O1.oو فقط رادار2 لديهpdcالنص
  • علامات الغضبsub_40003eوsub_40005fكـ وظائف بدون رمز
  • حجرات غيدرا للـtotalهي الكتل الخمسة في الدروس 33 وتدفقات الدعوة ليست حواف الرسم البياني
  • كل أداة مكان gradeفي التكافؤ0x10بعد إزالة قاعدته
  • كل أداة تتفق على كل تعليمات تبدأ في كل وظيفة من ledger-x86_64-O1.o
  • يبلغ البنّاء الأربعة من الرسوم البيانية عن 3، 3، 5، 4 كتلة و 2، 3، 5، 4 حواف هناك، مع مجموعات الحواف متطابقة
  • totalفي-O2لديه 10 كتلة و 13 حافة في كل بناء الرسم البياني
  • gradeفي-O0لديه 3، 8، 8، و 9 كتلة و 2، 11، 7، و 12 حافة في الرادار 2، ريزين، أنجر، و غيدرا، مع الأسباب في ملاحظات كل أداة
  • grade_labelفي-O0هو كتلة واحدة في كل مكان باستثناء Angr، والتي تنتهي كتلة في المكالمة
  • إنّ angr يختلق وظيفة واحدة لكل فجوة إدلاء زائد واحدة على طاولة الفخ، ولا يوجد أداة أخرى تختلق وظيفة أو تفوتها
  • المكاسب البيضاء تبدأ0x10،0x12،0x13و يخسر0x14على الفخ، ولا يوجد بناء الرسومات تشكيل0x10إلى0x14
  • النتائج تسمية النطاق المفقود في الرادار2 وكل وظيفة المخترعة في Angr
  • يُسجل المخطط نسخة وأمر لجميع ملفات التقاط 21
  • ثلاثة أدوات تفكيك gradeو فقط غيدرا يضع لغة التقسيم
  • يكتب المترجم CF، OF، SF، ZF، PF بحماس في نمط واحد و cc_opلا يوجد سجل لـcmp، ولا يوجد أي علمmovslq
  • يرفض المترجم نماذج الذاكرة، وبرامج أخرى، وقطع REX إضافية، وطول خاطئة
  • ترجمة المترجم cc_opالأرقام 8 و 7 تساوي تلك التي في VEX المقبوض عليها
  • المرفقات التي تم القبض عليها تعطى 9, 1, 10 عمليات رمز P و 7, 4, 7 بيانات VEX للثلاثة تعليمات
  • يمتد خط التوقيت من عام 1973 إلى عام 2026 بالتسلسل، ويتكون خط الأنابيب من ثمانية مراحل وست أدوات مع مصطلح في كل خلية، ويتم وضع علامة على الأدوات المغلقة كغير تعمل
  • الرقم التفاعلي يضم نفس البيانات التي تنتجها الحزام

أساليب فشل الإنتاج

FailureWhat the weak report saysWhat the harness must prove
Raw addresses from different tools"the tools disagree about where grade is"one offset after each base is removed, checked on one function
Block count as a measure of code found"Ghidra found the most code"the same instruction starts, with the extra block explained by a label
One tool as the oracle"objdump shows the table bytes are instructions"the sweep is a linear sweep; three graph builders leave the bytes unclaimed
Padding functions counted as discoveries"angr found seven more functions"every one sits in a padding gap or on data, and none has a symbol
A stopped walk reported as dead code"the four case blocks are unreachable"36 bytes missed by one tool and reached by three
Edge counts compared without the notes"rizin and Ghidra disagree on grade"the same four computed targets, one extra split at a label
A decompiler's arithmetic read as the program"the function multiplies by 1717986919"the idiom from lesson 34, folded by one tool and left by another
A closed tool described as if run"Binary Ninja reports five blocks"the figure and the table mark it as documentation only
Captures without commands"we ran radare2"the manifest with version, command, and date for every file
An IR with no flags read as a lossy lift"VEX dropped the flags"the thunk in cc_op, cc_dep1, cc_dep2, evaluated at the branch

قاعدة العمليات

التقاط كل أداة مرة واحدة مع إرادتها ونسخها، تقليل كل عنوان إلى قاعدة واحدة، ومقارنة التعليمات تبدأ قبل الكتل والكتل قبل الحواف. حساب لكل بايت كما ادعى، التدفق، البيانات، أو المفقود. قراءة ملاحظة أداة الخاصة قبل أن تحكم على عددها، وقول أدوات كنت فقط تقرأ عن.

المزيد من القراءة

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.