পাইথাগ্রসের উত্তরের মন্তব্যে আমি "বাফার ওভারফ্লোস" উল্লেখ করেছি, আমি সম্ভবত কিছুটা কী বোঝাতে চাইছিলাম তা পরিষ্কার করে দেওয়া উচিত। সি, এটা জানা যথেষ্ট না যে মেমরি সাথে সরাসরি কাজ বিপজ্জনক - আপনার কাছে সুনির্দিষ্ট উপায়ে এটা বিপদজনক বুঝতে হবে। আমি এই সমস্ত ক্ষেত্রে "নিজেকে পায়ে গুলি চালানোর" রূপকটি পছন্দ করি না - অনেক সময়, আপনি ট্রিগারটি টানছেন না, তবে প্রায়শই এটি আপনার এবং / অথবা আপনার ব্যবহারকারীদের বিপরীতে স্বার্থের একটি অভিনেতা ।
উদাহরণস্বরূপ, একটি অবতরণ স্ট্যাকের একটি আর্কিটেকচারে (সর্বাধিক জনপ্রিয় স্থাপত্যগুলি এই বিলটি ফিট করে - x86 এবং এআরএম সাধারণত অন্তর্ভুক্ত), আপনি যখন কোনও ফাংশন কল করবেন তখন ফাংশনের রিটার্ন ঠিকানাটি স্থানীয় ভেরিয়েবলগুলি সংজ্ঞায়িত করার পরে স্ট্যাকের উপরে স্থাপন করা হবে the ফাংশন বডি। সুতরাং যদি আপনি একটি স্থানীয় ভেরিয়েবল হিসাবে বাফার ঘোষণা করেন এবং বাফার ওভারফ্লো পরীক্ষা না করেই এই পরিবর্তনশীলটি বাইরের বিশ্বে প্রকাশ করেন:
void myFn(void) {
char buf[256];
gets(buf);
}
বহিরাগত ব্যবহারকারী আপনাকে একটি স্ট্রিং প্রেরণ করতে পারে যা স্ট্যাক থেকে রিটার্নের ঠিকানাটিকে ওভাররাইট করে - মূলত, তিনি আপনার প্রোগ্রামটির কল-গ্রাফের রান-টাইম ধারণাটি পরিবর্তন করতে পারেন যা বর্তমান ফাংশনটির দিকে নিয়ে যায়। সুতরাং ব্যবহারকারী আপনাকে একটি স্ট্রিং দেয় যা আপনার আর্কিটেকচারের জন্য কয়েকটি এক্সিকিউটেবল কোডের বাইনারি প্রতিনিধিত্ব করে, স্ট্যাকটিকে উপচে ফেলে যথেষ্ট প্যাডিং এবং তিনি আপনাকে যে কোডটি দিয়েছেন তাতে নির্দেশ করার myFn
জন্য রিটার্নের ঠিকানাটি মুছে ফেলার জন্য অতিরিক্ত কিছু ডেটা myFn
দেয়। যদি এটি ঘটে থাকে, তবে myFn
সাধারণভাবে যখন তার কলারের কাছে নিয়ন্ত্রণ ফিরে আসত , তখন এটি ক্ষতিকারক ব্যবহারকারীর দ্বারা সরবরাহ করা কোডের পরিবর্তে শাখা হয়ে যাবে। আপনি যদি সি (বা সি ++) কোডটি লিখেন যা অবিশ্বস্ত ব্যবহারকারীদের কাছে প্রকাশের সম্ভাবনা রয়েছে, আপনার এই আক্রমণকারী ভেক্টরটি বুঝতে হবে। আপনার বুঝতে হবে যে স্তূপের বিপরীতে একটি বাফার ওভারফ্লো কেন প্রায়শই (তবে সর্বদা নয়) স্তূপের বিপরীতে একের চেয়ে সহজে সহজেই কাজে লাগানো যায়, এবং আপনার বুঝতে হবে কীভাবে স্তূপের মধ্যে স্মৃতিটি ছড়িয়ে দেওয়া হয়েছে (খুব বেশি বিশদে নয়, প্রয়োজনীয়ভাবে নয়, তবে ধারণা করুন যে কোনও malloc()
'এডি অঞ্চলে এর চারপাশে নিয়ন্ত্রণ কাঠামো রয়েছে যা বুঝতে পারে যে আপনার প্রোগ্রামটি অন্য কোনওটিতে malloc()
বা কেন ক্রাশ হচ্ছে free()
)
সি আপনাকে কীভাবে আপনার মেশিনটি কাজ করে সে সম্পর্কে নিম্ন-স্তরের বিশদ সম্পর্কে আপনাকে প্রকাশ করে এবং এটি আপনাকে আজ বিস্তৃত ব্যবহারে অন্য কোনও ব্যবহারকারী-সম্পাদিত ভাষার চেয়ে আপনার মেশিনের উপর আরও সরাসরি নিয়ন্ত্রণ দেয়। দুর্দান্ত শক্তির সাথে দুর্দান্ত দায়িত্ব আসে - সি এর সাথে নিরাপদে এবং কার্যকরভাবে কাজ করার জন্য আপনাকে সেই নিম্ন-স্তরের বিশদগুলি আসলে বুঝতে হবে।