邪悪なコードを非表示-ディレクトリツリーの任意の場所に特定の文字列を含むファイルを印刷する[非公開]


17

このパズルのポイントは、悪意のあるコードがプログラム内でどのように隠され、発見されるかを学ぶことです。

人が質問をしています:

Plzでは、現在のディレクトリまたはそのサブディレクトリにファイルを検索する方法があるコードを提供しています。

(これは、1つのサイトに投稿した実際の質問の変形です。)

具体的には、OPは文字列とディレクトリを受け入れるプログラムを作成することを望んでいます。ディレクトリ内のすべてのファイルと、そのすべてのサブディレクトリを再帰的に走査します。各ファイルについて、ファイルに文字列が含まれているかどうかを確認し、含まれている場合はファイルの名前を出力します。(プログラムは、必要に応じて、主な目的に関連する限り、追加の機能を持つことができます。)走査順序に要件はありません。

ただし、このパズルの主なタスクは、ユーザー/同僚/上司などの目でプログラムを要求する人を馬鹿にする追加コードをプログラムに隠すことです。たとえば、次のようなある時点で屈辱的なテキストを印刷します。プログラムの作成者はプログラミングの方法がわからないため、卒業証書を返して解雇される必要があります。クリエイティブに。

ルール:

  • ソリューションは有害であってはなりません(もちろん、OPをだますことを除いて)。エンドユーザーに不可逆的な損害を与えてはなりません(のようなものはありませんrm -rf)!このようなソリューションは失格となります。
  • OPが簡単に見つけられないように、トローリングアイテムは非表示にする必要があります。
  • OPをトローリングしていることは明らかではありません。コードは本物に見えるはずです。
  • 解決策は、必要がありますが付属して適切な誰もがあなたのソリューションから何かを学ぶことができるように、それはOPのトロール方法の説明。説明は、クリックするまで非表示のテキスト(ネタバレ)で非表示にする必要があります。判断するときは、説明を見ずにトローリングを発見し、発見が難しいものに投票してください。
  • また、コードを数回実行しようとする場合は、OPからトローリングを隠そうとします。おそらく、特定の日付の後、またはずさんなプログラマーがテストしない条件の下でのみトローリングを開始します。創造的であり、トリックを説明することを忘れないでください。
  • grepまたはなどの既存のツールを使用してスクリプトを作成しないでくださいfind。プログラムを最初から作成します。ライブラリを避け、低レベルの呼び出しを好む-これはコードをより複雑にし、そこにある邪悪なものを隠す機会を与えます。

これはです。上記の点に従って判断してください。


6
「ユーザー/同僚/上司の目でプログラムを求めている人を馬鹿にする」そして「彼/彼女の卒業証書を返して解雇されるべきです。」「解決策は有害であってはならず、そのユーザーに損害を与えてはならない」と四角い?
エモリー14年

「トローリング」質問のほとんどのポスターよりも多くの努力を払ったことを感謝しますが、このサイトのすべての質問には明確な仕様があり、「ファイルを検索する方法は現在のディレクトリにあります」 。(コードトローリングの質問がその基準を満たすことができるかどうかは、別の問題です)。
ピーターテイラー14年

@PeterTaylorより具体的な課題を与えようとしました。もっと具体的な提案があれば、感謝します。
ペトルスキー-パドラック

2
@emoryコーダーはユーザーではありません。クライアントに影響を与えることなく、仲間のコーダーの前でコーダーをH辱することは可能です。
ランチャー14年

3
私は、この質問が手に負えないので、このトピックをオフトピックとして閉じることに投票してます。
エリックアウトゴルファー

回答:


42

ここに私のソリューションがあります(Perlで):

#! /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 : $!";
    }
}

プログラムの最初の引数はディレクトリで、2番目の引数は探している文字列です。プログラムは、各ファイルの一致数も表示します。

/ etcで「VGA」を検索する方法は次のとおりです。

$ ./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
$

そして今、ここにトリックがあります:

プログラムは、ファイル内で検出されない限り、正確に機能します。検出されるとすぐに、検出された各ファイルに狂気の接頭辞を付け始めます。現在のディレクトリ内のいくつかのファイルをコピーして、再試行してみましょう。

$ cp / etc / default / console-setup /etc/bumblebee/xorg.conf.nouveau /etc/bumblebee/xorg.conf.nvidia /etc/htdig/english.0 ./
$ ./mygrep.pl ./ VGA
/ tmp / mygrep / console-setup:2マッチ
/tmp/mygrep/english.0:1マッチ
性交する/tmp/mygrep/mygrep.pl:9マッチ
性交/tmp/mygrep/xorg.conf.nouveau:2マッチ
性交する/tmp/mygrep/xorg.conf.nvidia:2マッチ
$
これは次のコードによるものです。
$ F eq $ k && / y。([F cy])/
現在のファイルが実行中のプログラムであるかどうかをテストし、実行中の場合、正規表現でプログラムの一部を抽出し、$ cに影響を与えます
$ c = $ c。$ 1
正規表現によって抽出されるのは、変数宣言(変数の名前は$ F、@ u、$ c、$ k、$ y、$ o、$ u)およびコメントからの2つのスペースです。プログラムが比較的短い場合でも、非表示にしておくためにそれをしなければなりませんでした。


ハハ、これは壮大です。
ソハムチョードリー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.