انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: رویکردی برای جلوگیری Buffer Overflow  (دفعات بازدید: 1278 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین alireza378

  • Jr. Member
  • *
  • ارسال: 61
  • جنسیت : پسر
رویکردی برای جلوگیری Buffer Overflow
« : 11 شهریور 1394، 02:23 ب‌ظ »
سلام.
مطمئنا هممون در مورد Buffer Overflow میدونیم ، یک سوالی داشتم که فکر میکنم سوال افراد دیگری هم بوده ولی من نتونستم جوابش رو پیدا کنم.

مطمئنا اینجا همتون یا بیشترتون لینوکسی هستید و کاری به #C ندارید ، اما توی #C یک رویکرد داره برای جلوگیری از نوعی سرریزبافر ، مثلا وقتی Element شماره 5 یک آرایه ی 3 عنصری رو برابر مقداری قرار میدید خطا میده...

سوالم اینه ، چرا موسسه ی استانداردهای آمریکا (ANSI) استانداردی وضع نمیکنه که کامپایلرها به این مورد خطا بگیرند ؟ دقیقا چه چیزی این وسط وجود داره که موسسه ی ANSI نمیتونه در زبان C تغییری اتخاذ کنه !؟ حقوق برنامه نویس فقید ، دنیس ریچی ؟  :D

آفلاین بهنام م ک

  • Full Member
  • *
  • ارسال: 215
  • جنسیت : پسر
پاسخ : رویکردی برای جلوگیری Buffer Overflow
« پاسخ #1 : 11 شهریور 1394، 03:26 ب‌ظ »
راستش نمیدونم جوابم چقد میتونه به شما کمک کنه اما مطمئن باشین که هدف آف تاپیک یا همچین چیزی ندارم فقط میخوام بگم که این مثالی که شما اینجا زدین اصلا buffre overflow نیست. این این مکانیزمیه که موقع طراحی و پیاده سازی زبان لحاظ میشه. ینی ممکنه یه زبان در زمان کامپایل محدوده آدرس دهی آرایه رو چک کنه و یکی دیگه این کارو نکنه و اونو موکول کنه به زمان اجرا که اون موقع خطای دسترسی به حافظه ی غیرمجاز روی میده و اصلا buffer overflow یه چیز دیگه س. من راستش از سی شارپ خبر ندارم اما میدونم که سی و سی پلاس محدوده آرایه رو در زمان کامپایل چک نمیکنن.
راستش این چیزی بود که من از سوال شما متوجه شدم و میدونم که جواب شما نیست. خلاصه ببخشید دیگه هروقت که منو در مورد منظورتون توجیه کردین دوباره مزاحم میشم و درباره ی سیاست هاس انسی باهم بحث میکنیم ;)
من از آنچه تو میگویی بیزارم ولی تا پای مرگ از حق تو برای گفتن آن دفاع میکنم

آفلاین alireza378

  • Jr. Member
  • *
  • ارسال: 61
  • جنسیت : پسر
پاسخ : رویکردی برای جلوگیری Buffer Overflow
« پاسخ #2 : 11 شهریور 1394، 03:39 ب‌ظ »
راستش نمیدونم جوابم چقد میتونه به شما کمک کنه اما مطمئن باشین که هدف آف تاپیک یا همچین چیزی ندارم فقط میخوام بگم که این مثالی که شما اینجا زدین اصلا buffre overflow نیست. این این مکانیزمیه که موقع طراحی و پیاده سازی زبان لحاظ میشه. ینی ممکنه یه زبان در زمان کامپایل محدوده آدرس دهی آرایه رو چک کنه و یکی دیگه این کارو نکنه و اونو موکول کنه به زمان اجرا که اون موقع خطای دسترسی به حافظه ی غیرمجاز روی میده و اصلا buffer overflow یه چیز دیگه س. من راستش از سی شارپ خبر ندارم اما میدونم که سی و سی پلاس محدوده آرایه رو در زمان کامپایل چک نمیکنن.
راستش این چیزی بود که من از سوال شما متوجه شدم و میدونم که جواب شما نیست. خلاصه ببخشید دیگه هروقت که منو در مورد منظورتون توجیه کردین دوباره مزاحم میشم و درباره ی سیاست هاس انسی باهم بحث میکنیم ;)

ممنون که نظر دادی ، فن بیان من یکمی ضعیفه  ;) نتونستم درست توجیه کنم :)

مثلا این کد :

#include <stdio.h>
#include <stdlib.h>
void manipulate(char *buffer) {
  char newbuffer[80];
  strcpy(newbuffer,buffer);
}

int main() {
  char ch,buffer[4096];
  int i=0;

  while ((buffer[i++] = getchar()) != '\n') {};

  i=1;
  manipulate(buffer);
  i=2;
  printf("The value of i is : %d\n",i);
  return 0;
}

اینجا اگر 160 کاراکتر وارد کنیم ، آرایه سرریز میشه و بعد از آرایه هم Over write میشه ، حالا چرا ANSI تغییری در استاندارد اعمال نمیکنه که تابع strcpy امن بشه و بافر newbuffer سرریز نکنه ؟

توی کامپایلرهایی مثل gcc یا Visual Studio این مقدار لحاظ میشه ، حتی خوده visual Studio میگه به جای scanf از scanf_s استفاده کنید و..

ولی سوال اینجاست که چرا ANSI این کار رو انجام نمیده ؟
بحث ما کامپایلر نیست ، بحث ما سازمان ANSI هست که چرا این کار رو انجام نمیده ، حتما باید دلیلی داشته باشه :) وگرنه این مورد مطمئنا به ذهن انسان هایی پیش از من هم خطور کرده :)

آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4872
  • جنسیت : پسر
  • masoft قدیم
پاسخ : رویکردی برای جلوگیری Buffer Overflow
« پاسخ #3 : 11 شهریور 1394، 09:26 ب‌ظ »
راه انجام این کار اینه که در هنگام Runtime این تست انجام بشه و این یک کار اضافه هست که برنامه‌نویس موقع نوشتن برنامه باید رعایت بکنه، نه اینکه در Runtime اینکار انجام بشه. اگر برنامه‌نویسی توانایی انجام چنین کاری رو نداره، باید از زبان‌های سطح بالاتر استفاده کنه.

آفلاین alireza378

  • Jr. Member
  • *
  • ارسال: 61
  • جنسیت : پسر
پاسخ : رویکردی برای جلوگیری Buffer Overflow
« پاسخ #4 : 11 شهریور 1394، 09:46 ب‌ظ »
راه انجام این کار اینه که در هنگام Runtime این تست انجام بشه و این یک کار اضافه هست که برنامه‌نویس موقع نوشتن برنامه باید رعایت بکنه، نه اینکه در Runtime اینکار انجام بشه. اگر برنامه‌نویسی توانایی انجام چنین کاری رو نداره، باید از زبان‌های سطح بالاتر استفاده کنه.

همونطور که گفتم Visual Studio این امکان رو میده به کاربران ، کاری به Visual Studio نداریم ، خود gcc هم بعضی وقتا warning میده و برای کامپایل اون برنامه ی آسیب پذیر باید با سوئیچ های خاصی کار کرد..
چطور اینجا ANSI دخالتی نمیکنه ؟

منظورت رو فهمیدم ؛ ولی منو قانع نکرد.

آفلاین بهنام م ک

  • Full Member
  • *
  • ارسال: 215
  • جنسیت : پسر
پاسخ : رویکردی برای جلوگیری Buffer Overflow
« پاسخ #5 : 11 شهریور 1394، 11:20 ب‌ظ »
به نظر شما چرا ANSI باید به طراحی و پیاده سازی یه زبان گیر بده؟ اصلن مگه کارش اینه؟؟؟
شما به نظرم فک میکنین که ANSI سازمانیه که تلاش میکنه کیفیت یک زیان برنامه سازی رو افزایش بده یا لااقل مراقب حفظ کیفیتش باشه اما من هیچ کجای دنیا سراغ ندارم که استاندارد سازی هم ردیف ارتقا یا بهبود باشه
من از آنچه تو میگویی بیزارم ولی تا پای مرگ از حق تو برای گفتن آن دفاع میکنم