Приховати злий код - друкувати файли, що містять заданий рядок в будь-якому місці дерева дерева [закрито]


17

Сенс цієї головоломки полягає в тому, щоб дізнатися, як шкідливий код можна приховати і виявити в програмі.

Людина задає питання:

Будь ласка, дайте мені код, як я можу шукати файл у Present Directory або в його підкаталогах.

(Це варіант реального питання, який я бачив, розміщеного на одному сайті.)

Щоб бути більш конкретним: ОП хоче, щоб ви написали програму, яка приймає рядок і каталог. Він буде переміщувати всі файли в каталозі та рекурсивно всі його підкаталоги. Кожен файл перевірятиме, чи містить файл рядок, а якщо він є, надрукує ім'я файлу. (Програма може мати додаткові функції, якщо вони відповідають основній цілі, якщо ви хочете.) Ніяких вимог щодо порядку переходу немає.

Однак головне завдання цієї головоломки - приховати в програмі додатковий код, який зробить дурнем людину, яка запитує програму в очах своїх користувачів / колег / боса / тощо. Наприклад, надрукуйте принизливий текст у якийсь момент, наприклад: Автор програми не знає, як програмувати, повинен повернути диплом та звільнитись. Будь креативним.

Правила:

  • Розчин не повинен бути шкідливим (за винятком, звичайно, глузування з ОП). Він не повинен завдавати незворотної шкоди кінцевим користувачам (таких речей немає rm -rf)! Такі рішення будуть дискваліфіковані.
  • Матеріали для тролінгу слід приховати, щоб ОП не знайшов її легко.
  • Не повинно бути очевидним, що ти тролінг ОП. Код повинен виглядати справжнім.
  • Рішення повинно надходити з належним поясненням того, як він переносить ОП, щоб кожен міг щось дізнатися з вашого рішення. Пояснення має бути прихованим у тексті, який не ховається до натискання (спойлери) . Судячи, спробуйте відкрити тролінг, не дивлячись на пояснення, і проголосуйте за тих, хто важко виявити.
  • Також спробуйте приховати тролінг від OP, якщо він намагається запустити код кілька разів. Можливо, почніть тролінг лише після певної дати або за певних умов, які неохайний програміст не перевірятиме. Будьте креативними і не забудьте пояснити хитрість.
  • Не просто створюйте сценарій за допомогою існуючих інструментів, таких як grepабо find. Напишіть програму з нуля. Краще уникайте бібліотек і віддайте перевагу дзвінкам низького рівня - це зробить код складнішим і надасть вам можливість приховати там злі речі.

Це . Будь ласка, судіть згідно з вищезазначеними пунктами.


6
Як "зробить дурнем людину, яка запитує програму в очах своїх користувачів / колег / начальника". і "повинен повернути свій диплом та звільнитись". квадрат з "Рішення не повинно бути шкідливим, не повинно завдати шкоди своїм користувачам"?
emory

Я вдячний, що ви доклали більше зусиль, ніж більшість плакатів питань "тролінгу", але всі питання на цьому веб-сайті повинні мати чітку специфікацію, і "як я можу шукати файл у поточному каталозі" ніде не відповідає цьому стандарту . (Чи може будь-яке запитання щодо кодування відповідати цьому стандарту - окрема проблема ).
Пітер Тейлор

@PeterTaylor Я намагався дати більш конкретне завдання. Якщо у вас є більш конкретні пропозиції, я їх оцінюю.
Петро Пудлак

2
@emory кодер не є користувачем. Приниження кодера перед своїми товаришами-кодерами не впливає на клієнтів.
Cruncher

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

Перший аргумент програми - це каталог, а другий аргумент - рядок, який ми шукаємо. Програма також показує кількість збігів у кожному файлі.

Ось як шукати "VGA" в / 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
$

А тепер ось хитрість:

Програма працює точно так, як рекомендується, доки вона не зустрічається у файлах. Як тільки він стикається з самим собою, він починає префіксувати кожен знайдений файл з божевіллям. Копіюємо кілька файлів у поточний каталог та повторимо спробу:

$ 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.