Böser Code verbergen - Druckt Dateien, die eine bestimmte Zeichenfolge enthalten, an einer beliebigen Stelle in einem Verzeichnisbaum. [Geschlossen]

17

In diesem Rätsel geht es darum zu lernen, wie ein bösartiger Code in einem Programm versteckt und entdeckt werden kann.

Eine Person stellt die Frage:

Bitte geben Sie mir einen Code, wie ich eine Datei suchen kann, die sich in Present Directory oder in seinen Unterverzeichnissen befindet.

(Dies ist eine Variante einer echten Frage, die ich auf einer Website gepostet habe.)

Genauer gesagt: Das OP möchte, dass Sie ein Programm schreiben, das einen String und ein Verzeichnis akzeptiert. Es durchläuft alle Dateien im Verzeichnis und rekursiv alle seine Unterverzeichnisse. Für jede Datei wird geprüft, ob die Datei die Zeichenfolge enthält, und wenn dies der Fall ist, wird der Name der Datei gedruckt. (Das Programm kann zusätzliche Funktionen enthalten, solange sie für das Hauptziel relevant sind, wenn Sie dies wünschen.) Es gibt keine Anforderungen an die Traversierungsreihenfolge.

Die Hauptaufgabe dieses Puzzles ist es jedoch, in dem Programm zusätzlichen Code zu verstecken, der die Person, die nach dem Programm fragt, in den Augen ihrer Benutzer / Kollegen / Chefs / etc zum Narren hält. Drucken Sie zum Beispiel irgendwann einen demütigenden Text aus, wie zum Beispiel: Der Autor des Programms kann nicht programmieren, sollte sein Diplom zurückgeben und sich entlassen lassen. Seien Sie kreativ.

Regeln:

  • Die Lösung darf nicht schädlich sein (außer natürlich das OP zum Narren zu halten). Es darf den Endbenutzern keinen irreversiblen Schaden zufügen (keine Sachen wie rm -rf)! Solche Lösungen werden disqualifiziert.
  • Das Trolling-Zeug sollte versteckt sein, damit der OP es nicht leicht findet.
  • Es sollte nicht offensichtlich sein, dass Sie das OP überwachen. Der Code sollte echt aussehen.
  • Die Lösung muss eine angemessene Erklärung enthalten, wie sie das OP steuert, damit jeder etwas von Ihrer Lösung lernen kann. Die Erklärung sollte in einem verborgenen Text (Spoiler) versteckt sein, bis Sie darauf klicken . Versuchen Sie bei der Beurteilung, das Trolling zu entdecken, ohne auf die Erklärung zu achten, und stimmen Sie für diejenigen ab, die schwer zu entdecken sind.
  • Versuchen Sie auch, das Trolling vor dem OP zu verbergen, wenn er versucht, den Code einige Male auszuführen. Beginnen Sie vielleicht erst nach einem bestimmten Datum mit dem Trolling oder unter bestimmten Bedingungen, die ein schlampiger Programmierer nicht testen kann. Seien Sie kreativ und vergessen Sie nicht, den Trick zu erklären.
  • Erstellen Sie nicht einfach ein Skript mit vorhandenen Tools wie grepoder find. Schreiben Sie das Programm von Grund auf neu. Vermeiden Sie lieber Bibliotheken und bevorzugen Sie einfache Aufrufe. Dadurch wird der Code komplexer und Sie haben die Möglichkeit, das Böse dort zu verbergen.

Dies ist ein . Bitte urteilen Sie nach den obigen Punkten.

Petr Pudlák
quelle
6
Wie macht sich "eine Person lächerlich, die in den Augen ihrer Benutzer / Kollegen / Chefs nach dem Programm fragt"? und "sollte sein / ihr Diplom zurückgeben und gefeuert werden." Quadrat mit "Die Lösung darf nicht schädlich sein, darf keine Schäden an den Benutzern anrichten"?
Emory
Ich schätze, dass Sie sich mehr Mühe gegeben haben als die meisten Poster mit "Trolling" -Fragen, aber alle Fragen auf dieser Website sollten eine klare Spezifikation haben und "wie kann ich eine Datei suchen, die sich möglicherweise im aktuellen Verzeichnis befindet" ist bei weitem nicht mit diesem Standard vereinbar . (Ob eine Code-Trolling-Frage diesen Standard erfüllen kann, ist eine separate Frage. )
Peter Taylor
@ PeterTaylor Ich habe versucht, eine spezifischere Zuordnung zu geben. Wenn Sie spezifischere Vorschläge haben, schätze ich sie.
Petr Pudlák
2
@ Speicher der Codierer ist nicht der Benutzer. Es ist möglich, den Kodierer vor seinen Mitkodierern zu demütigen, ohne die Klienten zu beeinträchtigen.
Cruncher
3
Ich stimme dafür, diese Frage als "Off-Topic" zu schließen, weil sie hintergangen wird .
Erik der Outgolfer

Antworten:

42

Hier ist meine Lösung (in 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 : $!";
    }
}

Das erste Argument des Programms ist das Verzeichnis und das zweite Argument ist die Zeichenfolge, nach der wir suchen. Das Programm zeigt auch die Anzahl der Übereinstimmungen in jeder Datei an.

So suchen Sie nach "VGA" in / etc:

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

Und jetzt ist hier der Trick:

Das Programm funktioniert genau so, wie es empfohlen wird, solange es nicht in den Dateien auftaucht. Sobald es auf sich selbst stößt, beginnt es, jeder mit Wahnsinn gefundenen Datei ein Präfix zu setzen. Kopieren wir einige Dateien in das aktuelle Verzeichnis und versuchen es erneut:

$ 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 Übereinstimmungen
/tmp/mygrep/english.0: 1 match
Fick dich /tmp/mygrep/mygrep.pl: 9 Treffer
Fick dich /tmp/mygrep/xorg.conf.nouveau: 2 Treffer
Fick dich /tmp/mygrep/xorg.conf.nvidia: 2 Treffer
$
Das liegt an diesem Code:
$ F eq $ k && / y. ([F cy]) /
Es testet, ob die aktuelle Datei das laufende Programm ist, und wenn dies der Fall ist, extrahiert es einen Teil des Programms mit einem regulären Ausdruck und beeinflusst es mit $ c
$ c = $ c. $ 1
Was durch den regulären Ausdruck extrahiert wird, sind die Variablendeklarationen (Variablen heißen $ F, @u, $ c, $ k, $ y, $ o, $ u) und zwei Leerzeichen aus den Kommentaren. Ich musste das tun, um es versteckt zu halten, auch wenn das Programm relativ kurz ist.

Florent Bayle
quelle
Haha, das ist episch.
Soham Chowdhury