Skip to content

Latest commit

 

History

History
105 lines (88 loc) · 3.17 KB

File metadata and controls

105 lines (88 loc) · 3.17 KB

回到过去

背景和题目设定

一道简单题目,考察选手对 Unix 环境基本操作的熟悉程度,和对输入输出重定向等的基本理解。 灵感来源于 Unix Hater's Handbook,这也是小 L 同学第一次知道还有 ed 这个鬼畜编辑器。事实上,当你把环境变量 $TERM 设置为一个 terminfo 中没有的终端类型时,比如

export TERM=vt233

那么各种牛鬼蛇神编辑器就都不太能正常工作了——比如新手友好的 nano

Error opening terminal: vt233.

不过友好的 Vim 会猜测你的终端是 ansi,继而在你的终端模拟器上运行。但如果你的终端模拟器是一个毫不解析控制字符的傻终端呢? 除了用 cat 编辑文件,你还可以用 ed

ed 虽然已经埋入历史的尘埃,但是它还是 Single Unix Specification 的一部分。

一个典型的解题思路

第一步,看到题面上的提示:*忘记保存文件 *、*ed 编辑器 *、info ed给定输入序列 第二步,去看看 info ed

首先,*ed * 是一个 Line Editor(行编辑器),这意味着用户进行的编辑操作无法在屏幕上得到所见即所得的反馈。*ed * 在内存中维护一个缓冲区,用户所有的修改都会存在缓冲区中,直到 * w filename * 命令将其写入文件。

a 命令用于向缓冲区的末尾加入文本,以单独一行的 .(英文句点)作为结束输入的标志。

,p 命令可以向屏幕输出缓冲区的内容。 2 (一个单独的行号)用于选择需要修改的行。 s/old/new 可以替换选择行中的 oldnew2m3 (行号 m 行号)命令可以将第 2 行挪到第 3 行后面。特别的,2m0 表示把第二行放在第一行前面。 q 命令用于退出 ed 编辑器。 值得注意的是 ed 独特的报错方式:一个大大的 ?。特别的,一个缓冲区没有保存的 ed 需要两个 q 命令才可以退出,第一个 q 命令的结果是一个大大的 ?

第三步,继续看题目的 input_sequence

q
ed
a
flag{
.
a
44a2b8
a3d9b2[ESC]c
c44039
f93345
}
.
2m3
2m5
2m1
2
s/4/t
q
q

前面的 q 和 ed 是上一次 ed 会话的残留,我们应该先删去。 然后发现他没有保存,所以删去末尾的 q,加上 w flag.txt,变成这样:

a
flag{
.
a
44a2b8
a3d9b2ESCc
c44039
f93345
}
.
2m3
2m5
2m1
2
s/4/t
w flag.txt
q

并且运行

ed input_sequence && less flag.txt

得到 flag.txt 如下:

flag{
t4a2b8
c44039
f93345
a3d9b2ESCc
}

发现一个神秘的 ESCc,那是什么?那其实是一个 转义序列,用来控制终端的行为。在本例中为清屏。值得注意,ESC 并不是三个普通的字母,而是一个不可打印字符,而 less 为了向用户显示,所以写成 ESC,并且用白底标出。所以,如果你直接运行

cat flag.txt

你将不能看到完整的 flag。 所以,本题的 flag 是 flag{t4a2b8c44039f93345a3d9b2}

可能最后的 Escape Sequence 有些小坑,但是没有这一道小弯弯不就不 DEC VT 终端 了?(大雾