隐藏邪恶代码-在目录树中的任何位置打印包含给定字符串的文件


17

这个难题的重点是学习如何在程序中隐藏和发现恶意代码。

一个人在问一个问题:

请给我一些代码,该如何找到文件的代码可能位于“当前目录”或其子目录中。

(这是我在一个网站上看到的一个真实问题的变体。)

更具体地说:OP希望您编写一个接受字符串和目录的程序。它将遍历目录中的所有文件并递归遍历其所有子目录。对于每个文件,它将检查文件是否包含字符串,如果包含,则将打印文件的名称。(如果需要,该程序可以具有其他功能,只要它们与主要目标相关即可。)对遍历顺序没有任何要求。

但是,这个难题的主要任务是在程序中隐藏其他代码,这些代码会使在用户/同事/老板/等人眼中要求该程序的人变得愚蠢。例如,在某个时候打印出侮辱性的文字,例如:该程序的作者不知道如何编程,应退还其文凭并被解雇。要有创造力。

规则:

  • 该解决方案一定不会有害(当然,除了愚弄OP外)。它一定不能对最终用户造成任何不可逆转的伤害(没有类似之类的东西rm -rf!)!此类解决方案将被取消资格。
  • 拖钓的物品应隐藏起来,以免OP轻易找到它。
  • 您正在拖曳OP并不明显。该代码应该看起来是真实的。
  • 解决方案必须附带适当的解释,说明它如何拖延OP,以便每个人都可以从您的解决方案中学到一些东西。解释应隐藏在单击后隐藏的文本(“扰流板”)中。进行判断时,请尝试查找巨魔而不看解释,并为难以发现的那些投票。
  • 如果尝试多次运行该代码,也请尝试从OP隐藏该拖钓。也许只在特定日期之后或在草率的程序员不会测试的某些条件下才开始拖钓。要有创造力,不要忘了解释这个技巧。
  • 不要只使用现有工具(例如grep或)创建脚本find。从头开始编写程序。最好避免使用库,而更喜欢低级调用-这将使代码更复杂,并使您有机会在其中隐藏恶意内容。

这是一场。请根据以上几点进行判断。


6
“如何在用户/同事/老板的眼中使要求该程序的人愚弄”。并且“应退还文凭并被解雇。” 与“解决方案不得有害,不得对用户造成任何损害”?
emory 2014年

我感谢您比大多数张贴“问题”问题的海报付出了更多的努力,但是此站点上的所有问题都应有明确的规范,并且“如何在当前目录中搜索文件”远远不能达到该标准。(是否有任何代码查询问题都可以满足该标准,这都是一个单独的问题)。
彼得·泰勒

@PeterTaylor我尝试给出更具体的任务。如果您有更具体的建议,我们将不胜感激。
PetrPudlák'14

2
@emory编码员不是用户。在不影响客户的情况下,在同等编码人员面前羞辱编码人员是可能的。
Cruncher 2014年

3
我投票结束这个题为离题的问题,因为它不为人知
暴民埃里克

Answers:


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

程序的第一个参数是目录,第二个参数是我们要查找的字符串。该程序还显示每个文件中的匹配数。

这是在/ 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)和注释中的两个空格。即使程序相对较短,我也必须这样做以使其隐藏。


哈哈,这是史诗般的。
Soham Chowdhury 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.