আমি ধরে নিচ্ছি এটির কোনও ইতিহাস আছে তবে স্ট্যাকটি নীচের দিকে কেন বৃদ্ধি পাচ্ছে?
আমার কাছে মনে হয় বাফার ওভারফ্লোগুলি যদি স্ট্যাকটি উপরের দিকে বাড়তে থাকে তবে তা কাজে লাগানো অনেক বেশি শক্ত ...
আমি ধরে নিচ্ছি এটির কোনও ইতিহাস আছে তবে স্ট্যাকটি নীচের দিকে কেন বৃদ্ধি পাচ্ছে?
আমার কাছে মনে হয় বাফার ওভারফ্লোগুলি যদি স্ট্যাকটি উপরের দিকে বাড়তে থাকে তবে তা কাজে লাগানো অনেক বেশি শক্ত ...
উত্তর:
আমি বিশ্বাস করি এটি কম্পিউটিংয়ের খুব প্রথম দিন থেকেই আসে, যখন স্মৃতিশক্তি খুব সীমাবদ্ধ ছিল এবং স্ট্যাকের দ্বারা একচেটিয়া ব্যবহারের জন্য মেমরির একটি বৃহত অংশ প্রাক-বরাদ্দ করা বুদ্ধিমানের কাজ ছিল না। সুতরাং, ঠিকানা থেকে শূন্য মেমরিকে উপরের দিকে বরাদ্দ করে, এবং মেমরিটির প্রান্ত থেকে নীচের দিকে স্ট্যাক করে, আপনি হিপ এবং স্ট্যাক উভয়ই মেমরির একই অঞ্চল ভাগ করতে পারেন।
আপনার যদি আরও কিছু গাদা দরকার হয় তবে আপনি নিজের স্ট্যাক ব্যবহারের বিষয়ে সতর্ক হতে পারেন; আপনার যদি আরও স্ট্যাকের প্রয়োজন হয় তবে আপনি কিছু হিপ মেমরি মুক্ত করার চেষ্টা করতে পারেন। ফলস্বরূপ, বেশিরভাগই, দর্শনীয় ক্র্যাশগুলি হয়েছিল, কারণ স্ট্যাকটি মাঝেমধ্যে গাদা ও তার বিপরীতে লিখিত ছিল।
আগের দিনগুলিতে কোনও আন্তঃবিবেজ ছিল না, তাই বাফার ওভারনুন শোষণের কোনও সমস্যা নেই। (বা কমপক্ষে যে পরিমাণ আন্তঃবিবেজের অস্তিত্ব ছিল, এটি সমস্ত ছিল মার্কিন যুক্তরাষ্ট্রের প্রতিরক্ষা বিভাগের উচ্চ সুরক্ষা সুবিধার মধ্যে, সুতরাং দূষিত ডেটা হওয়ার সম্ভাবনাটি খুব বেশি চিন্তাভাবনা করার দরকার পড়েনি।)
এর পরে, বেশিরভাগ স্থাপত্যগুলির সাথে এটি একই স্থাপত্যের পূর্ববর্তী সংস্করণগুলির সাথে সামঞ্জস্য বজায় রাখার বিষয় ছিল। এ কারণেই আজও আমাদের সাথে রয়েছে উলটা-ডাউন স্ট্যাকগুলি।
প্রোগ্রাম মেমরি traditionতিহ্যগতভাবে সেট আপ করা হয়
code
constants
heap (growing up)
...
stack (growing down)
গাদা এবং স্ট্যাক এক্সচেঞ্জ হতে পারে
তবে স্ট্যাক অন্যভাবে চলে গেলে বাফার ওভারফ্লোগুলি এখনও ব্যবহার করা যেতে পারে
strcpy
উদাহরণ হিসাবে ক্লাসিক গ্রহণ
foo(char* in){
char[100] buff;
strcpy(buff,in);
}
স্ট্যাক মেমরি হিসাবে
ret foo
arg in
buff array
ret strcpy
buf pointer
in
এর অর্থ হ'ল অনুলিপিটি করা হয়ে গেলে রিটার্নের ঠিকানাটি strcpy
বাফারের পরে হয় (তার foo
ফেরতের ঠিকানার পরিবর্তে ) এবং যা কিছু আছে তার দ্বারা ওভাররাইট করা যায়in
কিছু হার্ডওয়ারের উচ্চ স্তরে মেমরি থেকে শুরু করে গাদা থাকে, কমতে থাকে, যখন স্ট্যাকটি কম মেমোরি থেকে শুরু হয়।
এইচপি এর পিএ-আরআইএসসি হার্ডওয়্যার, অন্যান্যের মধ্যে এই আছে: http://www.embeddedrelated.com/usenet/embedded/show/68749-1.php
শ্রদ্ধেয় মাল্টিক্স অপারেটিং সিস্টেমটি এমন একটি হার্ডওয়্যারে ছড়িয়ে পড়েছিল (সম্ভবত অনেকের মধ্যে একটি) স্ট্যাকগুলি বড় হচ্ছে: দেখুন http://www.acsac.org/2002/papers/classic-multics.pdf , বিভাগ ২.৩.২ এর শেষে:
তৃতীয়ত, মাল্টিক্স প্রসেসরের স্ট্যাকগুলি নেতিবাচক দিকের চেয়ে ধনাত্মক দিকে বেড়েছে। এর অর্থ হ'ল যদি আপনি আসলে কোনও বাফার ওভারফ্লো সম্পাদন করেন তবে আপনি নিজের রিটার্ন পয়েন্টারকে বাদ দিয়ে অব্যবহৃত স্ট্যাক ফ্রেমগুলিকে ওভাররাইট করে যাবেন এবং শোষণকে আরও জটিল করে তুলবেন।
এটি একটি বরং আকর্ষণীয় বিবৃতি। কেবল "প্রথাগত" পদ্ধতি-কল-স্ট্যাক-ফ্রেমের ব্যবস্থাপনার কারণে কি বাফার ওভারফ্লোগুলি এত বড় সমস্যা হয়ে উঠেছে? এছাড়াও, সম্পূর্ণরূপে অদম্য হিসাবে মাল্টিক্সের খ্যাতি কতটা কেবল হার্ডওয়্যার ডিজাইনের একটি পরিবর্তন ছিল?