arrow_backالعودة إلى ملاحظات المجال
WEB SECURITY منشور 9 Aug 2026

ما هو تجاوز المخزن المؤقت؟ شرح عملي خطوة بخطوة

تعلم كيفية عمل تجاوزات المخزن المؤقت بشكل فعلي من خلال مثال C حقيقي، ورسم تخطيطي للمكدس، والأدوات لرؤيته بنفسك.

يحدث تجاوز المخزن المؤقت عندما يكتب برنامج بيانات أكثر مما يمكن لجزء ذاكرة بحجم ثابت أن يحتويه. البايتات الإضافية تتسرب إلى الذاكرة المجاورة، وبناءً على ما يجاور ذلك المخزن المؤقت، يمكنك إفساد المتغيرات أو تعطيل البرنامج أو السيطرة على تدفق التنفيذ بالكامل. إنها واحدة من أقدم فئات الأخطاء في أمان البرامج وتظهر حتى الآن في CTFs و CVEs والبرامج الثابتة المضمنة.

النمط الضعيف

إليك مثال كلاسيكي في C:

#include <string.h>

void greet(char *name) {
    char buffer[64];
    strcpy(buffer, name);
}

int main(int argc, char **argv) {
    greet(argv[1]);
    return 0;
}

strcpy ينسخ أي سلسلة نصية تمررها إلى buffer، بدون فحص الحدود. إذا كان argv[1] أطول من 64 بايت، ستستمر النسخة بعد نهاية المصفوفة. على المكدس، buffer يقع أسفل المتغيرات المحلية الأخرى والسجلات المحفوظة وفي النهاية عنوان الإرجاع الذي يخبر المعالج أين يقفز بعد انتهاء greet(). اكتب فوق عنوان الإرجاع بعنوان تتحكم به، وأنت تتحكم بما يعمل بعده.

لماذا يتم ترجمة هذا وتشغيله حتى الآن

C و C++ لا تجريان فحص حدود تلقائي على المصفوفات الخام. الدوال مثل strcpy و gets و sprintf و strcat ستكتب بسعادة بعد نهاية المخزن المؤقت لأنها تهتم فقط بفاصل فارغ أو طول المصدر، وليس الحجم الفعلي للوجهة. قارن ذلك مع strncpy أو snprintf، التي تأخذ معاملة حجم صريحة وتتوقفان هناك. الضعف ليس فعلاً

تمت كتابة هذا المقال بمساعدة الذكاء الاصطناعي، وراجعه ونشره Michal Pilch (CISSP)، Korra Studio.

هل أنت مستعد للمضي قدماً؟

هذه ملاحظة واحدة من قاعدة معارف Korra Studio — المنصة تجمع كل موضوع مع التوجيه الفردي.

ابدأ بالمجانarrow_forward