সি (x86_64), 11, 30, 34, বা 34 + 15 = 49 বাইট
main[]="/";
c=6;main(){((void(*)())&c)();}
main(){int c=6;((void(*)())&c)();}
আমি বেশ কয়েকটি সমাধান জমা দিয়েছি যা SIGILLবিভিন্ন উপায়ে ফেলার জন্য লাইব্রেরি ফাংশন ব্যবহার করে , তবে যুক্তিযুক্তভাবে এটি প্রতারণা করছে, এতে লাইব্রেরি ফাংশনটি সমস্যার সমাধান করে। এখানে এমন অনেকগুলি সমাধান রয়েছে যা কোনও লাইব্রেরি ফাংশন ব্যবহার করে না এবং অপারেটিং সিস্টেমটি আপনাকে যেখানে নির্বাহযোগ্য কোড কার্যকর করতে দিতে রাজি তা নিয়ে বিভিন্ন ধরণের অনুমান করা যায়। (এখানে কনস্ট্যান্টগুলি x86_64 এর জন্য বেছে নেওয়া হয়েছে, তবে অবৈধ নির্দেশাবলী রয়েছে এমন বেশিরভাগ প্রসেসরের কাজের সমাধান পেতে আপনি এগুলি পরিবর্তন করতে পারেন))
06মেশিন কোডের সর্বনিম্ন সংখ্যাযুক্ত বাইট যা কোনও x86_64 প্রসেসরের কোনও সংজ্ঞায়িত নির্দেশের সাথে মেলে না। সুতরাং আমাদের যা করতে হবে তা হ'ল এটি কার্যকর করা। (বিকল্পভাবে, 2Fএটি অপরিজ্ঞাতও রয়েছে এবং এটি একটি একক মুদ্রণযোগ্য এএসসিআইআই চরিত্রের সাথেও মিলবে)) এর মধ্যে দুটিওই সর্বদা অপরিবর্তিত থাকার গ্যারান্টিযুক্ত নয়, তবে সেগুলি আজকের হিসাবে সংজ্ঞায়িত হয়নি।
এখানে প্রথম প্রোগ্রামটি কেবল 2Fপঠনযোগ্য ডেটা বিভাগ থেকে সম্পাদন করে । সর্বাধিক linkers থেকে একটি কাজ লাফ উত্পাদক করতে সক্ষম হয় না .textকরতে .rodata(বা তাদের অপারেটিং সিস্টেম এর সমতুল্য) এটা এমন কিছু বিষয় যা কখনও একটি সঠিকভাবে segmented প্রোগ্রামে দরকারী হবে না হিসেবে; আমি এমন কোনও অপারেটিং সিস্টেম খুঁজে পাইনি যার উপর এটি এখনও কাজ করে। আপনাকে এই সত্যটিও মঞ্জুর করতে হবে যে অনেক সংস্থাপকগণ প্রশ্নের মধ্যে থাকা স্ট্রিংকে একটি প্রশস্ত স্ট্রিং হিসাবে চান, যার জন্য অতিরিক্ত প্রয়োজনL; আমি ধরে নিচ্ছি যে এটি যে কোনও অপারেটিং সিস্টেমে কাজ করে সেগুলির বিষয়ে বেশ পুরানো দৃষ্টিভঙ্গি রয়েছে এবং এটি পূর্বনির্ধারিতভাবে সি -94 প্রাকের জন্য তৈরি করছে। এটি সম্ভব যে এই প্রোগ্রামটি কোথাও কাজ করে না, তবে এটিও সম্ভব যে এই প্রোগ্রামটি কোথাও কাজ করে এবং এইভাবে আমি আরও সন্দেহজনক-থেকে-কম-সন্দেহজনক সম্ভাব্য উত্তরের এই সংগ্রহে এটি তালিকাবদ্ধ করছি। (আমি এই উত্তরটি পোস্ট করার পরে, ডেনিস আড্ডায় সম্ভাবনার কথাও উল্লেখ করেছিলেন main[]={6}, যা একই দৈর্ঘ্য, এবং যা চরিত্রের প্রস্থের সমস্যাগুলির মধ্যে পড়ে না এবং এমনকি সম্ভাবনার দিকেও ইঙ্গিত দেয় main=6; আমি যুক্তিযুক্তভাবে এই উত্তরগুলি দাবি করতে পারি না) আমার, যেমন আমি সেগুলি নিজেই ভাবি নি))
এখানে দ্বিতীয় প্রোগ্রামটি 06পঠন-লিখনের ডেটা বিভাগ থেকে সম্পাদন করে । বেশিরভাগ অপারেটিং সিস্টেমে এটি বিভাগকরণের ত্রুটি ঘটায়, কারণ লিখনযোগ্য ডেটা বিভাগগুলিকে খারাপ ডিজাইনের ত্রুটি হিসাবে বিবেচনা করা হয় যা সম্ভবত শোষণকে সম্ভাব্য করে তোলে। যদিও এটি সর্বদা হয় নি, তাই এটি সম্ভবত লিনাক্সের যথেষ্ট পুরানো সংস্করণে কাজ করে তবে আমি এটি সহজে পরীক্ষা করতে পারি না।
তৃতীয় প্রোগ্রামটি 06স্ট্যাক থেকে কার্যকর করা হয়। আবার এটি আজকাল বিভাজন ত্রুটির কারণ হয়ে দাঁড়ায়, কারণ সুরক্ষার কারণে স্ট্যাকটি সাধারণত অলিখনযোগ্য হিসাবে শ্রেণিবদ্ধ করা হয়। আমি যে লিঙ্কার ডকুমেন্টেশনটি দেখেছি তার থেকে বোঝা যায় যে এটি স্ট্যাক থেকে মৃত্যুদন্ড কার্যকর করার জন্য আইনী হিসাবে ব্যবহৃত হত (পূর্ববর্তী দুটি মামলার বিপরীতে এটি কখনও কখনও উপকারী হয়), তবে আমি এটি পরীক্ষা করতে না পারলেও আমি নিশ্চিত যে এর কিছু আছে লিনাক্সের সংস্করণ (এবং সম্ভবত অন্যান্য অপারেটিং সিস্টেম) যার উপর এটি কাজ করে।
অবশেষে, আপনি যদি -Wl,-z,execstack(15 বাইট জরিমানা) দেন gcc( ldব্যাকএন্ডের অংশ হিসাবে GNU ব্যবহার করে ), এটি স্পষ্টভাবে এক্সিকিউটেবল স্ট্যাক সুরক্ষা বন্ধ করে দেবে, তৃতীয় প্রোগ্রামটি কাজ করার অনুমতি দেয় এবং প্রত্যাশার মতো একটি অবৈধ অপারেশন সংকেত দেয়। কাজ করার জন্য আমি এই 49-বাইট সংস্করণটি পরীক্ষা করেছি এবং যাচাই করেছি । (ডেনিস আড্ডায় উল্লেখ করেছেন যে এই বিকল্পটি স্পষ্টতই কাজ করে main=6যা 6 + 15 এর স্কোর দেবে pretty আমি স্পষ্টভাবে অবাক হয়েছি যে এই কাজটি করে, কারণ 6 স্পষ্টতই স্ট্যাকের উপরে নেই; লিঙ্ক বিকল্পটি দৃশ্যত এর চেয়ে আরও বেশি কিছু করে এর নাম থেকে বোঝা যাচ্ছে।)
raise(SIGILL)?