বাফার ওভারফ্লো কি ভেরিয়েবলের ডেটা টাইপ পরিবর্তন করে এটি ওভাররাইট করছে? [বন্ধ]


8

বলুন আমার কাছে একটি সি অক্ষরের অ্যারে রয়েছে char buf[15]। বলুন ভেরিয়েবলের int set_me = 0সরাসরি তার পরে মেমরির স্থানে এর ডেটা থাকে char buf[15]। যদি আমি bufস্ট্রিং দিয়ে উপচে পড়ে যাই "aaabbbcccdddeee\xef\xbe\xad\xde"তবে কি set_meডেটা টাইপটি কোনও পূর্ণসংখ্যার থেকে অক্ষরের অ্যারেতে পরিবর্তিত হয়?


3
ডেটা কে ব্যাখ্যা করছে তার উপর নির্ভর করে। সবশেষে বাইনারি হয়। সুতরাং আপনি যেভাবে এটি ব্যাখ্যা করেন এটি বৈধ পূর্ণসংখ্যার মান হতে পারে বা একটি কাস্ট ত্রুটির কারণ হতে পারে
গণেশ আর।

উত্তর:


33

না।

কোনও ভেরিয়েবলের "ডেটা টাইপ" কেবলমাত্র সোর্স কোডে প্রাসঙ্গিক (এবং তারপরেও কেবল কিছু ভাষায়)। এটি চলকটিকে কীভাবে ভেরিয়েবলের সাথে চিকিত্সা করা যায় তা বলে iler

এই উচ্চ-স্তরের ডেটা টাইপগুলি সংকলিত (নেটিভ) কোডে বিদ্যমান নেই। তারা কোনও সংকলক কী নির্দেশাবলী জেনারেট করে তা প্রভাবিত করতে পারে তবে ডেটা অক্ষর বা সংখ্যার প্রতিনিধিত্ব করে কিনা সেগুলি নির্দেশাবলীর নিজেরাই যত্নশীল হয় না।


হার্ডওয়্যারে ভেরিয়েবলের অস্তিত্ব নেই। হার্ডওয়্যারে, আপনার কাছে মেমরির অবস্থান এবং নির্দেশাবলী থাকে যা সেগুলি চালিত করে।

কোনও ভেরিয়েবল কোনও মেমোরির স্থানে ডেটা দেখার জন্য দেখা যায় - আপনি যদি একই স্ক্রিনটি স্কুয়েট করে দেখেন এবং ভিন্নভাবে দেখান (একই ধরণের অবস্থানের সাথে বিভিন্ন ধরণের পৃথক ভেরিয়েবল), একই বাইনারি মানটির আলাদা অর্থ হতে পারে ।

উদাহরণস্বরূপ, বাইট 0x41 ইউটিএফ-8-এনকোডেড অক্ষর হিসাবে ব্যাখ্যা করা যেতে পারে A। এটি একক-বাইট পূর্ণসংখ্যা হিসাবেও ব্যাখ্যা করা যেতে পারে 65। এটি একাধিক বাইট পূর্ণসংখ্যা বা ভাসমান পয়েন্ট সংখ্যা বা একাধিক বাইট অক্ষর এনকোডিংয়ে একটি বাইট হিসাবে ব্যাখ্যা করা যেতে পারে। এটি বিটসেট হতে পারে 0b1000001। একই মেমরি লোকেশনে একই বাইট থেকে সমস্ত। সি ভাষায়, আপনি এই বিভিন্ন ধরণের কাস্টিং দ্বারা এই প্রভাবটি দেখতে পারেন ।

আপনার যখন "বাফার ওভারফ্লো" থাকে, আপনি যখন আপনার সংকলক বা ভাষা আশা করতে পারেন তার সীমার বাইরে আপনি কিছু করছেন। তবে, হার্ডওয়্যারটি যতটা 1 সম্পর্কিত , আপনি মেমরির স্থানে বাইটগুলি (একক বা একাধিক) লিখছেন। একটি মেমরি অবস্থানের "টাইপ" থাকে না। আসলে, হার্ডওয়্যার এমনকি জানে না যে কোনও নির্দিষ্ট সেট বাইট আপনার কোডে একটি অ্যারে বা বাফার তৈরি করে।

আপনার কোডটিতে সেই মেমরিের অবস্থানের যেখানেই আপনি অ্যাক্সেস করবেন, নির্দেশাবলী মূলত সংজ্ঞায়িত হিসাবে চলবে। উদাহরণস্বরূপ যদি তারা সেখানে কোনও সংখ্যা প্রত্যাশা করে থাকে তবে তারা যে কোনও ডেটা বাইটের উপর নির্ভর করে যেমন তারা একটি সংখ্যা they


আপনার উদাহরণটি ব্যবহার করার জন্য, ধরে নেওয়া আপনার intএকটি স্বাক্ষরিত 4-বাইট (32-বিট) পূর্ণসংখ্যা:

+-------------+--------------------------------------------+-----------+
| Source code |                  char[15]                  |    int    |
+-------------+--------------------------------------------------------+
| Memory      |61|61|61|62|62|62|63|63|63|64|64|64|65|65|65|EF|BE|AD|DE|
+-------------+--------------------------------------------------------+

আপনি দেখতে পাচ্ছেন যে intএখনকার মেমরির অবস্থানটি 0xEFBEADDEএকটি বিগ-এন্ডিয়ান সিস্টেম 2 ধরে ধরেছে । এটি স্বাক্ষরিত 32-বিট ইনট -272716322। এখন, আপনি যদি স্বাক্ষরযুক্ত স্বতন্ত্র ( uint) হিসাবে একই মেমরিটি ব্যাখ্যা করেন তবে এটি 4022250974পরিবর্তে হবে। মেমরিতে ঠিক একই ডেটার জন্য অর্থটি আপনি কীভাবে দেখেন তার উপর সম্পূর্ণ নির্ভর করে।


1 এমন কিছু ব্যবস্থা আছে যা আপনাকে মেমরির সুরক্ষিত অঞ্চলে লেখার হাত থেকে বাধা দেয় এবং যদি আপনি এটি করার চেষ্টা করেন তবে আপনার প্রোগ্রামটি ক্রাশ করবে।

2 x86 আসলে ছোট-এন্ডিয়ান, যার অর্থ আপনি পিছনের দিকে আরও বড় মান তৈরি করে বাইটগুলি ব্যাখ্যা করেন। সুতরাং x86 এ পরিবর্তে আপনি 0xDEADBEEFস্বাক্ষরিত -559038737বা স্বাক্ষরবিহীন স্বাক্ষর দিতে চাইবেন 3735928559


সুতরাং 0xdeadbeef, একটি x86 আর্কিটেকচারে, এর দশমিক সমকক্ষের চেয়ে মেমরির কম স্থান গ্রহণ করবে 3735928559?
ড্যারেন স্প্রিংগার

2
@ ডারিএনস্প্রিঞ্জার উভয়ই 4 বাইট মেমরি নিয়ে থাকেন - এগুলি একই 4-বাইট ক্রম। তারা স্মৃতিতে অভিন্ন। আপনি যদি চান তবে আপনি এগুলি সমস্তই মেমোরিতে বেস 2 (বাইনারি) হিসাবে বিবেচনা করতে পারেন। তারপরে, যখন আপনি এগুলি প্রদর্শন করেন (আউটপুটটির জন্য একটি স্ট্রিংয়ে রূপান্তর করেন) আপনি প্রদর্শন করার জন্য একটি বেস চয়ন করতে পারেন - হেক্সটি বেস 16, এবং দশমিক 10 বেস The মেমরির (প্রতিটি অক্ষর একটি পৃথক বাইট হিসাবে)। স্ট্রিং 0xDEADBEEF যেমন মেমরি সংরক্ষণ করা হয় 0x30 0x78 0x44 0x45 0x41 0x44 0x42 0x45 0x45 0x46
বব

5
@ ডারিএনসপ্রিংগার অন্যভাবে বলুন, একটি সংখ্যা একই সংখ্যার সাথে ভিত্তি করেই হোক না কেন হেক্স বাইনারি দেখার সুবিধাজনক (কমপ্যাক্ট) উপায়। শারীরিকভাবে, এটি বাইনারি। দশমিকের মতো মানুষ, তাই আমরা প্রায়শই দশমিক হিসাবে সংখ্যা প্রদর্শন করি। তবে আমরা প্রদর্শনের ধাপে না আসা পর্যন্ত সমস্ত সংখ্যাসূচক ক্রিয়াকলাপ (যুক্ত, বিয়োগ, গুণ, ইত্যাদি) মেমরিতে একই বাইনারি ডেটাতে কাজ করে।
বব

1
"আপনি দেখতে পারেন int- এ স্মৃতিতে অবস্থান এখন 0xEFBEADDE হল" Nitpick: আমি জানি তুমি এই চাননি, কিন্তু শোনাচ্ছে তুমি বলতে চাচ্ছ মত int- এ অবস্থিত মেমরি অবস্থানকে 0xEFBEADDE। সম্ভবত একটি বিট। অন্যথায় এটি একটি দুর্দান্ত উত্তর - আমি বিশেষত "ভিউ" উপমা এবং "স্কুইটিং" ধারণা পছন্দ করি :)
অরবিটে লাইটনেস রেস

নিবন্ধন করুন সম্পাদনা করা হয়েছে।
বব

2

একটি সি দৃষ্টিকোণ থেকে, উত্তরটি হবে "কে জানে? এটি পূর্বনির্ধারিত আচরণ"।

প্রকারভেদগুলি একটি সি ধারণা, হার্ডওয়্যার নয়। তবে আপনার প্রোগ্রামের অপরিজ্ঞাত আচরণ থাকলে সি নিয়মগুলি প্রযোজ্য না, এটি সি স্ট্যান্ডার্ডের অপরিজ্ঞাত আচরণের আক্ষরিক অর্থ। এবং বাফার ওভারফ্লোগুলি এর একটি রূপ।

আমি প্রথমে লিখেছিলাম "সি বিধিগুলি আর প্রয়োগ হয় না", তবে বাস্তবে অপরিজ্ঞাত আচরণটি প্রতারণামূলক। সি নিয়ম এমন কোনও প্রোগ্রামে প্রযোজ্য না যা ভবিষ্যতে অপরিজ্ঞাত আচরণ থাকবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.