Buffer Overflow Part 1

السلام عليكم ورحمة الله وبركاته

هذه المقالة، والمقالات القادمة -بمشيئة الله- سلسلة بسيطة حول ثغرات الـ Buffer Overflow

ليس في ذهني حقيقة عدد مُعيّن لمقالات هذه السلسلة

لكن أنوي في هذه السلسلة تلخيص وربط أهم الأفكار حول هذا الموضوع من كُتب متفرّقة

تحديدًا، هذه ستكون قائمة القراءة في هذه السلسلة :

البدايات كالعادة ستكون تَمهيد، وتركيزنا الأكبر سيكون على الجانب النظري وفهم هذه الثغرة، بعد بناء الأساس اللازم ، سننتقل للجانب العملي

لنبدأ بسم الله ،

ما هو الـ Buffer ؟

لأن هذه الثغرة مُتعلّقة بالـ Buffer ، لنعرف بدايةً ماهو الـ Buffer ؟

في كتاب The Shellcoder’s Handbook نجد التعريف الآتي للـ Buffer

A buffer is defined as a limited, contiguously allocated set of memory. The most common buffer in C is an array.

إذًا ، فالـ Buffer مساحة أو حيّز من الذاكرة يستخدمها البرنامج لأغراض تخزين المتغيّرات وأغراض أخرى ، ما يُميّز هذه المساحة ( أو مجموعة العناوين - addresses ) نقطتين :

العناوين متتالية : أي في حال بدأنا التخزين من العنوان X ، عملية التخزين الثانية ستكون في العنوان التالي للعنوان X

هذه المساحة محدودة ومعروفة الحجم : أي أن الـ Buffer له سِعة إستيعاب وتخزين محدودة

أحد أبسط الأمثلة على الـ Buffer هو الـ Array

مثال : القراءة خارج نطاق الـ Buffer

لنأخذ المثال الآتي لاستيعاب مفهوم الـ Buffer من زاوية الـ Array ( المثال من نفس الكتاب )

1 #include <stdio.h>
2 #include <string.h>
3 
4 int main () {
5     int array[5] = {1, 2, 3, 4, 5};
6     printf("%d\n", array[5]);
7 }

الكود جدًا بسيط ، قُمنا بتعريف Array سِعتها تخزين خمس عناصر ، وقمنا بملئ هذه المساحة بالعناصر : 1 , 2 , 3 , 4 , 5

حتى الآن البرنامج صحيح ، فالـ Array التي قمنا بتعريفها تَتّسع لتخزين خمس عناصر

وفي السطر رقم 6 قمنا بطباعة العنصر رقم 5 في هذه الـ Array ، هنا بالطبع يوجد خطأ ، فكما نعرف الـ index في الـ Array يبدأ من صفر

لكن لو قمنا بعمل Compile للكود أعلاه ، لن يقوم الـ Compiler بطباعة أي خطأ

1

طيب ، ماذا لو قمنا بتنفيذ هذا البرنامج ؟

ماذا سيحصل ؟ فنحن هنا نحاول الوصول للعنصر array[5] ، وهذا العنصر خارج نطاق مساحة التخزين هذه ( الـ Array في مثالنا ) ، أي كأننا نحاول الوصول للعنصر السادس في الـ Array وفي مثالنا الـ Array لا تحمل إلّا خمس عناصر

لو قمنا بتنفيذ البرنامج سنرى الآتي :

1

لاحظ أن البرنامج تم تنفيذه بدون مشاكل كذلك ، وتم طباعة القيمة 134513712

هذه القيمة هي القيمة المُخزّنة في العنوان الذي حاولنا الوصول له array[5]

لو عدنا لتعريف الـ Array سنجد أن آخر العناصر في هذه الـ Array يجب أن يكون العنصر array[4] ومابعده ليس ضمن هذه الـ Array

لكن في مثالنا هذا استطعنا قراءة القيمة في العنوان التالي للعنوان الأخير في الـ Array

وهذا المثال والكود يوضّح كيف يمكننا الخروج عن نطاق هذه المساحة والوصول لعناوين أخرى ليست ضمن مساحة الـ Buffer أو الـ Array في مثالنا هذا

هذه المشكلة بالطبع تحصل في لغة C لأن اللغة لا تُجري ما يُعرف بالـ bounds-checking  

أيضًا في المثال السابق رأينا أنه يمكننا القراءة خارج نطاق الـ Buffer

في مقالات لاحقة إن شاء الله سنحاول استعراض إجراء عملية الكتابة خارج نطاق الـ Buffer

وإلى هنا نكتفي

ℹ️ [ملاحظة] هذه المقالة تمّت كتابتها خلال دراسة هذه المواضيع، فكل ما تم ذكره هنا قد يحتمل الخطأ، لكن بالإمكان العودة إلى المراجع التي إستندت عليها هذه المقالة