آسیب پذیری های مربوط به خواندن و نوشتن نامتعارف

آسیب پذیری های مربوط به خواندن و نوشتن نامتعارف

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

خواندن و نوشتن نامتعارف (Arbitrary Read/Write) یعنی چه؟

به معنی خواندن و یا نوشتن هر قسمتی از برنامه است که غالبا توسط سازنده برنامه اجازه یا اختیار آن به ما داده نشده باشد. به عنوان مثال می توان به سرریز بافر، format string و خواندن یا نوشتن بر روی قسمت خاصی از حافظه، بعد از یک integer overflow یا یک ورودی نامتعارف اشاره کرد.

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

خواندن نامتعارف می تواند به اکسپلویت نویسی کمک شایانی کند، کیلاگرها معمولا از همین روش استفاده کرده و قسمتی از رم که بافر خواندن ورودی کیبورد است را خوانده و ذخیره می کنند.

در اکسپلویت heartbleed در پیاده سازی ssl و کتابخانه openssl نیز همین خواندن دلخواه و نامتعارف بود که به info leak قسمتی از کلیدهای خصوصی رمز نگاری شده و امکان رمزگشایی را برای حمله کننده آسان می ساخت. بگذارید چند مثال از خواندن و یا نوشتن نامتعارف و دلخواه را با هم بررسی کنیم.

  • سرریز بافر: اگرچه خیلی قدیمی اما هنوز هم مهم و ضروری است.
  • سرریز عدد: بسیار مهم و معمول حتی در بسیاری از برنامه های امروزی.

سرریز بافر (buffer overflow)

Buffer overflow

اگر بافر را به عنوان قسمتی از حافظه که شما انتخاب کرده و اندازه ای مشخص برای آن تعیین کردید در نظر بگیریم، بیش از حد و یا کمتر از حد آن اندازه بنویسیم و یا بخوانیم را به ترتیب buffer overflow و buffer underflow می نامیم. به عنوان مثال آرایه ای 15 خانه ای تعریف کرده ایم، اگر عددی منفی و یا عددی بیش از 15 بعنوان اندیس بدهیم.

برنامه زیر یک مثال از خواندن و نوشتن نامتعارف است:

سرریز عدد (Number overflow)

Number overflow

وقتی یک متغیر عددی به بالاترین حد فضای اختصاص داده شده به آن می رسد، با اضافه شدن بیشتر به کمترین اندازه خودش بر می گردد و از آنجا ادامه می یابد. به عنوان مثال یک متغیر از نوع unsigned char بازه 0 تا 255 را ساپورت می کند، اما وقتی مثلا 250 است و ما 10 تا به آن اضافه می کنیم، به جای 260 عدد 4 را داخل خود ذخیره می کند. چون در ان فضای 8 بیتی جا نمی شود. این باعث می شود با جمع، ضرب و یا منها کردن به عددی کمتر از عدد فعلی در ان متغیر برسیم.

برنامه زیر یک مثال ساده از سرریز عددی است:

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

100%
Awesome
  • Criteria

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.