بنية الذاكرة الإفتراضية و حماية ASLR

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





كود high.c
    #include<stdio.h>
    #include<stdlib.h>
     
    int mulp(int a , int b)
    {
            int c;
     
            c = a * b;
     
            return c;
    }
     
     
    main(int argc, char **argv)
     
    {
     
            int x = 0, y = 0,  z = 0;
     
            printf("Enter the first number : ");
            scanf("%d", &x);
     
            printf("Enter the second number : ");
            scanf("%d", &y);
     
            z = mulp(x,y);
     
            printf("%d*%d = %d\n",x, y, z);
     
           
            exit(0);
     
    }
     
     
     
    #include<stdio.h>
    #include<stdlib.h>

    int mulp(int a , int b)
    {
            int c;
     
            c = a * b;

            return c;
    }


    main(int argc, char **argv)

    {

            int x = 0, y = 0,  z = 0;

            printf("Enter the first number : ");
            scanf("%d", &x);

            printf("Enter the second number : ");
            scanf("%d", &y);

            z = mulp(x,y);

            printf("%d*%d = %d\n",x, y, z);

          
            exit(0);

    }

://pastebin.com/LW3
بنية الذاكرة الإفتراضية


*) كل عملية (process) تحمل في نفس المكان للذاكرة الإفتراضية بغض النظر عن الموقع الحقيقي للذاكرة الفعلية


*)كل عملية process تشعر وكأنها هي العملية الوحيدة في النظام ، وتتمتع بكامل الذاكرة وكأنه لايوجد عمليات أخرى

*)النظام ووحدة المعالج المركزية يشتركان مع بعضهما في الحفاظ على هذه الفكرة








تذكروا دائما أن هذه هي الذاكرة الإفتراضية (virtual memory ) وليست الذاكرة المادية (physical memory)

كل برنامج يشتغل وكأنه هو البرنامج الوحيد الذي يشتغل في الجهاز وهذا مايفسر لمذا يظهر لنا أن البرنامج يحجز كل الأماكن العلوية والسفلية في الذاكرة وهذا لأن نظام التشغيل لخص لنا طبقة الذاكرة وحذف كل ماهو غير واضح بالنسبة لنا يعني نريد رؤية برنامج في الذاكرة فنراه إلا هو كأنه هو الوحيد فيها .





ASLR
نفتح ترمينال ونشغل السكريبت ثم نتركه هكذا :



تركنا البرنامج هكذا ليبقى في طور التشغيل ونقدر نشوف كيف حيكون شكلو في الذاكرة الإفتراضية .
ثم نفتح ترمينال جديد ونذهب لهذا المسار وتأكد أنك بصلاحية روت .



ثم نفتح الملف maps






نلاحظ أن هذا العنوان 08048000 يمثل أسفل الذاكرة وكنت قد ذكرته في الصورة الأولى تبع الشرح .
أيضا لاحظ أن إنطلاقا من هذا العنوان تزداد قيمة عناوين الذاكرة يعني هو أسفل الذاكرة .

ملاحظة : لا تستوعب الأمور إعتمادا على الأعلى والأسفل تبع الصورة ولكن إستوعبها إعتمادا على الأعلى والأسفل تبع الذاكرة

يعني عندما تشوف صورة توضيحية تبع مكدس أو تبع عناوين الذاكرة دائما ثبت ماهو أسفل الذاكرة وماهو أعلى الذاكرة

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




الآن نقوم بإيقاف البرنامج ونشغله مرة أخرى ونتبع نفس الخطوات السابقة إلى أن نعرض شكله في الذاكرة :




مقارنة بالصورة السابقة

نلاحظ في الأول أن عنوان أسفل الذاكرة بقي كما هو ولكن بقية العناوين كلها تغيرت حتى عنوان المكدس أيضا تغير .

فلمذا تغيرت ؟ مالذي حصل بالظبط؟


نفتح ترمينال جديد ونذهب على هذا المسار كما في الصورة التالية ونعرض الملف randomize_va_space ونغير قيمته إلى 0



الآن نوقف البرنامج ونشغله ثم نذهب لعرض شكله في لذاكرة كما في الصورة التالية :






الآن نوقفه مرة أخرى ونعيد عرض شكله في الذاكرة كما في الصورة التالية :




نلاحظ أن عناوين المقاطع في الذاكرة بقيت كما هي ولم تتغير وهذا بعدما أوقفنا عملية التوزيع العشوائي لمقاطع الذاكرة الإفتراضية أو (ASLR) وهي حماية للنظام من الهجمات المتعلقة بعناوين هذه المقاطع مثل هجمات البافر أوفر فلو
وجعل هذه الهجامات صعبة التحقق.

وهذا مايفسر لمذا بعض أكواد الثغرات تفشل معنا وذلك لأن العناوين متغيرة من نظام إلى نظام فيجب إيقاف هذا التوزيع العشوائي وتعديل كود الثغرة بالعناوين المناسبة .


وهذا مامعنى كل عملية تحمل في نفس المكان للذاكرة الإفتراضية بغض النظر عن الموقع الحقيقي للذاكرة الفعلية

المشاركات الشائعة من هذه المدونة

بحث مرتقب بخصوص علم البيانات الضخمة Big Data وتحليلها - تدوينة للإعداد

توضيحات بخصوص اساليب التخفي - The Onion Router

أسئلة شائعة حول إضافة Mailvelope والإجابة عليها