أداة gdb (GNU Debugger)

أداة gdb هي المصحح القياسي والأقوى (Standard Debugger) في أنظمة Linux/Unix. إذا كانت الأدوات السابقة مثل strace و ltrace تسمح لك بمراقبة البرنامج من الخارج فقط عبر تتبع النداءات، فإن gdb يمنحك سلطة مطلقة للتحكم في البرنامج من الداخل.

باستخدام gdb يمكنك إيقاف البرنامج عند أي سطر كود أو تعليمة تجميع (Assembly Instruction)، فحص محتويات الذاكرة العشوائية (RAM)، قراءة وتعديل قيم مسجلات المعالج (CPU Registers)، بل وتغيير مسار تنفيذ البرنامج بالكامل أثناء تشغيله لحقن ثغرة أو تخطي نظام حماية. هذه العملية تسمى Dynamic Debugging (التصحيح الديناميكي المتقدم).

كيف تعمل الأداة تحت الغطاء؟

مثل أدوات التتبع الديناميكي، يعتمد gdb بشكل مكثف على نداء النظام ptrace. ولكن آلية إيقاف البرنامج عنده ذكية جداً:

عندما تطلب من gdb وضع نقطة توقف (Breakpoint) عند عنوان معين في الذاكرة، فإنه يقوم سرياً باستبدال البايت الأصلي لكود الآلة عند ذلك العنوان ببايت خاص يسمى Breakpoint Instruction (في معالجات x86/x64 يكون هذا البايت هو 0xCC المقابل لأمر التوقف INT 3).

عندما يصل المعالج (CPU) أثناء تنفيذ البرنامج إلى هذا البايت 0xCC، فإنه يطلق استثناءً (Exception) وينقل التحكم فوراً إلى gdb الذي يعيد البايت الأصلي مؤقتاً ليعرض لك حالة البرنامج، وينتظر منك الأمر التالي.

الأوامر الأساسية للتحكم والفحص (Essential Commands)

لأننا التزمنا بعدم استخدام الجداول، سأعرض لك أهم أوامر gdb مقسمة حسب الوظيفة كقائمة منسقة ومباشرة:

أمثلة عملية في استغلال الثغرات (Exploitation Context)

عندما تحاول استغلال ثغرة في الذاكرة مثل Buffer Overflow، فإنك تستخدم gdb لـ:

  1. معرفة الإزاحة الدقيقة (Offset): لتحديد عدد الأحرف التي تحتاج لحقنها لتصل إلى مسجل مؤشر التعليمات RIP (أو EIP في أنظمة 32-bit). تقوم بحقن نمط فريد (Unique Pattern) ثم تفحص قيمة المسجل عبر p $rip لتحديد مكان السقوط والانهيار.
  2. فحص الـ Stack: للتأكد من أن الـ Shellcode الخاص بك قد تم كتابته في الذاكرة بشكل صحيح وبدون تشوهات عبر استخدام أمر الفحص x/100gx $rsp.