দুষ্ট কোডটি লুকান - ডিরেক্টরি গাছের যে কোনও জায়গায় [স্ট্রাকচার্ড] প্রদত্ত স্ট্রিংযুক্ত ফাইলগুলি মুদ্রণ করুন


17

এই ধাঁধার মূল বিষয় হল একটি প্রোগ্রামে কীভাবে একটি দূষিত কোড লুকানো এবং আবিষ্কার করা যায় তা শিখতে হবে।

একজন ব্যক্তি প্রশ্ন করছেন:

Plz আমাকে কিছু কোড দেয় যে আমি কীভাবে একটি ফাইল অনুসন্ধান করতে পারি তা বর্তমান ডিরেক্টরিতে বা এর উপ-ডিরেক্টরিতে থাকতে পারে।

(এটি একটি সত্যিকারের প্রশ্নের একটি রূপ যা আমি একটি সাইটে পোস্ট দেখেছি))

আরও সুনির্দিষ্ট হতে হবে: ওপি আপনাকে এমন একটি প্রোগ্রাম লিখতে চায় যা একটি স্ট্রিং এবং ডিরেক্টরি গ্রহণ করে। এটি ডিরেক্টরিতে সমস্ত ফাইলকে অতিক্রম করবে এবং এর সমস্ত উপ-ডিরেক্টরিকে পুনরাবৃত্তি করবে। প্রতিটি ফাইলের জন্য এটি ফাইলের স্ট্রিং রয়েছে কিনা তা যাচাই করবে এবং যদি এটি হয় তবে ফাইলটির নাম মুদ্রণ করবে। (আপনি যদি চান তবে প্রোগ্রামটি মূল লক্ষ্যের সাথে প্রাসঙ্গিকভাবে অতিরিক্ত বৈশিষ্ট্য থাকতে পারে)) ট্র্যাভারসাল ক্রমের কোনও প্রয়োজন নেই।

তবে এই ধাঁধার মূল কাজটি হ'ল প্রোগ্রামটির অতিরিক্ত কোডটি আড়াল করা যা সেই ব্যক্তিকে বোকা বানাবে যা তার ব্যবহারকারীদের / সহকর্মী / বস / ইত্যাদির চোখে প্রোগ্রামটি চেয়েছে। উদাহরণস্বরূপ, কোনও অবমাননাকর লেখাটি মুদ্রণ করুন, যেমন: প্রোগ্রামটির লেখক কীভাবে প্রোগ্রাম করবেন তা জানেন না, তার ডিপ্লোমা ফিরিয়ে দেওয়া এবং বরখাস্ত করা উচিত। সৃজনশীল হও.

নিয়মাবলী:

  • সমাধান অবশ্যই ক্ষতিকারক হবে না (অবশ্যই ওপি বোকা বানানো বাদে)। এটি অবশ্যই শেষ ব্যবহারকারীদের জন্য কোনও অপরিবর্তনীয় ক্ষতি করতে হবে না (পছন্দ মতো কোনও জিনিস নয় rm -rf)! এই জাতীয় সমাধান অযোগ্য ঘোষণা করা হবে।
  • ট্রোলিংয়ের জিনিসগুলি লুকিয়ে রাখা উচিত যাতে ওপি সহজে এটি খুঁজে না পায়।
  • আপনি ওপিকে ট্রোল করছেন তা স্পষ্ট হওয়া উচিত নয়। কোডটি খাঁটি দেখা উচিত।
  • সমাধানটি কীভাবে ওপিকে ট্রোল করে তা একটি যথাযথ ব্যাখ্যা দিয়ে আসতে হবে যাতে প্রত্যেকে আপনার সমাধান থেকে কিছু শিখতে পারে। ব্যাখ্যাটি কোনও লুকানো-অবধি-আপনি ক্লিক করা পাঠ্যের মধ্যে লুকানো উচিত (স্পোলার) । বিচার করার সময়, ব্যাখ্যাটি না দেখে ট্রলিংটি আবিষ্কার করার চেষ্টা করুন এবং যা আবিষ্কার করা শক্ত তাদের পক্ষে ভোট দিন।
  • তিনি (গুলি) কয়েকবার কোড চালানোর চেষ্টা করলে ওপি থেকে ট্রোলিংটি আড়াল করার চেষ্টা করুন। সম্ভবত কোনও নির্দিষ্ট তারিখের পরে কেবল ট্রলিং শুরু করুন, বা এমন কিছু শর্তে যে কোনও opালু প্রোগ্রামার পরীক্ষা করে না। সৃজনশীল হন এবং কৌশলটি ব্যাখ্যা করতে ভুলবেন না।
  • শুধু একটি স্ক্রিপ্ট যেমন বিদ্যমান সরঞ্জাম ব্যবহার তৈরি করবেন না grepবা find। প্রোগ্রামটি স্ক্র্যাচ থেকে লিখুন। গ্রন্থাগারগুলি এড়ানো ভাল এবং নিম্ন-স্তরের কলগুলি বেশি পছন্দ করুন - এটি কোডটিকে আরও জটিল করে তুলবে এবং সেখানে মন্দ জিনিসগুলি আড়াল করার সুযোগ দেয়।

এটি একটি । উপরোক্ত বিষয়গুলি বিচার করুন


6
কীভাবে "তার ব্যবহারকারী / সহকর্মী / মনিবদের চোখে প্রোগ্রামটির জন্য জিজ্ঞাসা করা ব্যক্তিকে বোকা বানাবে" " এবং "তার ডিপ্লোমা ফিরিয়ে দিয়ে বরখাস্ত করা উচিত" " "সমাধানটি ক্ষতিকারক হবে না, এর ব্যবহারকারীদের কোনও ক্ষতি করতে হবে না" সহ বর্গক্ষেত্র?
এমরি 21

আমি প্রশংসা করি যে আপনি "ট্রোলিং" প্রশ্নের বেশিরভাগ পোস্টারের চেয়ে বেশি প্রচেষ্টা করেছেন, তবে এই সাইটের সমস্ত প্রশ্নের একটি স্পষ্ট স্পেসিফিকেশন থাকতে হবে এবং "আমি কীভাবে একটি ফাইল সন্ধান করতে পারি বর্তমান ডিরেক্টরিতে থাকতে পারে" যে মানটির সাথে মিল নেই) is । (কোনও কোড-ট্রোলিংয়ের প্রশ্নটি সেই মানটি পূরণ করতে পারে কিনা তা পৃথক সমস্যা )।
পিটার টেলর

@ পিটারটেলর আমি আরও একটি সুনির্দিষ্ট অ্যাসাইনমেন্ট দেওয়ার চেষ্টা করেছি। আপনার আরও নির্দিষ্ট পরামর্শ থাকলে আমি তাদের প্রশংসা করব।
পেটর পুদলক

2
@ Emory কোডার ব্যবহারকারী নয়। ক্লায়েন্টকে প্রভাবিত না করেই তার সহকর্মীদের সামনে কোডারকে অবমাননা করা সম্ভব।
ক্রંચার

3
আমি এই প্রশ্নটিকে অফ-টপিক হিসাবে বন্ধ করার পক্ষে ভোট দিচ্ছি কারণ এটি নিম্নমুখী
এরিক আউটগল্ফার

উত্তর:


42

এখানে আমার সমাধানটি (পার্লে):

#! /usr/bin/perl -w

use Cwd 'abs_path';

# Check the command line arguments
my $F = abs_path($0);
if ($#ARGV!=1) {
    print "Usage: ".$F." <dir> <expr>\n";
    exit(1);
}

# The first argument is the directory
my @u = (abs_path($ARGV[0]));
# Check for trailing slash
my $c = substr $u[0], -1, 0;


# Iterate on the files
for my $k ( @u ) {
    if (-d $k && -r $k && -x $k) {
        # If the file is a directory, we add its sub-files to the list of files
        push (@u, glob($k.($c eq "/" ? "*" : "/*")));
    } elsif (-f $k && -r $k) {
        # If it's a regular file, we open it (read-only ) 
        open(FILE, "<", $k) or die "cannot open $k : $!";
        # Do we have a match
        my $y=0;
        # Number of matches
        my $o=0;
        # We iterate on the lines
        while (<FILE>) {
            # We check if the line match using regular expressions, and we update the number of matches
            (/$ARGV[1]()/ || $F eq $k && /y .([F c-y])/) && (($c,$y,$o)=($c.$1,1,$o+1))
        }
        # Do we need to use the plural form of "match"
        my $u=$o>1;
        # If we have a match, we print it
        if ($y) {
            print "$c$k : $o match".($u?"es\n":"\n");
        }
        # Close the file (opened read-only ) 
        close(FILE) or die "cannot close $k : $!";
    }
}

প্রোগ্রামটির প্রথম যুক্তিটি হ'ল ডিরেক্টরি এবং দ্বিতীয় যুক্তিটি আমরা খুঁজছি এমন স্ট্রিং। প্রোগ্রামটি প্রতিটি ফাইলে মিলের সংখ্যাও দেখায়।

"ভিজিএ" কীভাবে / ইত্যাদিতে অনুসন্ধান করবেন তা এখানে রয়েছে:

$ ./mygrep.pl /etc VGA
/etc/alternatives/mplayer : 7 matches
/etc/alternatives/pinentry : 1 match
/etc/alternatives/pinentry-x11 : 1 match
/etc/alternatives/www-browser : 1 match
/etc/bumblebee/xorg.conf.nouveau : 2 matches
/etc/bumblebee/xorg.conf.nvidia : 2 matches
/etc/default/console-setup : 2 matches
/etc/htdig/english.0 : 1 match
/etc/X11/X : 6 matches
/etc/laptop-mode/conf.d/video-out.conf : 3 matches
$

এবং এখন, কৌশলটি এখানে:

প্রোগ্রামটি যতক্ষণ না ফাইলগুলিতে নিজের মুখোমুখি হয় না ঠিক ততক্ষণ কাজ করে। এটি নিজের মুখোমুখি হওয়ার সাথে সাথে এটি উন্মাদনার সাথে পাওয়া প্রতিটি ফাইলের উপসর্গ শুরু করে। চলুন বর্তমান ডিরেক্টরিতে কিছু ফাইল অনুলিপি করুন এবং আবার চেষ্টা করুন:

p সিপি / ইত্যাদি / ডিফল্ট / কনসোল-সেটআপ /etc/bumblebee/xorg.conf.nouveau /etc/bumblebee/xorg.conf.nvidia /etc/htdig/english.0 ./
/ ./mygrep.pl ./ VGA
/ টিএমপি / মাইগ্রিপ / কনসোল-সেটআপ: 2 টি ম্যাচ
/tmp/mygrep/english.0: 1 ম্যাচ
আপনি /tmp/mygrep/mygrep.pl: 9 ম্যাচ
আপনি /tmp/mygrep/xorg.conf.nouveau: 2 ম্যাচ
আপনি /tmp/mygrep/xorg.conf.nvidia: 2 ম্যাচ
$
এটি এই কোডের কারণে:
$ এফ একিউ $ কে && / y। ([এফ সাই]] /
এটি বর্তমান ফাইলটি চলমান প্রোগ্রাম কিনা তা পরীক্ষা করে এবং এটি যদি হয় তবে এটি প্রোগ্রামের কিছু অংশ একটি রেজিপ এক্সপ্যাক্ট দিয়ে বের করে এবং এটি দিয়ে এটি $ সিতে প্রভাবিত করে
$ সি = $ সি। $ 1
রিজেজেপ দ্বারা কী বের করা হয় তা হ'ল ভেরিয়েবল ডিক্লেয়ারেশন (ভেরিয়েবলের নাম দেওয়া হয় $ এফ, @ ইউ, $ সি, $ কে, $ y, $ ও,। U) এবং মন্তব্যগুলির দুটি স্থান s প্রোগ্রামটি তুলনামূলকভাবে কম হলেও, এটি গোপন রাখতে আমার এটি করতে হয়েছিল।


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