باز کردن منو اصلی

تغییرات

۴٬۱۲۶ بایت اضافه‌شده ،  ۶ سال پیش
بدون خلاصه ویرایش
سرریزهای بافر توسط ورودی طراحی شده‌اند که برای اجرای کد، و یا راه عمل برنامه را تغییر می‌دهند، باعث شده‌است. این امر ممکن است در رفتار نامنظم، از جمله خطاهای دسترسی به حافظه، نتایج نادرست، تصادف، یا نقض امنیت سیستم منجر شود. بنابراین، آنها اساس بسیاری از آسیب پذیری‌های نرم افزار است و می‌تواند مخرب مورد سوء استفاده قرار بگیرند.
 
زبان برنامه نویسی معمولا با سرریزهای بافر همراه عبارتند از C و C + +{{چر}}، ساخته شده‌است، در حفاظت در برابر دسترسی و یا جای نوشتن داده‌ها در هر بخشی از حافظه و انجام به طور خودکار نیست بررسی کنید که داده‌ها به آرایه (ساخته شده در نوع بافر) داخل مرزهای آن آرایه نوشته شده‌است.
'''توصیف فنی'''
سرریز بافر هنگامی رخ می‌دهد که داده‌ها نوشته شده به یک بافر، با توجه به مرزهای کافی بررسی، فساد مقادیر داده در حافظه آدرس مجاور به بافر اختصاص داده‌است. شایع ترین این زمانی اتفاق می‌افتد که کپی کردن رشته از کاراکترها از یک بافر به دیگری است.
 
== تشریح ==
امروزه بیشتر سیستم‌عامل‌های مدرن از یک [[پشته]] برای ارسال آرگومان‌ها به توابع و همچنین ذخیره کردن متغیر‌های محلی استفاده می‌کنند. یک پشته، حافظه‌ای به صورت LIFO است که ورود و خروج اطلاعات از یک طرف انجام می‌گیرد. بنابراین آخرین شیئی که وارد پشته شده، اولین شیئی است که از آن خارج می‌شود. هر [[فرآیند]] برای خود پشته‌ای دارد که آرگومان‌های توابع و متغیر‌های محلی در آن ذخیره می‌شوند و این پشته در بالاترین آدرس تصویر فرآیند در حافظه قرار دارد. وقتی که یک برنامه تابعی را فراخوانی می‌کند، یک «قاب پشته» جدید ایجاد می‌شود. این قاب پشته علاوه بر اینکه دربرگیرنده آرگومان‌هایی است که به تابع ارسال شده‌اند، دربرگیرنده فضایی پویا برای متغیر‌های محلی تابع است. «اشاره‌گر پشته» [[ثبات|ثباتی]] است که آدرس بالای پشته را نگه داری می‌کند. از آنجا که هر وقت مقدار جدیدی وارد پشته می‌شود محتوای این ثبات هم تغییر می‌کند، در خیلی از موارد یک «اشاره‌گر قاب» هم وجود دارد که در ابتدای پشته قرار دارد تا بر اساس این اشاره‌گر بتوان به متغیر‌های محلی راحت‌تر دسترسی پیدا کرد. اما مساله ای که باعث ایجاد سرریز بافر می‌شود این است که آدرس برگشت فراخوانی تابع هم در پشته ذخیره می‌شود و از آنجا که سرریز شدن یک متغیر محلی می‌تواند باعث شود آدرس برگشت تابع در پشته بازنویسی شود، یک کاربر خرابکار قادر خواهد بود هر کدی که می‌خواهد را اجرا کند. <ref>http://www.freebsd.org/doc/en/books/developers-handbook/secure-bufferov.html</ref>
 
== جلوگیری ==
در هنگام برنامه‌نویسی باید از این توابع استفاده نشود. این توابع بدون بررسی کردن حجم بافر آنها را بازنویسی می‌کنند که این مسئله می‌تواند دیگر مقادیر موجود در پشته مانند همان آدرس برگشت تابع را بازنویسی کند.
{|
! نام تابع
! دلیل
|-
| {{چپ‌چین}} strcpy(char *dest, const char *src) {{پایان چپ‌چین}}
| ممکن است بافر dest سرریز شود
|-
| {{چپ‌چین}} strcat(char *dest, const char *src) {{پایان چپ‌چین}}
| ممکن است بافر dest سرریز شود.
|-
| {{چپ‌چین}} getwd(char *buf) {{پایان چپ‌چین}}
| ممکن است بافر buf سرریز شود.
|-
| {{چپ‌چین}} gets(char *s) {{پایان چپ‌چین}}
| ممکن است بافر s سرریز شود
|-
| {{چپ‌چین}} [vf]scanf(const char *format, ...) {{پایان چپ‌چین}}
| تمام آرگومانها در معرض سرریز شدن قرار دارند
|-
| {{چپ‌چین}} realpath(char *path, char resolved_path[]) {{پایان چپ‌چین}}
| ممکن است بافر path سرریز شود.
|-
| {{چپ‌چین}} [v]sprintf(char *str, const char *format, ...) {{پایان چپ‌چین}}
| ممکن است بافر str سرریز شود.
|}
 
جای تابع strcpy می‌توان از strncpy و به جای تابع strcat می‌توان از strncat استفاده کرد که این توابع با بررسی حدود بافر مقصد باعث جلوگیری از وقوع سرریز بافر می‌شوند. همینطور تابع fgets هم برای ورودی و خروجی استاندارد مناسب است.
== مثال پایه‌ای ==