TO DONATE : BTC => 1D8Aq4q2jQnvGD1GaK9vbNwKgm1K5zUEWL || PM => U4089661


اهم قوانين :1- منع الردود الباهتة مثل شكرااااا و أخواتها 2- لا يسمح بالمشاحنات الطائفية باآ شكل من الأشكال 3- عدم استعمال الألفاظ التافهة و الكلام البذىء 4- عدم وضع معرفات التواصل الأجتماعى بالردود 5- الأطلاع على كامل القوانين واجب 


العودة   الحماية للأبد -Security 4 Ever > قسم البرمجـــة > أساسيات لغة الأسمبلي

أساسيات لغة الأسمبلي يهتم بلغة الآلة (التجميع) Assembly و طرق بناء بعض أجزاء التطبيقات من خلالها

 
أدوات الموضوع انواع عرض الموضوع
  #1  
قديم 25-06-2019, 12:58 AM
الصورة الرمزية zero-cool
zero-cool
:: عضو خاص ::
 
حـالة التــواجـد : zero-cool غير متواجد حالياً
تاريخ التسجيل: Apr 2016
الجــــنــــــس: ذكـر
المشاركات: 74
شكراً:55
تم شكره 256 مرة في 59 مشاركة
معدل تقييم المستوى: 0
zero-cool بدون تقييم
افتراضي إدارة الذاكرة

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

إن شاء الله تكونوا في تمام الصحة والعافية إخواني





اليوم ، سأحاول جمع كل ما يمكن أن أفهمه حول إدارة الذاكرة أثناء تنفيذ البرنامج.
تتم كتابة هذه المقالة لفهم استغلال بعض عيوب التطبيق ،
مثل buffer overflow أو heap overflow أو format string

تحتاج ال process التي يتم تشغيلها على جهاز ما إلى ذاكرة ،
كما أن كمية الذاكرة محدودة في جهاز الكمبيوتر.
لذلك يجب أن تبحث ال process عن الذاكرة المتاحة لتكون قادرة على العمل.
ومع ذلك ، فإن ال process تتحول الآن إلى أنظمة تشغيل متعددة المهام.
تشتغل العديد من ال processes في نفس الوقت.
ماذا سيحدث إذا أرادت اثنين processes الوصول ، في نفس الوقت ، إلى نفس المنطقة من الذاكرة؟
والأهم من ذلك ، إذا كانت هناك process تحجذ إحدى مناطق الذاكرة ،
ثم process أخرى تحل محل منطقة الذاكرة نفسها ببياناتها الخاصة ، فستفكر ال process A ، في استرجاع بياناتها ، لكنها ستعثر بالفعل على البيانات من B.
سيكون من الضروري أن تتواصل ال processes باستمرار مع بعضها البعض لمعرفة من يفعل ماذا وأين ومتى.
سيكون مضيعة حقيقية للوقت وتعقيد كبير لهذه المشكلة.

هنا يأتي دور الذاكرة الإفتراضية (virtual memory)
لن تسحب ال processes مباشرة إلى الذاكرة الفيزيائية (physical memory)
يتم وضعها في صناديق ، وتخصص لهم مجموعة من الذاكرة الإفتراضية (4 جيجابايت للأجهزة ذات 32 بت) ،
مما يجعلهم يعتقدون أنهم الوحيدون الذين يعملون على الجهاز.
عندها تتدخل ال MMU (وحدة إدارة الذاكرة ، قطعة من الأجهزة مدمجة في الوقت الحاضر في المعالج) ،
وتعمل على الربط بين النطاقات المختلفة للذاكرة الافتراضية والذاكرة الحقيقية.

ال process لم تعد تقلق بشأن ال implementation تبع الذاكرة.

تتم معالجة جميع ال processes ذات المستوى المنخفض بواسطة ال MMU.
إنها نوع من طبقة التجريد التي تبسط حياة ال process.

كل process لها جدول الصفحات الخاص بها.
ومع ذلك ، إذا تم تمكين العنونة الافتراضية ،
فإنه ينطبق على جميع البرامج التي تعمل على الجهاز ، بما في ذلك النواة.
وبالتالي ، يجب حجز جزء من المساحة الافتراضية لكل برنامج للنواة !

تجزئة الذاكرة

هنا سنرى كيف هي ذاكرة البرنامج بعد عملية الكومبايل عندما يتم تحميله في الذاكرة لإنشاء process
نعثر على الأقسام الثلاثة التالية (من بين الأقسام الأخرى ، لكنها المهمة أكثر ):

text.
data.
bss.

ومناطق الذاكرة التالية:

stack
heap

قسم ال (.text) هو القسم الذي يحتوي على كود البرنامج ،
وبشكل أكثر دقة التعليمات في لغة الآلة.
إفتراضيا هذا الجزء له صلاحية قرائة فقط أي Read Only أو RO
يصلح فقط لتخزين الكود وليس المتغيرات.
يمكن أن تؤدي أخطاء البرمجة إلى هذا الخطأ الشهير "Segmentation Fault"
والتي يمكن أن تشير إلى أن المستخدم حاول كتابة غير مصرح بها في منطقة الذاكرة المحمية ضد الكتابة.
بسبب ثباتها ، إنها مساحة ذاكرة ذات حجم ثابت.
سيبدأ البرنامج في بداية هذا الجزء ، ثم يقرأ التعليمات واحدة تلو الأخرى.




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

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

كود PHP:
#include <stdio.h>
 
int main(void) {
    return 
0;



كود PHP:
root@kali:~# gcc code.c -o code
root@kali:~# size code
   
text       data        bss        dec        hex    filename
   1368        292          4       1664        680    code 
الآن ، دعونا نضيف متغيرا عام غير مهيأ ونشوف أحجام الأقسام المختلفة مرة أخرى:

كود PHP:
#include <stdio.h>
 
int global;
 
int main(void) {
    return 
0;

كود PHP:
root@kali:~# gcc code.c -o code
root@kali:~# size code
   
text       data        bss        dec        hex    filename
   1368        292          8       1668        684    code 
نلاحظ أن قسم bss قد زاد بمقدار 4 بايت لتخزين المتغير الثابت غير المهيأ.
إذا قمنا بنفس الطريقة بإضافة متغير ثابت داخل الوظيفة ال main ()

كود PHP:
#include <stdio.h>
 
int global;
 
int main(void) {
    static 
int var;
    return 
0
كود PHP:
root@kali:~# gcc code.c -o code
root@kali:~# size code
   
text       data        bss        dec        hex    filename
   1368        292         12       1672        688    code 
مرة أخرى ، لاحظنا أن bss قد زاد بمقدار 4 بايت لتخزين هذا المتغير.

إذا قمنا لآن بتهيئة المتغير var

كود PHP:
#include <stdio.h>
 
int global;
 
int main(void) {
    static 
int var = 5;
    return 
0;

كود PHP:
root@kali:~# gcc code.c -o code
root@kali:~# size code
   
text       data        bss        dec        hex    filename
   1368        296          8       1672        688    code 
هذه المرة ، لم يعد المتغير مخزّنا في قسم bss ، ولكن في قسم data،
حيث نلاحظ أنه انتقل من 292 إلى 296 بينما انخفض قسم bss بمقدار 4 بايت

أخيرا ، إذا قمنا أيضا بتهيئة المتغير العام

كود PHP:
#include <stdio.h>
 
int global = 100;
 
int main(void) {
    static 
int var = 5;
    return 
0;

كود PHP:
root@kali:~# gcc code.c -o code
root@kali:~# size code
   
text       data        bss        dec        hex    filename
   1368        300          4       1672        688    code 
يتم تخزين كلا المتغيرين في قسم data. ، وليس في قسم bss.

ال (heap) ، يمكن التحكم فيها بواسطة المبرمج.
هذه هي المنطقة التي تتم فيها كتابة مناطق الذاكرة المخصصة ديناميكيا (malloc () أو calloc ())
مثل المكدس ، لا تحتوي مساحة الذاكرة هذه على حجم ثابت.
تزيد وتنقص وفقًا لمتطلبات المبرمج ، الذي يمكنه حجز أو حذف الكتل عبر خوارزميات التخصيص أو الإصدار للاستخدام في المستقبل.
كلما زاد حجم ال heap ، تزداد عناوين الذاكرة ، وتقترب عناوين الذاكرة الخاصة بالمكدس.
حجم المتغيرات في ال heap غير محدود (باستثناء الحد الفعلي للذاكرة) ، على عكس المكدس.
بالإضافة إلى ذلك ، يمكن الوصول إلى المتغيرات المخزنة في ال heap في البرنامج عبر ال pointers.
ومع ذلك ، فإن الوصول إلى المتغيرات المخزنة في ال heap يتم فقط باستخدام pointers ،
فإنه يؤدي إلى إبطاء عمليات الوصول هذه قليلا ، على عكس الوصول في المكدس .

المكدس يحتوي أيضا على حجم متغير ، ولكن كلما كان الحجم أكبر ، كلما انخفضت عناوين الذاكرة ، مع الاقتراب من الجزء العلوي من ال heap
هذا هو المكان الذي نجد فيه المتغيرات المحلية للوظائف بالإضافة إلى إطار مكدس (stack frame) هذه الوظائف.
ال stack frame تبع وظيفة هو منطقة في الذاكرة ، في المكدس ،
حيث يتم تخزين جميع المعلومات اللازمة لاستدعاء هذه الوظيفة بحيث يحتوي أيضا على المتغيرات المحلية تبع الوظيفة.

آمل أن يكون لديك فكرة أوضح عن تجزئة الذاكرة عند تشغيل البرنامج.



بالتوفيق لكم
 

 

 

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

[email protected]
رد مع اقتباس
5 أعضاء قالوا شكراً لـ zero-cool على المشاركة المفيدة:

الكلمات الدلالية (Tags)
الذاكرة, إدارة


الذين يشاهدون محتوى الموضوع الآن : 1 ( الأعضاء 0 والزوار 1)
 
أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع

المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
بنية الذاكرة الإفتراضية & حماية aslr zero-cool أساسيات لغة الأسمبلي 0 09-06-2019 06:05 AM
[نقــاش] طرق تحسين الذكاء و الذاكرة LinuX_Dz القسم العام 12 19-06-2016 01:11 AM


الساعة الآن 12:10 AM