loader image

تحلیل باگ SOF همراه با کد آسیب پذیر و فیلم

تحلیل باگ SOF با کد

در این نوشته میخواهیم راجب مشکل امنیتی و تحلیل باگ SOF همراه با کد آسیب پذیر یا همون Stack Overflow بحث کنیم.

 

استک ( Stack ) یا پشته چیست ؟

در آموزش تحلیل باگ SOF با کد آسیب پذیر شما نیاز دارید تا قبل از شروع با مفاهیم پایه آن آشنا شوید.
استک در واقع یک حافظه برای جمع آوری کردن آدرس های برگشت در کد نویسی اسمبلی است. تمامی زبان های برنامه نویسی بجز اسمبلی استک و حافظه های Segment را به صورت اتوماتیک مدیریت میکنند و برنامه نویس درگیری خاصی با این موارد ندارد. حتی در بیشتر مواقع برنامه نویسان اصلا از وجود چنین حافظه ای هایی اطلاع ندارند.

اطلاعات بیشتر در رابطه با استک (پشته) چیست؟

میتوانید توضیحات بیشتری در رابطه با استک چیست از اینجا بخوانید .

 

سگمنت چیست ؟

سگمنت قسمت هایی بر روی حافظه رم است که با حجم کم جدا میشوند و به برنامه ها جهت ذخیره متغییر ها , آدرس های برگشت و … استفاده میشود. در واقع یک رم فیزیکی درون خود ملیون ها سگمنت ایجاد شده دارد که در هنگام اجرای برنامه ساخته میشود.

 

کد آسیب پذیر نسبت به SOF‌ – Stack Overflow:

همانطور که گفتیم در تحلیل باگ SOF با کد آسیب پذیر میخواهیم نحوه کارکرد این باگ را به شما آموزش دهیم.
در زبان برنامه نویسی C تعدادی توابع نا امن وجود دارند که نباید استفاده شوند. زیرا طول کاراکتر ها و متن ها را چک نمیکنند و این مشکل امنیتی سر ریزی پشته را بوجود می آورد.

لیست توابع نا امن را میتوانید از اینجا مشاهده کنید و از به کار گیری آنها در کد های خود دوری کنید.

 

قطعه کدی که باعث سر ریزی استک خواهد شد و برنامه پس از مدتی به دلیل عدم وجود فضا کافی در استک متوقف خواهد شد.

#include <stdio.h>
#include <string.h>
int main()
{
     if (main() == 0)
     {
           return 1;
     }
     else
     {
           return 0;
     }
}
SOF (Stack Overflow) همراه با کد آسیب پذیر
SOF (Stack Overflow) همراه با کد آسیب پذیر, نحوه جلوگیری

 

 

دور زدن صفحه ورود و Over write شدن اطلاعات

در کامپیوتر اطلاعات هر متغییر درون تعدادی سگمنت ذخیره میشوند. هر سگمنت درون یک حافظه رم فیزیکی یا مجازی (Swap) ذخیره میشود. در واقع یک رم ۸ گیگ (برای مثال) از تعدادی سگمنت که درون آنها متغییر ها نگهداری میشوند تشکیل میشود.

سگمنت ها اندازه های مختلفی دارند. دقیقا مثل متغییر ها که دارای سایز های مختلفی است. و دقیقا مثل متغییر ها دارای انواع مختلفی است. سگمنت ها معمولا سه دسته مورد استفاده قرار میگیرند.

  1. سگمنت پشته – Stack Segment
  2. سگمنت داده – Darta Segment
  3. سگمنت کد – Code Segment

 

به کد زیر توجه کنید

#include <stdio.h>
#include <string.h>

int main()
{
    char pass[10];
    char guess[10];

    strcpy(pass, "aaaa");
    printf("Enter your password: ");
    gets(guess);

    if (!strncmp(pass,guess, 10))
    {
        printf("Logged in.");
    }
    else
    {
        printf("Wrong password");
    }
    return 0;
}

فرض کنید یک حافظه داریم که دو متغییر درون آن وجود دارد. در خط اول متغییر پسوردی که کاربر وارد میکند است و طول آن ۱۰ کاراکتر است.
در خط دوم طول متغییر اصلی جهت مقایسه ورود وجود دارد که طول آن هم ۱۰ کاراکتر هست.

 

حالا چه اتفاقی می افتد اگر کاربر ۱۰ بار یک حرف را به عنوان رمز در این کد وارد کند؟ برای مثال AAAAAAAAAA
درست است که AAAAAAAAAA برابر با aaaa نباشد پس در خروجی این کد worg password خواهد بود به معنی ورود ناموفق.

اما نکته جالب در رابطه با هک این قطعه کد:

تا اینجا در تحلیل باگ SOF با کد آسیب پذیر با نحوه برخورد کد با اطلاعات ورودی اشنا شدید. پسورد از کاربر گرفته میشود سپس با پسورد اصلی مقایسه میشود. در صورتی که هر دو مساوی بودند ورود موفقیت آمیز خواهد بود. اما چه خواهد شد اگر کاربر بیشتر از اندازه متغییر حروف وارد کند ؟

در زبان سی تابع gets از کاربر ورودی دریافت میکند اما هنگام قرار دادن آن درون حافظه رم اندازه را چک نمیکند تا کوچکتر از اندازه حافظه متغییر باشد. پس در این حالت مابقی اضافه آمده از حافظه متغییر اول بر روی متغییر دوم باز نویسی یا Over Write خواهد شد.
به این معنا که اطلاعات قبلی پاک شده و اطلاعات جدید جایگذین خواهد شد.

اگر کاربر ۲۰ بار حرف B یا هر حرف دیگری را وارد کند, در آن گاه متغییر اول که ورودی کاربر درون آن ریخته میشود از ۱۰ عدد B پر خواهد شد. اما ۱۰ عدد B دیگر چه؟
آنها به روی متغییر دوم نوشته خواهد شد. یعنی متغییر دوم نیز به ۱۰ عدد کاراکتر B تبدیل خواهد شد.

مثال دور زدن صفحه ورود در حمله SOF
یک مثال از حمله SOF – ورود موفق

 

در نتیجه؛

متغییر اول که ورودی کاربر خواهد بود حاوی ۱۰ عدد کاراکتر B است. متغییر دوم که پسورد اصلی درون آن ذخیره خواهد شد حاوی ۱۰ عدد کاراکتر B خواهد شد.
در این صورت در خط بعد مقایسه خواهد شد:
« آیا BBBBBBBBBB برابر با BBBBBBBBBB خواهد بود؟ »

بله! در این گاه هست که در خط بعد مقایسه درست خواهد شد و خروجی یک ورود موفقیت آمیز خواهد بود.
Logged in.

نتیجه گیری:

این نحوه اکسپلویت مشکل امنیتی سر ریزی استک یا همان SOF ( Stack Overflow ) بود.

این روش هک هنگامی خطرناک خواهد شد که بدانید با استفاده از این روش میشود یک Payload ( کد مخرب کنترل کننده سیستم) را به حافظه رم تزریق کرد. و سپس با استفاده از آدرس های استک به اول آدرس کد مخرب پرش کنیم. در آن صورت برنامه اصلی از اجرا در خواهد آمد و سیستم کد مخرب را ادامه خواهد داد تا کد مخرب تمام شده و بسته شود.

این یک مورد از هزاران مورد آسیب پذیری ها اهمیت امنیت سایبری را مجدد خاطر نشان میسازد. برای سفارش پروژه پن تست و امن سازی از فروشگاه ما بازدید کنید یا برای پیگیری به حساب کاربری خود وارد شوید.

یک مثال عمومی از این باگ آسیب پذیری سال ۲۰۱۹ در ویندوز ۷ – ۸ – ۸.۱ بود به شماره ثبتCVE-2017-0143 بر روی سرویس SMB (سمبا) بود.

اشتراک گذاری مطالب بدون ذکر منبع سرقت اثر به حساب آمده و پیگرد قانونی خواهد داشت
اشتراک گذاری مطالب با ذکر منبع آزاد است.