我在阅读 Ubuntu 论坛关于恶意命令的警告时发现了这个有趣的宝贝:
:(){ :|:& };:
警告:上面的代码将要除非您设置了严格的 proc 限制(您可能没有),否则会导致您的机器崩溃,从而促使硬重启。
将此代码视为类似于运行
sudo rm -rf /
。
但这是什么意思呢?即使以我的编程经验,我也从未见过如此神秘的非汇编语言命令。
答案1
正如你所说,这是一个 forkbomb。它的作用是定义一个函数,然后调用它。该函数名为:
。
让我们给它命名forkbomb
,以便我们更好地了解发生了什么:
forkbomb(){ forkbomb|forkbomb& };forkbomb
如您所见,并且可能根据您的编程经验猜出,第一部分是函数定义(forkbomb(){ ... }
),最后一部分:
是函数被调用的地方(;
Bash 中的分隔语句)。
现在,这个函数有什么用?如果你熟悉 Bash,你就会知道该|
字符将一个命令/程序的标准输出管道化为另一个命令/程序的标准输入。所以基本上,:|:
启动二函数的实例(这是它“分叉”的地方)。
然后就是魔术了:将&
这些命令放在后台,允许原始函数返回,而每个实例在后台分叉直到母牛回家,从而耗尽所有资源并关闭系统(除非它对其施加了限制)。
答案2
摘自维基百科文章叉子炸弹:
:() # define ':' -- whenever we say ':', do this:
{ # beginning of what to do when we say ':'
: # load another copy of the ':' function into memory...
| # ...and pipe its output to...
: # ...another copy of ':' function, which has to be loaded into memory
# (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
& # disown the functions -- if the first ':' is killed,
# all of the functions that it has started should NOT be auto-killed
} # end of what to do when we say ':'
; # Having defined ':', we should now...
: # ...call ':', initiating a chain-reaction: each ':' will start two more.
答案3
细分如下:
: () // Define ':' as a function. When you type ':' do the following
{
: // Call ':'
| // Redirect output
: // Into ':'
& // Push process to the background
}; // End of ':' def
: // Now do ':'
更改:
为bomb
,则有:
bomb(){ bomb|bomb& };bomb
它确实非常优雅。
答案4
在 Javascript 中,fork 炸弹是
function :() {
:();
:();
}
:();
该函数:
是一个 fork 炸弹,之所以这样命名是因为它必须与 bash 命令相似。原始汇编代码是:(){:|:&}:
。我将其转换为 Javascript,方法是先将其转换:
为:();
(:
开头的 除外,因为它是声明函数的名称)并删除|
和&
字符,然后将 转换:(){:();:();}
为以下内容:
function :() {
:();
:();
}
最后将:
末尾的 转换为:();
。