跳至主要內容

bash利用扩展字符集实现rm

PaperDragon...大约 7 分钟

bash利用扩展字符集实现rm

事出有因

昨天在群里看到一个暴躁老哥遇到了一个恶搞教程,使用一段特殊的代码删除了自己的/home目录。气的他直骂自己是傻逼。

果然,自己的快乐是建立在别人的痛苦之上的,不好意思我笑出声来了。

image-20231121165908477
image-20231121165908477
5FEC69FE77FFF255977FC97C31C2E6D7
5FEC69FE77FFF255977FC97C31C2E6D7

这个是什么意思呢?我这边查了一些资料然后把过程记录下来。

过程

金蝉脱壳

这个代码的含义是 rm -rf /home

仔细去看,其实执行部分在两个尖角号之间,跟管道后面的aplay毛关系都没有。

至于为啥是echo呢不过也是个障眼法罢了。

除去管道后面和echo ”“部分,现在已经脱壳完毕,中间部分我们来一点一点的看。

查古知今

脱壳之后,分段出现了几个符号,我们查询Bash特殊字符列表,得知含义。附加查询表格:

``  # 命令引用。也被称作反引号
$''  # 引用字符串扩展。这个结构将转义八进制或十六进制的值转换成ASCII3或Unicode字符。
\162\155 # 进制字符 

Bash特殊字符列表

特殊字符字符含义
#注释符,如果一行脚本的开头是#(除了#!),那么代表这一行是注释,不会被执行
;命令分隔符[分号]。允许在同一行内放置两条或更多的命令。
;;case条件语句终止符[双分号]。
;;&, ;&case条件语句终止符(Bash4+ 版本)。
.1.等价与source命令。2.可以作为隐藏文件。3. 当前工作目录。4.正则表达式中,表示单个字符
"双引号,部分引用(弱引用)。
'单引号,全引用(强引用)。
,逗号运算符。逗号运算符1将一系列的算术表达式串联在一起。算术表达式依次被执行,但只返回最后一个表达式的值。
\转义符[反斜杠]。转义某字符的标志
/文件路径分隔符[正斜杠]。起分割路径的作用。
`命令引用。也被称作反引号
:空命令[冒号]。它在shell中等价于”NOP”(即no op,空操作)与shell内建命令true有同样的效果。它本身也是Bash的内建命令之一,返回值是true(0)。
!取反(或否定)操作符[感叹号]。
*通配符[星号]。
?测试操作符[问号]。在一些特定的语句中,? 表示一个条件测试。 也可以作为 通配符。
$取值符号[钱字符],用来进行变量替换(即取出变量的内容)。行结束符[EOF]。 在正则表达式中,$ 匹配行尾字符串
${}参数替换。
$'...'引用字符串扩展。这个结构将转义八进制或十六进制的值转换成ASCII3或Unicode字符。
$*, $@位置参数。
$?返回状态变量。此变量保存一个命令、一个函数或该脚本自身的返回状态。
$$进程ID变量。此变量保存该运行脚本的进程ID。
()通过括号执行一系列命令会产生一个子shell(subshell)。 括号中的变量,即在子shell中的变量,在脚本的其他部分是不可见的。父进程脚本不能访问子进程(子shell)所创建的变量。
{xxx,yyy,zzz,...}花括号扩展结构。
{a..z}扩展的花括号扩展结构。
{}代码块[花括号],又被称作内联组(inline group)。它实际上创建了一个匿名函数(anonymous function),即没有名字的函数。但是,不同于那些“标准”函数,代码块内的变量在脚本的其他部分仍旧是可见的。
[ ]花括号扩展结构。
{xxx,yyy,zzz,...}测试。在 [ ] 之间填写测试表达式。值得注意的是,[ 是shell内建命令 test 的一个组成部分,而不是外部命令 /usr/bin/test 的链接。
[[ ]]测试。在 [[ ]] 之间填写测试表达式。相比起单括号测试 ([ ]),它更加的灵活。它是一个shell的关键字。并且可以支持正则表达式
$[ ... ]整数扩展符。在 $[ ] 中可以计算整数的算术表达式。
(( ))整数扩展符。在 (( )) 中可以计算整数的算术表达式。
> &> >& >> < <>重定向。
~+当前工作目录。它等同于内部变量 $PWD。
~-先前的工作目录。它等同于内部变量 $OLDPWD。
=~正则表达式匹配。 在[[]] 测试符的使用过程中就需要用到

ASCII码进制对照表

八进制十六进制十进制字符八进制十六进制十进制字符
00000nul1004064@
01011soh1014165A
02022stx1024266B
03033etx1034367C
04044eot1044468D
05055enq1054569E
06066ack1064670F
07077bel1074771G
10088bs1104872H
11099ht1114973I
120a10nl1124a74J
130b11vt1134b75K
140c12ff1144c76L
150d13er1154d77M
160e14so1164e78N
170f15si1174f79O
201016dle1205080P
211117dc11215181Q
221218dc21225282R
231319dc31235383S
241420dc41245484T
251521nak1255585U
261622syn1265686V
271723etb1275787W
301824can1305888X
311925em1315989Y
321a26sub1325a90Z
331b27esc1335b91[
341c28fs1345c92|
351d29gs1355d93]
361e30re1365e94^
371f31us1375f95_
402032sp1406096'
412133!1416197a
422234"1426298b
432335#1436399c
442436$14464100d
452537%14565101e
462638&14666102f
472739`14767103g
502840(15068104h
512941)15169105i
522a42*1526a106j
532b43+1536b107k
542c44,1546c108l
552d45-1556d109m
562e46.1566e110n
572f47/1576f111o
603048016070112p
613149116171113q
623250216272114r
633351316373115s
643452416474116t
653553516575117u
663654616676118v
673755716777119w
703856817078120x
713957917179121y
723a58:1727a122z
733b59;1737b123{
743c60<1747c124|
753d61=1757d125}
763e62>1767e126~
773f63?1777f127

水落石出

经过查询ASCII码,其中无法读取部分为

rm -rf /home

这时已经知道了这个恶搞命令的全部细节。

青出于蓝

我们在查找ASCII码和Bash特殊字符的时候,发现还可以用十六进制写一个,下面这个例子是我写的。

在线字符转八进制ASCII码工具open in new window

在线ASCII码字符串转16进制字符串工具open in new window

我们用i am paperdragon为例子去做,

[root@VM94654B337042743 ~]# docker run -it --rm alpine sh
apk / # apk add bash
fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/community/x86_64/APKINDEX.tar.gz
(1/4) Installing ncurses-terminfo-base (6.4_p20230506-r0)
(2/4) Installing libncursesw (6.4_p20230506-r0)
(3/4) Installing readline (8.2.1-r1)
(4/4) Installing bash (5.2.15-r5)
Executing bash-5.2.15-r5.post-install
Executing busybox-1.36.1-r2.trigger
OK: 10 MiB in 19 packages
/ # bash
8b54799f34e5:/#

# 使用八进制方式
8b54799f34e5:/# echo $'\151'$'\040'$'\141'$'\155'$'\040'$'\160'$'\141'$'\160'$'\145'$'\162'$'\144'$'\162'$'\141'$'\147'$'\157'$'\156'
i am paperdragon


# 使用十六进制方式
8b54799f34e5:/# echo $'\x69\x20\x61\x6D\x20\x70\x61\x70\x65\x72\x64\x72\x61\x67\x6F\x6E'
i am paperdragon

# 混合方式
8b54799f34e5:/# echo $'\x69\x20\x61\x6D\x20\x70\x61\x70\x65\x72\x64\x72\x61\x67\157\156'
i am paperdragon

你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3