सी (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
अपरिभाषित भी है, और एक मुद्रण योग्य ASCII वर्ण से मेल खाती है।) इनमें से किसी की भी हमेशा अपरिभाषित होने की गारंटी नहीं है, लेकिन वे आज तक परिभाषित नहीं हैं।
यहां पहला कार्यक्रम 2F
केवल-पढ़ने वाले डेटा खंड से निष्पादित होता है। अधिकांश linkers से एक काम कूद उत्पादन करने में सक्षम नहीं हैं .text
करने के लिए .rodata
(या उनके ओएस समकक्ष) यह कुछ है कि कभी भी एक सही ढंग से खंडित कार्यक्रम में उपयोगी होगा नहीं है के रूप में; मुझे एक ऑपरेटिंग सिस्टम नहीं मिला है जिस पर यह अभी तक काम करता है। आपको इस तथ्य के लिए भी अनुमति देनी होगी कि कई संकलक प्रश्न में स्ट्रिंग को एक विस्तृत स्ट्रिंग चाहते हैं, जिसके लिए एक अतिरिक्त की आवश्यकता होगीL
; मैं यह मान रहा हूं कि जिस भी ऑपरेटिंग सिस्टम पर यह काम करता है, उसके पास चीजों के बारे में काफी पुराना दृष्टिकोण है, और इस प्रकार डिफ़ॉल्ट रूप से पूर्व-C94 मानक के लिए निर्माण हो रहा है। यह संभव है कि कहीं भी यह कार्यक्रम काम नहीं करता है, लेकिन यह भी संभव है कि कहीं न कहीं यह कार्यक्रम काम करता है, और इस तरह मैं इसे अधिक-संदिग्ध-से-कम-संदिग्ध संभावनाओं के इस संग्रह में सूचीबद्ध कर रहा हूं। (जब मैंने इस उत्तर को पोस्ट किया, तो डेनिस ने main[]={6}
चैट में संभावना का भी उल्लेख किया , जो समान लंबाई है, और जो चरित्र की चौड़ाई के साथ समस्याओं में नहीं चलता है, और यहां तक कि संभावित के लिए संकेत दिया है main=6
; मैं इन उत्तरों के रूप में यथोचित दावा नहीं कर सकता हूं; मेरा, जैसा कि मैंने खुद उनके बारे में नहीं सोचा था।)
यहां दूसरा प्रोग्राम 06
रीड-राइट डेटा सेगमेंट से निष्पादित होता है। अधिकांश ऑपरेटिंग सिस्टम पर यह एक विभाजन दोष का कारण बनेगा, क्योंकि लिखने योग्य डेटा सेगमेंट को एक खराब डिजाइन दोष माना जाता है जो शोषण की संभावना बनाता है। यह हमेशा मामला नहीं रहा है, हालांकि, यह शायद लिनक्स के एक पर्याप्त पुराने संस्करण पर काम करता है, लेकिन मैं आसानी से इसका परीक्षण नहीं कर सकता।
तीसरा कार्यक्रम 06
स्टैक से निष्पादित होता है। फिर, यह आजकल एक विभाजन दोष का कारण बनता है, क्योंकि स्टैक को आमतौर पर सुरक्षा कारणों से गैर-लिखित के रूप में वर्गीकृत किया जाता है। लिंकर डॉक्यूमेंटेशन मैंने बहुत हद तक देखा है कि यह स्टैक से निष्पादित करने के लिए कानूनी हुआ करता था (पूर्ववर्ती दो मामलों के विपरीत, ऐसा करना कभी-कभार उपयोगी होता है), इसलिए हालांकि मैं इसका परीक्षण नहीं कर सकता, मुझे पूरा यकीन है कि कुछ है लिनक्स का संस्करण (और शायद अन्य ऑपरेटिंग सिस्टम) जिस पर यह काम करता है।
अंत में, यदि आप -Wl,-z,execstack
(15 बाइट पेनल्टी) gcc
(यदि बैक ld
के हिस्से के रूप में जीएनयू का उपयोग करते हैं) देते हैं, तो यह स्पष्ट रूप से निष्पादन योग्य स्टैक संरक्षण को बंद कर देगा, तीसरे कार्यक्रम को काम करने की अनुमति देता है और उम्मीद के मुताबिक एक अवैध संचालन संकेत देता है। मैं है परीक्षण किया है और यह 49-बाइट काम करने के लिए संस्करण को सत्यापित। (डेनिस चैट में उल्लेख करता है कि यह विकल्प स्पष्ट रूप से काम करता है main=6
, जो 6 + 15 का स्कोर देगा। मुझे बहुत आश्चर्य है कि यह काम करता है, यह देखते हुए कि 6 स्थिर रूप से स्टैक पर नहीं है; लिंक विकल्प स्पष्ट रूप से अधिक है; इसके नाम से पता चलता है।)
raise(SIGILL)
?