أداة objdump (اختصار لـ Object Dump) هي أداة سطر أوامر متقدمة وعميقة جداً تأتي بشكل افتراضي ضمن حزمة أدوات GNU Binutils في أنظمة Linux. إذا كانت أداة hexdump تعرض لك البيانات كبايتات خام، فإن objdump تذهب لخطوة أبعد بكثير: إنها تفهم بنية الملفات التنفيذية وتستطيع تحويل كود الآلة السداسي عشر (Machine Code) إلى لغة التجميع (Assembly Language) المقروءة للبشر. هذه العملية تسمى Disassembly (تفكيك الكود).
في عالم الهندسة العكسية واختبار اختراق البرمجيات (Binary Exploitation/Pwn)، تعتبر objdump هي النظارة التي ترى بها كيف يفكر المعالج (CPU) وكيف سيقوم بتنفيذ البرنامج سطرًا بسطر.
objdump):
يأخذ ملف الـ Binary المكتوب بلغة الآلة (0101 أو الـ Hex) ويحوله إلى لغة التجميع (Assembly). هذا فك للترميز دقيق جداً وقريب من تفكير المعالج.Ghidra):
يحاول تخمين كيف كان الكود الأصلي بلغة عالية المستوى مثل C أو C++. وهو أكثر راحة للعين ولكنه قد لا يكون دقيقاً بنسبة 100% مثل لغة التجميع.عندما تطلب من objdump تفكيك دالة معينة (مثل دالة main) داخل ملف تنفيذي، ستعطيك مخرجات تبدو كالتالي:
0000000000001149 <main>:
1149: 55 push rbp
114a: 48 89 e5 mov rbp,rsp
114d: 48 8d 3d b0 0e 00 00 lea rdi,[rip+0xeb0]
1154: e8 d7 f0 ff ff call 1030 <puts@plt>
لنفهم هذا الجزء بالتفصيل الممل:
<main>: هذا هو اسم الدالة أو الرمز (Symbol) الذي يتم تفكيكه حالياً، والرقم الذي قبله 1149 هو عنوان بداية هذه الدالة في الذاكرة.1149:, 114a:): يمثل عنوان الذاكرة (Memory Address) أو الإزاحة لكل تعليمة برمجية.55, 48 89 e5): يسمى الـ Opcode أو كود العملية. هذا هو كود الآلة الحقيقي الذي يفهمه المعالج. فمثلاً، المعالج عندما يرى البايت 55 يعرف تلقائياً أن المطلوب هو تنفيذ أمر push rbp.push rbp, mov rbp,rsp): هذه هي تعليمة لغة التجميع (Assembly Instruction) المقابلة للـ Opcode. وهي ما نقرأه نحن كمهندسين عكسيين لنفهم ماذا يفعل البرنامج (مثلاً: نقل بيانات، استدعاء دالة، مقارنة قيم).تمتلك objdump خيارات كثيرة جداً لاستخراج تفاصيل دقيقة من ملف الـ Object File:
objdump -d <file> (Disassemble):
هذا هو الخيار الأشهر، ويقوم بتفكيك الأقسام التنفيذية داخل الملف فقط (الأجزاء التي تحتوي على كود برمي قابل للتنفيذ مثل قسم .text).
objdump -M intel -d <file> (Syntax Selection):
بشكل افتراضي، يعرض Linux لغة التجميع بتنسيق يسمى AT&T Syntax (وهو تنسيق يضع علامات % و $ قبل المسجلات والقيم، ويكون اتجاه نقل البيانات فيه من اليسار إلى اليمين). معظم خبراء الحماية يفضلون تنسيق Intel Syntax لأنه أسهل في القراءة وأكثر شيوعاً. هذا الخيار يجبر الأداة على العرض بتنسيق إنتل.
objdump -h <file> (Section Headers):
الملف التنفيذي مقسم إلى أجزاء تسمى Sections (مثل قسم الأكواد .text، قسم المتغيرات العامة .data، وقسم النصوص الثابتة .rodata). هذا الأمر يعرض لك خريطة بهذه الأقسام، أحجامها، وأماكنها في الذاكرة.
objdump -t <file> (Symbol Table):
يعرض جدول الرموز. هذا الجدول يحتوي على أسماء الدوال والمتغيرات العالمية وعناوينها (مثل أين تقع دالة login أو دالة check_password).