محمد حسن پزشکیان
عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

معرفی مفاهیم مدیریت حافظه یا Handling Memory Address

معرفی مفاهیم مدیریت حافظه یا Handling Memory Address

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

Handling Memory Address یا مدیریت آدرس های حافظه چیست ؟

(شکل1) ما یه حافظه رم داریم که بسیار بزرگه (برفرض4 گیگ) و این حافظه تشکیل شده از بایت هایی که هر 4 بایت میتونه 4 میلیارد رقم تو خودش ذخیره کنه ، ولی یه مشکلی هست ، (شکل2) ما میخوایم یه متغیر x رو در حافظه ذخیره کنیم با مقدار 5 ، این متغیر 1 بایت حجم میگیره ، حالا فرض کنید ما بخوایم به این مقدار دسترسی داشته باشیم باید آدرسشو داشته باشیم ، آدرس متغیر x خودش 4 بایته ، حالا سوالی که پیش میاد اینه که من مقدار عدد 5 رو در حافظه ذخیره کردم که یک بایته ولی واسه دسترسی بهش باید یه آدرس 4 بایتی رو هم ذخیره کنم ، اگر بیاییم و این 4 بایت رو در یه متغیر جدا ذخیره کنیم چی (پوینتر) ، خب آدرس متغیر x ذخیره شد داخل یه متغیر به نام y ولی مشکل اینجاست که دوباره y خودش یه آدرس داره که اونم 4 بایته 😬😅، بازم باید پوینتر جدید ایجاد کنیم ؟ یا توی ریجستر ذخیرش کنیم ؟ مشکل اینه که هردفعه که ما میاییم یه متغیر داخل حافظه بریزیم یه مقدار میده که باید داشته باشیمش و اگر این مقدارو دوباره ذخیره کنیم یه مقدار دیگه میده و .. ما چهار تا روش داریم برای این مشکل :


1. بیاییم و آدرس متغییر هارو داخل ریجستر ها بریزیم (عکس3) ، برای متغییر هایی با حجم کوچیک یکم بدرد نخور میشه ولی برا متغییر هایی با حجم بالا مثل String (متن) یا عکس ، فیلم و.. خیلی کاربردیه ، مثلا همون رشته ای که نوشتم حدود 11 بایت میشه و یه آدرس 4 بایتی به این اشاره داره ، حالا ما آدرس اون رشته رو توی ریجستر eax میریزیم و وقتی خواستیم بهش دسترسی پیدا میکنیم

(نکته : رشته های همیشه توسط بایت پوچ یا Null Byte خاتمه پیدا میکنن و روش فهمیدن ته استرینگ همون بایت پوچ هست که با صفر نمایش داده میشه "0," "0x00" "\0" و...)

حجم حروف :

توی دنیای کامپیوتر همه چی عدده ، اگر ما بخوایم یه حرف رو به فرض مثال نمایش بدیم میاییم و اونو در مبنای عدد (16 نمایش میدیم ، مثلا من در اینجا Character map رو باز میکنم تا متوجه بشید)

معرفی مفاهیم مدیریت حافظه یا Handling Memory Address

و میرم یه حرفی رو انتخاب میکنم ، مثلا حرف L و میبینم که برای نمایشش امده و نوشته U+004C که U نمایانگر Unicode هست و 00 جدا کننده و 4c هم درواقع هگزادسیمال L هست (c درواقع میشه 12 پس 412 نمایانگر L هست) ولی ما دو دسته رشته داریم ، یکیشون ASCII هست و دیگریم Unicode

ASCII : هر حرف 7بیت یا تقریبا یک بایت در نظر گرفته میشه (255 عدد) و اکثرا حروف آمریکاییه و اعداد و سیمبول ها و..

UNICODE : هر حرف 2 بایت در نظر گرفته میشه و تموم زبانا رو شامل میشه (U+004C)


2. در این روش میاییم و متغییر هارو پشت سر هم میچینیم و آدرس متغیر اولیو میریزیم توی یه ریجستر(مثل روش اول) ولی با این تفاوت که بقیه متغییر ها پشت سرش امدن و دیگه نیاز نیست آدرس اونارو هم داشته باشیم (مثل یه آرایه یا لیست پشت سر هم میان(مثل زنجیر که وقتی یه حلقرو میکشی حلقه های متصل بهش هم کشیده میشن)(مثلا وقتی با متغییر های عمومی ، ارگومان و پارامتر کار میکنی خیلی بدرد میخوره))

معرفی مفاهیم مدیریت حافظه یا Handling Memory Address

مثلا در این عکس متغیر x اولیه ، y دومیه ، z سومیه و f چهارمیه ، ما میتونیم بگیم آدرس پوینتر به هرجا اشاره کرد اون متغیر اول یا x ماعه ، 4 تا بعد آدرس پوینتر میرسیم به متغیر دوم یعنی y و 8 تا بعد آدرس پوینتر میتونیم برسیم به z که سومینه ، 12 تا بعدی میرسیم به چهارمی که f عه و...

ebp = x , ebp + 4 = y, ebp + 8 = z , ebp + 12 =f ..

نکته : این روش میتونه توسط کامپایلر یا قسمتی از کد هم اجرا بشه


3. در این روش ما بحث استک رو داریم ، که ما در اینجا نیاز به ذخیره پوینتر نداریم ، و روش عملکردش LIFO که من میتونیم با زدن مثال لباس و بشقاب بهتون بفهمونم جریان چیه :

معرفی مفاهیم مدیریت حافظه یا Handling Memory Address

در اینجا فرض کنید یه دسته بشقاب دارید و میخواید یه بشقاب جدید بهشون اضافه کنید، این بشقاب جدید روی بشقاب اخر میاد ، یا میخواید یه بشقاب بردارید ، از کجا برمیدارید؟ از بشقاب اخر  (ایده استک هم از این گرفته شده) و یه مثال دیگه درباب لباس ، شما اول شورت و زیر پیرهنی میپوشید، بعد روش تیشرت و شلوار ، بعد کاپشن و در نهایت کلاه ! حالا اگر بخواید لباساتونو دربیارید میتونید اول زیر پیرهنی یا شورت رو در بیارید؟ نه ! اول کاپشن رو درمیارید بعد تیشرت و شلوار و در نهایت زیر پیرهنی و شورت ! به این ایده میگن پُشته یا Stack ، این ایده اسمش First In Last Out هست که میگه هرچیز جدیدی که میخواد وارد بشه (in) باید آخر بشینه(Last) و هرچیزی که میخواد برداشته بشه (out) باید اولین باشه (First) و ما دیتایی رو میزاریم داخل استک (میزاریم روش) یا اصطلاحا PUSH میکنیم و یا دیتایی رو از روی استک حذف میکنیم یا اصطلاحا POP میکنیم ، مثلا اینجا ما میخوایم متغییر های X و Y و Z و F رو PUSH کنیم ، اول X بعد Y بعد Z بعد F ، اگر ما بخوایم به اینا دسترسی داشته باشیم اول میریم سراغ F بعد Z بعد Y بعد X و..  و بهمین خاطر دیگ نیاز نیست پوینتری به جایی بزنیم ، پس فقط اخرین ادرس رو باید یادمونه باشه که ریخته میشه تو esp و بعدش دیگه حله دیگه :)

معرفی مفاهیم مدیریت حافظه یا Handling Memory Address

یه مثال دیگه : فرض کنید میخوایم این عبارت رو حساب کنیم :

x = 5×6 + 6×2 + 7(4+6)

نحوه قرار گیری در استک اینطوریه : میاد میگه 5 در 6 میشه 30 و PUSH اش میکنه داخل استک ، بعد 6در2 میشه 12 بعد میزارش داخل استک ، بعد 7 رو میزنه داخل استک ، بعد جمع 4+6 که میشه 10 رو میزاره داخل استک حالا که به آخر رسید میخواد استک رو خالی یا POP کنه ، میاد میگه 7 در 10 میشه 70 و استک فریم های مربوطه رو POP میکنه بعد میاد 70 رو بعلاوه 12 میکنه میشه 82 و استک مربوطرو POP میکنه بعد 82 بعلاوه 30 که میشه 112 تا و استک اخرم POP میکنه و نتیجرو میریزه تو X ، یعنی X=112

(کل این فرایند به صورت کامل در مقاله بعدی توضیح داده میشه بعلاوه توضیح حافظه و Stack)


4. میاد و آدرس هارو به صورت مستقیم در کد ذخیره میکنه ، اگر از مطالب قبل یادتون باشه ما گفتیم که ما یه بخش داریم تحت عنوان Virtual Memory ک تمام متغییر ها و آدرس متغیر ها توی اون ذخیره میشه ، چون پردازش همیشه در ImageBase لود میشه و کد برنامه همیشه در قسمت text لود میشه ، پس متغییر ها و آدرساشونم کنارشون ذخیره میشه و هرچی کتابخونه جانبی هم لود بشه ، ادرس میگیره و اون آدرس هام آپدیت میشن و اونجا ذخیره میشن ! مثلا اینجا ما اگر بخوایم نگاه کنیم به کدش این میشه (در اسمبلی) :

mov DWORD PTR [OX00010000], 5 ; X=5 

معرفی مفاهیم مدیریت حافظه یا Handling Memory Address

اینم گذاشتم بیشتر درک کنید ولی مقاله بعدی براتون میشکافمش ، اگر سوال چیزی بود بعد خوندن مقاله بعدی مطرح کنید :)


محمد حسن پزشکیان
محمد حسن پزشکیان

عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

کارشناس تست نفوذ سنجی ، علاقه مند به امنیت تهاجمی و رد تیمینگ | عضو انجمن بین المللی ورزش های رزمی کشور آلمان و دارای احکام بین المللی و داخلی کمربند مشکی در سبک های کیوکوشین ، هاپکیدو ، کیک بوکسینگ و چند تام قهرمانی کشوری

14 شهریور 1400 این مطلب را ارسال کرده

نظرات