Geek

روز نوشت هایی در مورد امنیت

Geek

روز نوشت هایی در مورد امنیت

پیوندهای روزانه

ساختار برنامه های اجرایی در حافظه RAM – قسمت دوم

جمعه, ۱۵ فروردين ۱۳۹۳، ۰۹:۳۶ ب.ظ
همان طور که در قسمت اول اشاره کردیم ، برای اینکه آدرس شروع توابع و کتابخانه ها ، با تکنیک حافظه مجازی همیشه یکسان خواهد بود و این مورد ، امنیت را به چالش میکشد. همچنین گفتیم که برای رفع آن از تکنیک ASLR در سیستم عامل ها استفاده می شود. ASLR در سیستم عامل لینوکس، آدرس بخش های heap ، stack و  memory mapping segment را به وسیله افزودن offset به آدرس شروع آنها ، تصادفی میکند. به عنوان یادآوری این بخش ها در حافظه سیستم عامل لینوکس ، نگاهی دوباره به تصویر آن از بخش اول این پست خواهیم داشت. بخش های ذکر شده با علامت فلش قرمز مشخص شده اند.




همان طوری که در تصویر بالا مشاهده میکنید ، بالاترین بخش قابل استفاده برای کاربر ، حافظه Stack است. در این قسمت ، متغیرهای محلی تابع و پارامترهای آن قرار میگیرند و همان طور هم که میدانید یک حافظه LIFO است. شکل زیر تصویر یک Stack frame را نشان میدهد . هر تابع هنگام فراخوانده شدن ، یک  stack frame را به صورت جداگانه تشکیل میدهد.



در مورد کارکرد این حافظه و نحوه فراخوانی توابع توضیحات زیادی را نمیدهیم چرا که توضیحات موجود در لینک قسمت اول کافی به نظر میرسد.
همان طور که در شکل بالا ملاحظه میشود ، آدرس های حافظه Stack رو به پایین رشد میکند. حافظه heap هم رو به بالا رشد میکند. حافظه heap ، یک حافظه داینامیک محسوب میشود که در حین اجرای برنامه ، حافظه به برنامه اختصاص می یابد.به عنوان مثال در زبان برنامه نویسی C میتوانید با استفاده از تابع malloc() یک حافظه داینامیک ذخیره کنید. در بعضی زبان های برنامه نویسی دیگر مانند C# از کلمه کلیدی new برای این منظور استفاده می شود. شکل زیر به وضوح نشان میدهد که یک برنامه چگونه در حافظه های heap و stack قرار میگیرد.



نکته مهمی که در تصویر بالا وجود دارد این است که در پایان کار ، حافظه stack خالی می شود و متغیرها از بین می روند ولی حافظه heap این گونه نیست و باید free شود که در زبان های برنامه نویسی مختلف ، توابع متفاوتی وجود دارد. یکی از کابردهای اختصاص حافظه داینامیک ایجاد بافرهایی با تعداد خانه های بسیار بالا است. در حالت عادی اگر بخواهیم آرایه ای با تعداد خانه های بسیار بالا مثلا 500000 خانه ایجاد کنیم ممکن است با پیغام Stack Overflow مواجه شویم. در حالی که با اختصاص حافظه داینامیک برای یک آرایه همچین پیغامی دریافت نخواهیم کرد.
در مجموع برای مشاهده وضعیت حافظه در سیستم عامل ویندوز میتوانید از ابزار Vmmap  استفاده کنید.این ابزار به صورت دقیقی میتواند جزییاتی از کتابخانه های موجود در حافظه را نشان دهد. نکته جالبی که در این ابزار وجود دارد این است که میتوانید مشاهده کنید که آیا یک کتابخانه به صورت تصادفی به یک آدرس map میشود یا خیر . در واقع ASLR را پشتیبانی میکند یا خیر . در سیستم عامل های 7 و 8 که ASLR را به صورت کامل پشتیبانی میکنند تمامی کتابخانه های آن به صورت استاندارد ، به صورت تصادفی map میشوند. به تصویر زیر از vmmap در یک سیستم عامل 64 بیتی ویندوز 7 بدست آمده است توجه کنید.



همان طور که در تصویر بالا مشاهده میکنید ، کتابخانه های سیستم عامل ویندوز 7 ، قابلیت ASLR را پشتیبانی کرده و به یک آدرس تصادفی map میشوند و این مورد با آوردن کلمه ASLR در تصویر بالا مشخص است . اما به نرم افزار babylon توجه کنید. این نرم افزار، ASLR را پشتیبانی نمیکند ( به فلش های قرمز رنگ بالا توجه کنید ) . در نتیجه میتواند نکته منفی در بحث امنیت این نرم افزار باشد.
در مجموع اگر میخواهید خودتان یک برنامه بنویسید که بتوانید وضیعت ASLR در یک کتابخانه ( تحت ویندوز) را مشاهده کنید، باید header آن را مشاهده کنید و ویژگی DllCharacteristics را بررسی کنید. اگر برابر IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE تنظیم شده بود ، آنگاه قابلیت map شدن به یک آدرس تصادفی را داراست. زبان برنامه نویسی مورد علاقه من پایتون است. پس برای مشاهده header های یک کتابخانه ، از ماژول pefile میتوانید استفاده کنید. و خودتان یک برنامه برای شناسایی وضیعت کتابخانه ها بنویسید .اگر هم به دنبال یک برنامه آماده هستید تا تمامی Dll های یک فولدر یا داریو خاص را بررسی کنید ،  میتوانید از این ابزار استفاده کنید.  به عنوان مثال با استفاده از دستورات زیر میتوانید لیست تمامی کتابخانه هایی که از ASLR  پشتیبانی نمی کنند را پیدا کنید.
ابتدا دستور زیر برای پیدا کردن تمامی DLL های درایو C استفاده کنید.

dir c:\*.dll /b /s >dlls.txt
سپس دستور زیر را برای پیدا کردن کتابخانه های مورد نظر استفاده کنید.

aslrchk.exe -l dlls.txt 1 >dlls _nonaslr.txt
در فایل متنی dlls_noaslr.txt لیست و آدرس تمام کتابخانه ها را خواهید داشت.
اگر هم هیچ کدام از روش های بالا را ترجیح نمیدهید :D میتوانید از این وبسایت استفاده کنید. تا به صورت آنلاین وضیعت یک کتابخانه را تشخیص دهید.



موافقین ۰ مخالفین ۰ ۹۳/۰۱/۱۵

نظرات  (۲)

mamnoonnn

من هر دو قسمت رو خوندم و میخوام سه تا مطلب رو بگم:

1 - اینکه مطلب دقیق، درست و قابل استناد بود.

2- زبان خوبی داشت و قابل درک بود .

3-   واقعا بر خلاف بسیاری از سایت های فارسی که چند سالی هست هیچ نوشته ای ازشون رو نمی خونم، خیلی عالی بود.
لطفا ادامه بدید!

پاسخ:
ممنونم :) . سعی میکنم بیشتر یاد بگیرم تا بتونم بیشتر بنویسم .

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی