पता लगाएँ कि क्या आपके कार्यक्रम को उत्परिवर्तित किया गया है


16

एक प्रोग्राम लिखें जो बिना किसी त्रुटि के समाप्त हो जाए।

यदि किसी भी बाइट को किसी अन्य बाइट द्वारा प्रतिस्थापित किया जाता है तो प्रोग्राम को आउटपुट देना चाहिए

CORRUPTED
  • फ़ाइल से अपना स्रोत कोड न पढ़ें
  • आपके प्रोग्राम को कोई अन्य आउटपुट नहीं देना चाहिए

यह इसलिए बाइट्स जीत में सबसे छोटा जवाब है।

संपादित करें: "आवश्यक नहीं" हटा दिया गया


विकिरण-सख्त के पास समान प्रश्नों का एक मेजबान है, लेकिन मुझे ऐसा कोई नहीं मिला है जो इस तरह से काफी हैं।
FryAmTheEggman

7
डाउनवोटर्स के लिए: मुझे संदेह है कि यह संभव है (यदि बहुत मुश्किल है), यदि आप सही भाषा चुनते हैं। कृपया प्रश्न को बंद या डिलीट न करें जब तक आपको नहीं लगता कि असंभव होने के अलावा इसके साथ कुछ गड़बड़ है।

7
क्या बदला मतलब? एक और बाइट द्वारा प्रतिस्थापित?
डेनिस

4
@ ais523 FWIW मैंने चुनौती को कम कर दिया क्योंकि यह जल्दबाजी में लिखा हुआ लगता है, इसलिए नहीं कि मुझे लगता है कि यह बहुत कठिन है।
डेनिस

5
ऐसा नहीं है कि कुछ भी स्पष्ट नहीं है, लेकिन इसे स्पष्ट किया जा सकता है । यदि आप एक पूर्ण कार्यक्रम की आवश्यकता है, तो स्पष्ट कर सकते हैं कि एक उदाहरण कार्यक्रम जोड़ें और सभी संभावित संशोधनों का वर्णन करें, उल्लेख करें कि एकल-बाइट प्रतिस्थापन एक UTF-8 एन्कोडेड फ़ाइल को कैसे प्रभावित करेगा, एक स्क्रिप्ट जोड़ें जो सबमिशन का परीक्षण करने के लिए उपयोग किया जा सकता है, उस कार्यक्रम का उल्लेख करें इनपुट आदि नहीं लेना चाहिए
डेनिस

जवाबों:


30

एक नाशपाती का पेड़ , 76 बाइट्स

$@='NOT ';print"$@CORRUPTED"__DATA__ =®®”print"$@CORRUPTED"__DATA__ =®®”Ê®›~

इस कार्यक्रम में कुछ आवारा ओकटेट्स शामिल हैं जो UTF-8 मान्य नहीं हैं। जैसे, यह दिखाया गया है कि यह विंडोज -1252 में दिखता है। (डिफ़ॉल्ट रूप से, यदि एक नाशपाती का पेड़ एक स्ट्रिंग-शाब्दिक में एक गैर-एएससीआईआई ऑक्टेट देखता है या जैसे वह इसे एक अपारदर्शी वस्तु के रूप में मानता है और यह समझने की कोशिश नहीं करता है कि इसका चरित्र कोड क्या है, इसके बारे में जागरूक होने से परे; यह व्यवहार हो सकता है; एन्कोडिंग घोषणा के माध्यम से बदल गया है, लेकिन कार्यक्रम में एक भी नहीं है। इसलिए कार्यक्रम तार्किक रूप से "अनिर्दिष्ट ASCII- संगत वर्ण सेट" है। सभी गैर-ASCII ओकटेट वैसे भी टिप्पणियों में हैं, इसलिए यह वास्तव में कोई फर्क नहीं पड़ता।)

व्याख्या

एक नाशपाती ट्री कार्यक्रम की जाँच करता है, जिसमें सबसे लंबे समय तक प्रतिस्थापन की तलाश है जिसमें सीआरसी -32 है 00000000 । (यदि कोई टाई है, तो वह पहले ऑक्टेबेटिक रूप से चुनता है।) फिर प्रोग्राम को शुरू में डालने के लिए घुमाया जाता है। अंत में, इस कार्यक्रम की व्याख्या एक ऐसी भाषा के रूप में की जाती है, जो लगभग पर्ल का सुपरसेट है, कुछ चीजों को परिभाषित करती है, जो पर्ल में अपरिभाषित हैं, जैसे कि पायथन में (और कुछ मामूली बदलावों के साथ, जैसे printकि ए पीयर ट्री में एक अंतिम न्यूलाइन प्रिंट करता है। लेकिन पर्ल में नहीं)। यह तंत्र (और समग्र रूप से भाषा) और समस्याओं के लिए डिज़ाइन किया गया था ; यह पूर्व नहीं है, लेकिन यह निश्चित रूप से उत्तरार्द्ध है।

इस कार्यक्रम में, हमारे पास दो उल्लेखनीय विकल्प हैं जो सीआरसी -32 से 00000000; पूरा कार्यक्रम करता है, और ऐसा print"$@CORRUPTED"__DATA__ =®®खुद से होता है (जो दो बार दिखाई देता है)। जैसे, यदि प्रोग्राम अनियंत्रित है, तो यह सेट $@हो जाएगा NOT और फिर उसके बाद प्रिंट होगा CORRUPTED। यदि प्रोग्राम दूषित है, तो प्रोग्राम का CRC-32 पूर्ण रूप से मिलान करने में विफल रहेगा, लेकिन कम वर्गों में से एक अनियंत्रित रहेगा। जो भी कार्यक्रम की शुरुआत के लिए घुमाया जाएगा CORRUPTED, वह सिर्फ प्रिंट करेगा , जैसा कि$@ करेगा कि नल स्ट्रिंग होगा।

एक बार स्ट्रिंग को प्रिंट कर लिया __DATA__जाता है , इसका उपयोग बाकी प्रोग्राम को चलाने से रोकने के लिए किया जाता है। (यह मेरे दिमाग को यह लिखते हुए पार करता है कि __END__इसका उपयोग किया जा सकता है, जो स्पष्ट रूप से दो बाइट्स को बचाएगा। लेकिन मैं अब इस संस्करण को भी पोस्ट कर सकता हूं, क्योंकि मैंने इसे सत्यापित करने के लिए समय का एक गुच्छा बिताया है, और एक संशोधित संस्करण होना चाहिए। सीआरसी परिवर्तनों के कारण पुन: सत्यापित किया गया है, और मैंने अभी तक "पेलोड" को गोल्फ में डालने का एक बड़ा प्रयास नहीं किया है, इसलिए मैं यह देखना चाहता हूं कि क्या किसी की टिप्पणियों में अन्य सुधार हैं जिन्हें मैं एक ही समय में शामिल कर सकता हूं। ध्यान दें कि# उस स्थिति में काम नहीं करता है जहां एक चरित्र एक नई पंक्ति में दूषित है।)

आप सोच रहे होंगे कि मैंने अपने कोड के CRC-32 को पहली बार में कैसे नियंत्रित किया। यह एक बहुत ही सरल गणितीय चाल है, जो कि CRC-32 को परिभाषित करने के तरीके पर आधारित है: आप कोड के CRC-32 को लेते हैं, इसे थोड़ा-एंडियन क्रम में लिखते हैं (बाइट क्रम के विपरीत जो सामान्य रूप से CRC-32 गणना द्वारा उपयोग किया जाता है) कार्यक्रम), और XOR के साथ 9D 0A D9 6D। फिर आप उस कार्यक्रम में जाते हैं, और आपके पास एक कार्यक्रम होगा सीआरसी -32 का 0. (जैसा कि सबसे सरल उदाहरण संभव है, अशक्त स्ट्रिंग में 0 का सीआरसी -32 है, इस प्रकार)9D 0A D9 6D भी है। ।)

सत्यापन

एक नाशपाती का पेड़ अधिकांश प्रकार के उत्परिवर्तन को संभाल सकता है, लेकिन मैं "परिवर्तित" का अर्थ "एक मनमाना ऑक्टेट के साथ प्रतिस्थापित" कर रहा हूं। यह सैद्धांतिक रूप से संभव है (हालांकि इस कार्यक्रम में इस कमी की संभावना नहीं है) कि कहीं न कहीं एक हैश टक्कर हो सकती है जिससे गलत प्रोग्राम चल रहा है, इसलिए मुझे ब्रूट फोर्स के माध्यम से जांचना पड़ा कि सभी संभावित ऑक्टेट प्रतिस्थापन प्रोग्राम को सही तरीके से काम करना छोड़ देंगे। यहाँ सत्यापन स्क्रिप्ट (पर्ल में लिखित) है जिसका मैंने उपयोग किया है:

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
undef $/;
$| = 1;
my $program = <>;
for my $x (0 .. (length $program - 1)) {
    for my $a (0 .. 255) {
        print "$x $a    \r";
        my $p = $program;
        substr $p, $x, 1, chr $a;
        $p eq $program and next;
        alarm 4;
        run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
        if ($out ne "CORRUPTED\n") {
            print "Failed mutating $x to $a\n";
            print "Output: {{{\n$out}}}\n";
            print "Errors: {{{\n$err}}}\n";
            exit;
        }
    }
}

say "All OK!    ";

एक n -bit CRC n बिट्स की तुलना में लंबे समय तक फटने वाली किसी एक त्रुटि का पता नहीं लगाएगा। दिए गए मामले में हैश टकराव असंभव है, इसके लिए ब्रूट-फोर्स सत्यापन की कोई आवश्यकता नहीं है।
रेनर पी।

@ RainerP।: मुझे पता है कि एक उत्परिवर्तन उन भागों के लिए सीआरसी को रोक देगा, जो मूल रूप से 0 मिलान के सीआरसी हैं। हालाँकि, इस बात की संभावना है कि यह कोड का एक नया विकल्प प्रस्तुत कर सकता है जिसमें 0 का सीआरसी है; ब्रूट-फोर्सिंग का उद्देश्य यह सुनिश्चित करना है कि ऐसा नहीं हुआ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.