$@='NOT ';print"$@CORRUPTED"__DATA__ =®®”print"$@CORRUPTED"__DATA__ =®®”Ê®›~
এই প্রোগ্রামটিতে কয়েকটি বিপথগামী অক্টেট রয়েছে যা বৈধ ইউটিএফ -8 নয়। যেমনটি, এটি উইন্ডোজ -১২২২ এর মতো দেখানো হয়েছে। (ডিফল্টরূপে, যদি একটি পিয়ার ট্রি একটি স্ট্রিং আক্ষরিকরূপে অ-এসসিআইআই অক্টেট দেখতে পায় বা এর মতো এটির একটি অস্বচ্ছ বস্তু হিসাবে বিবেচনা করে এবং এর অক্ষর কোডটি কী তা সম্পর্কে সচেতন হওয়ার বাইরে এটি বোঝার চেষ্টা না করে; এই আচরণ হতে পারে একটি এনকোডিং ঘোষণার মাধ্যমে পরিবর্তন হয়েছে তবে প্রোগ্রামটির একটি নেই So সুতরাং প্রোগ্রামটি যৌক্তিকভাবে "অনির্ধারিত ASCII- সামঞ্জস্যপূর্ণ চরিত্র সেট" এ রয়েছে All সমস্ত নন-এএসসিআইআই অক্টেট যে কোনওভাবেই মন্তব্যে রয়েছে, তাই এটি সত্যিকার অর্থে কিছু আসে না))
ব্যাখ্যা
একটি পিয়ার ট্রি প্রোগ্রামটি চেকসাম করে, দীর্ঘতম সাবস্ট্রিংয়ের সন্ধান করে যা একটি সিআরসি -32 রয়েছে 00000000
। (যদি কোনও টাই থাকে, তবে এটি প্রথমে অষ্টবীক্ষণিকভাবে চয়ন করে)) তারপরে প্রোগ্রামটি শুরু করার সময় এটি ঘোরানো হবে। পরিশেষে, প্রোগ্রামটি পার্লের প্রায়শই সুপারস্টার হিসাবে এমন একটি ভাষা হিসাবে ব্যাখ্যা করা হবে যা পাইথনের মতো একইভাবে কাজ করতে পার্লের কিছু সংজ্ঞায়িত কিছু জিনিস সংজ্ঞায়িত করেছে (এবং কয়েকটি ছোটখাট পরিবর্তন সহ, যেমন print
একটি পিয়ার ট্রিতে একটি চূড়ান্ত নিউলাইন প্রিন্ট করে তবে পার্লে নয়)। এই প্রক্রিয়াটি (এবং সামগ্রিকভাবে ভাষা) বহুগ্লোট এবং বিকিরণ-শক্তকরণ সমস্যার জন্য ডিজাইন করা হয়েছিল ; এটি পূর্বের নয়, তবে এটি অবশ্যই পরবর্তী।
এই প্রোগ্রামে, আমাদের দুটি উল্লেখযোগ্য সাবস্ট্রিং রয়েছে যা CRC-32 থেকে 00000000
; পুরো প্রোগ্রামটি করে এবং তাই print"$@CORRUPTED"__DATA__ =®®
নিজেই করে (যা দুইবার প্রদর্শিত হয়)। এর মতো, যদি প্রোগ্রামটি নিরবচ্ছিন্ন থাকে তবে সেটি সেট $@
হয়ে যাবে NOT
এবং তারপরে এটি মুদ্রণ করবে CORRUPTED
। প্রোগ্রামটি যদি দুর্নীতিগ্রস্থ হয়, তবে সামগ্রিকভাবে প্রোগ্রামটির সিআরসি -32 মিলতে ব্যর্থ হবে, তবে সংক্ষিপ্ত অংশগুলির মধ্যে একটি নিরবচ্ছিন্ন থাকবে। প্রোগ্রামটির শুরুতে যে কোনও একটি ঘোরানো হলে তা কেবল মুদ্রণ করবে CORRUPTED
, যেমন $@
নাল স্ট্রিং হবে।
স্ট্রিংটি একবার মুদ্রিত __DATA__
হয়ে গেলে প্রোগ্রামটির বাকি অংশটি রোধ করতে ব্যবহৃত হয়। (এটি লেখার ক্ষেত্রে এটি আমার মনকে অতিক্রম করে __END__
যা পরিবর্তে ব্যবহার করা যেতে পারে, যা পরিষ্কারভাবে দুটি বাইট সংরক্ষণ করতে পারে But তবে আমি এখন এই সংস্করণটি পোস্ট করতে পারি, কারণ আমি এটি যাচাই করতে অনেক সময় ব্যয় করেছি, এবং একটি পরিবর্তিত সংস্করণ হতে হবে) সিআরসি পরিবর্তনের কারণে পুনরায় যাচাই করা হয়েছে; এবং "পেডলোড" গল্ফ করার জন্য আমি এখনও প্রচুর পরিশ্রম করি নি, তাই আমি দেখতে চাই যে একই সাথে আমি যুক্ত করতে পারি এমন মন্তব্যে কারওরও আরও উন্নতি হয়েছে কিনা। নোট করুন যে #
কোনও চরিত্রটিকে নতুন লাইনে রূপান্তরিত করা হয়েছে এমন পরিস্থিতিতে কাজ করে না))
আপনি হয়ত ভাবছেন যে আমি কীভাবে আমার কোডের সিআরসি -32 প্রথম স্থানে নিয়ন্ত্রণ করতে পারি। এটি সিআরসি -32 সংজ্ঞায়িত পদ্ধতিটির উপর ভিত্তি করে মোটামুটি সহজ গাণিতিক কৌশল: আপনি কোডটির সিআরসি -32 নেন, এটি সামান্য-এন্ডিয়ান ক্রমে লিখুন (সাধারণত বৌদ্ধ ক্রমের বিপরীত যা সাধারণত সিআরসি -32 গণনা দ্বারা ব্যবহৃত হয়) প্রোগ্রাম), এবং এক্সওআর সহ 9D 0A D9 6D
। তারপরে আপনি এটি প্রোগ্রামে সংযোজন করুন এবং আপনার একটি সিআরসি -32-এর 0 সহ একটি প্রোগ্রাম থাকবে (সম্ভবত সহজ উদাহরণ হিসাবে নাল স্ট্রিংটিতে 0 এর একটি সিআরসি -32 রয়েছে, সুতরাং 0 9D 0A D9 6D
এর একটি সিআরসি -32ও রয়েছে ।)
প্রতিপাদন
একটি পিয়ার ট্রি বেশিরভাগ প্রকারের মিউটেশনগুলি পরিচালনা করতে পারে তবে আমি ধরে নিচ্ছি "পরিবর্তিত" অর্থ "একটি স্বেচ্ছাসেবীর সাথে প্রতিস্থাপন"। এটি তাত্ত্বিকভাবে সম্ভব (যদিও এই সংক্ষেপে কোনও প্রোগ্রামে সম্ভাবনা নেই) যে কোথাও একটি হ্যাশ সংঘর্ষ হতে পারে যা ভুল প্রোগ্রামের দিকে পরিচালিত করতে পারে, সুতরাং আমাকে ব্রুট ফোর্সের মাধ্যমে পরীক্ষা করে দেখতে হয়েছিল যে সমস্ত সম্ভাব্য অষ্টেটের বিকল্পটি প্রোগ্রামটি সঠিকভাবে কাজ করতে ছাড়বে। এখানে আমি যাচ্ছি যাচাই স্ক্রিপ্ট (পার্ল লিখিত):
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! ";