Linux fork炸弹解析 ——Linux Fork Bomb

Linux Fork Bomb

:(){ :|: & };:是一个bash函数,以Fork Bomb闻名,是一个拒绝服务攻击 的Linux 系统。如果你好奇地去执行了这个命令,那么赶快重启系统吧~!

命令解析

:()
{
    : | : &
};:
  1. 在这里是一个函数名,我们定义之,并在后面执行它。
  2. :|:&,:函数的输出通过管道传给另一个冒号函数作为输入,并且在后台执行。
  3. { };标识着里面的内容是一个函数主体。
  4. 最后一个:为定义完成后的一次函数执行。

原理解析

  1. 首先需要说明的是:是一个shell内置命令,所以上面这段代码只有在bash中才可能产生fork炸弹,因为在其他一些shell中,内置命令的优先级高于函数,所以执行:,总是执行内置命令。(是一个空命令,while true等同于 while ,常用作占位符)
  2. 先来看看函数的主体:|:&,使用管道的时候是两个进程同时开始执行。
  3. 所以当执行一个函数时,产生两个新进程,然后一个原来的进程退出,这样不停地递归下去,就产生了一个无限递归。按照这个增长模式的化,其增长趋势约为2n。

总结

Linux中还有很多这样存在这陷阱的命令,这也正是我喜欢Linux系统的原因,充满着探索性。

反馈与建议

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 09:18:38

Linux fork炸弹解析 ——Linux Fork Bomb的相关文章

Linux shell 的一个fork炸弹

.(){ .|.& };.  或者  :(){ :|:& };: 这13个字符由Jaromil ,在 2002 年设计了最为精简的一个 fork炸弹的实现. .()  说明下面要定义一个函数,函数名为小数点,没有可选参数:{    表示函数体的开始:.|.& 表示函数体真正要做的事情,首先它递归使用本函数,然后李永贵管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行.}    表示函数体的结束:;    并不会执行什么操作,在命令行中用来分隔两个命令用.从总体

fork 炸弹----linux

既然我们讨论的都是些奇怪的代码,不妨思考一下这一行: :(){ :|: & };: 对你来说,这可能看起来有些神秘,但是我看来,它就是那个臭名昭著的 Bash fork 炸弹.它会反复启动新的 Bash shell,直到你的系统资源消耗殆尽.系统崩溃. 不应该在最新的 Linux 系统上做这些操作.注意,我说的是不应该.我没有说不能.正确设置用户权限,Linux 系统能够阻止这些破坏性行为.通常用户仅限于分配使用机器可用内存.但是如果作为 root 用户的你运行了这行命令(或者它的变体 Bash

linux的一些机制Signal, Fork,

signal(SIGCHLD, SignalHandler); 注册软中断,对应的api close(socket); ret=fork(): 父进程,返回子进程的pid. 子进程返回0, 出错返回<0 set_process_name("Name"), 当前进程名称 dpopen, dlclose, dlsym linux的一些机制Signal, Fork,,布布扣,bubuko.com

《linux 内核完全剖析》 fork.c 代码分析笔记

fork.c 代码分析笔记 verifiy_area long last_pid=0; //全局变量,用来记录目前最大的pid数值 void verify_area(void * addr,int size) // addr 是虚拟地址 ,size是需要写入的字节大小 { unsigned long start; start = (unsigned long) addr; //把地址强制类型转换之后,赋值给start size += start & 0xfff; //取addr在当前虚拟地址中4

Linux内核源代码情景分析-fork()

父进程fork出子进程: fork经过系统调用,来到了sys_fork,详细过程请参考Linux内核源代码情景分析-系统调用. asmlinkage int sys_fork(struct pt_regs regs) { return do_fork(SIGCHLD, regs.esp, &regs, 0); } int do_fork(unsigned long clone_flags, unsigned long stack_start, //stack_start为用户空间堆栈指针 str

每天进步一点点——论fork()函数与Linux中的多线程编程

转载请说明出处:http://blog.csdn.net/cywosp/article/details/27316803 一.fork()函数 在操作系统的基本概念中进程是程序的一次运行,且是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位).在Linux系统中创建进程有两种方式:一是由操作系统创建,二是由父进程创建进程(通常为子进程).系统调用函数fork()是创建一个新进程的唯一方式,当然vfork()也能够创建进程,可是实际上其还是调用了fork()函数.fork

Linux环境编程--waitpid与fork与execlp

waitpid waitpid(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t waitpid(pid_t pid,int * status,int options); 函数说明 waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程 结束.如果在调用 wait()时子进程已经结束,则 wait()会立即 返回子进程结束状态值. 子进程的结束状态值会由参数 status 返回,

linux源码阅读笔记 fork函数

在阅读源码的过程中,发现找不到fork函数的定义.后来在linux/init/main.c中找到了这样一条语句 static inline _syscall0(int,fork) 原来这里就是fork函数的定义. 系统在linux/include/unistd.h有一个宏定义. #define _syscall0(type name)

linux 进程创建clone、fork与vfork

目录: 1.clone.fork与vfork介绍 2.fork说明 3.vfork说明 4.clone说明5.fork,vfork,clone的区别 内容: 1.clone.fork与vfork介绍 Linux下的进程与线程相同点是都有进程控制块(PCB,具体的类是task_struct).区别在于一个有独立的进程资源,一个是共享的进程资源.除了内核线程是完全没有用户空间.进程资源包括进程的PCB.线程的系统堆栈.进程的用户空间.进程打开的设备(文件描述符集)等. Linux的用户进程不能直接被