探索路径


Linux 启明道场.

本模块将带你学习 Linux 文件路径的基础知识!

Linux 文件系统是一棵"树"。 也就是说,它有一个根,写作 /。 文件系统的根是一个目录,每个目录都可以包含其他目录和文件。 你通过路径来指代文件和目录。 从文件系统根目录开始的路径以 / 开头(即文件系统的根),并依次列出找到该文件所需进入的各级目录。 路径的各个部分都用 / 分隔。

掌握这些知识后,就去迎接下面的挑战吧。


视频字幕(七牛云直连)

我们已经知道,文件系统从 / 开始。 在它下面,有许多目录、配置文件、程序,以及最重要的——flag。 这一关中,我们直接在 / 下放了一个叫作 pwn 的程序,它会给你 flag。 你只需要执行这个程序!

在命令行中输入程序的路径,就可以执行它。 这里需要输入从 / 开始的完整路径,也就是 /pwn。 这种从根目录开始的路径称为"绝对路径"。

启动挑战,打开终端,使用绝对路径执行 pwn 程序,拿下 flag! 祝你好运!

我们来探索一个稍微复杂一些的路径! 除了上一关,pwn.college 中的挑战程序都放在 challenge 目录里,而 challenge 目录又直接位于根目录(/)下。 因此,挑战目录的路径是 /challenge。 这一关的挑战程序名为 run,位于 /challenge 目录中。 所以,挑战程序 run 的路径就是 /challenge/run。

这个挑战同样要求你通过绝对路径执行程序。 你要运行的是 challenge 目录里的 run 文件,而该目录又位于 / 目录下。 正确执行挑战程序后,它就会给你 flag。 祝你好运!

Linux 文件系统中有大量目录,每个目录又可能包含大量文件。 你可以使用 cd(change directory,意为切换目录)命令,并将路径作为参数传入,在各个目录之间切换,如下所示:

hacker@dojo:~$ cd /some/new/directory
hacker@dojo:/some/new/directory$

这会改变进程的"当前工作目录"(这里的进程是 bash shell)。 每个进程都有一个自己当前所在的目录。 本模块后面的内容会让你明白它有什么作用。

顺便说一句,现在你能看懂提示符中 ~ 所在的位置了! 它显示的是 shell 当前所在的路径。

这个挑战要求你在指定的路径下执行 /challenge/run 程序,程序会告诉你具体是哪个路径。 你需要先用 cd 切换到那个目录,再重新运行挑战程序。 祝你好运!

同样的操作,这次要做 5 遍!

现在,你已经熟悉绝对路径和切换目录的概念了。 如果处处都使用绝对路径,那么你当前在哪个目录中其实并不重要;前面三个挑战可能已经让你发现了这一点。

不过,对于相对路径来说,当前工作目录就很重要了。

  • 相对路径是不从根目录开始的路径,也就是说,它不以 / 开头。
  • 相对路径是相对于你的当前工作目录(current working directory,简称 cwd)来解析的。
  • 你的 cwd 就是终端提示符当前显示的所在目录。

这意味着,如何指定某个文件,取决于终端当前所在的目录。

假设我们想访问位于 /tmp/a/b/my_file 的文件。

  • 如果 cwd 是 /,这个文件的相对路径就是 tmp/a/b/my_file。
  • 如果 cwd 是 /tmp,这个文件的相对路径就是 a/b/my_file。
  • 如果 cwd 是 /tmp/a/b/c,这个文件的相对路径就是 ../my_file。其中,.. 表示父目录。

切换目录和执行程序是两个独立的操作。 例如:

hacker@dojo:~$ cd /
hacker@dojo:/$ bin/echo Hello
Hello

第一条命令将当前工作目录切换到 /。 第二条命令通过相对路径 bin/echo 执行 /bin/echo。

现在来试试吧! 首先,将当前工作目录切换到 /。 然后,用相对路径执行 /challenge/run。 这一关给你一个提示: 你的相对路径以字母 c 开头 😊

之前使用的相对路径是"裸"路径:直接写出要从当前目录进入的目录。 这一关中,我们将探索写法更明确的相对路径。

在包括 Linux 在内的大多数操作系统中,每个目录都有两个可以在路径中引用的隐含目录项:. 和 ..。 其中,. 指向该目录本身,因此下面这些绝对路径完全等价:

  • /challenge
  • /challenge/.
  • /challenge/./././././././././
  • /./././challenge/././

下面这些相对路径也完全等价:

  • challenge
  • ./challenge
  • ./././challenge
  • challenge/.

当然,如果当前工作目录是 /,上面的相对路径也就和上面的绝对路径等价了。

这个挑战将带你在相对路径中使用 .。 你的当前工作目录必须是 /,用于执行挑战程序的相对路径必须以 . 开头。 准备开始吧!

这一关中,我们将继续练习用 . 表示路径。 本挑战要求你在 /challenge 目录中运行程序。 这里的情况稍微有些特殊。

当你输入"裸"路径时,Linux 会有意避免自动在当前目录中查找程序。 来看下面的操作:

hacker@dojo:~$ cd /challenge
hacker@dojo:/challenge$ run

这样不会执行 /challenge/run。 这其实是一项安全措施:如果每次输入裸路径时,Linux 都在当前目录中搜索程序,你就可能误执行当前目录里与系统核心工具同名的程序! 因此,上面的命令会产生以下错误:

bash: run: command not found

我们稍后会进一步解释其背后的机制。在这个挑战中,先学习如何在这种情况下明确使用相对路径来启动 run。 方法是明确告诉 Linux:你想执行当前目录中的程序,也就是像前几关一样使用 .。 现在就试试吧!

每个用户都有自己的主目录,通常位于文件系统的 /home 下。 在 dojo 中,你是 hacker 用户,你的主目录是 /home/hacker。 用户通常会把大多数个人文件存放在主目录中。 学习 pwn.college 的过程中,你也会把大多数解题文件保存在这里。

通常,shell 会话启动时,会把主目录设为当前工作目录。 看看初始提示符:

hacker@dojo:~$

提示符中的 ~ 表示当前工作目录,其中,~ 是 /home/hacker 的简写。 Bash 提供并使用这个简写,是因为你大部分时间都会在主目录中操作。 因此,当 bash 在参数开头遇到符合路径写法的 ~ 时,就会将它展开为你的主目录。 来看下面的例子:

hacker@dojo:~$ echo LOOK: ~
LOOK: /home/hacker
hacker@dojo:~$ cd /
hacker@dojo:/$ cd ~
hacker@dojo:~$ cd ~/asdf
hacker@dojo:~/asdf$ cd ~/asdf
hacker@dojo:~/asdf$ cd ~
hacker@dojo:~$ cd /home/hacker/asdf
hacker@dojo:~/asdf$

注意,~ 展开后是一个绝对路径,而且只有开头的 ~ 会被展开。 例如,~/~ 会展开为 /home/hacker/~,而不是 /home/hacker/home/hacker。

一个小知识:cd 的默认目标就是你的主目录:

hacker@dojo:~$ cd /tmp
hacker@dojo:/tmp$ cd
hacker@dojo:~$

现在轮到你动手了! 在这个挑战中,/challenge/run 会将 flag 的副本写入你在命令行参数中指定的文件,但必须满足以下条件:

  1. 参数必须是绝对路径。
  2. 路径必须位于你的主目录内。
  3. 展开之前,参数的长度不得超过三个字符。

再次提醒,你必须将路径作为参数传给 /challenge/run,如下所示:

hacker@dojo:~$ /challenge/run YOUR_PATH_HERE

30天排行榜:

此排行榜反映本模块在道场上线后各挑战的解出情况。

排名 黑客 徽章 得分
#1 symbol ma'r'cen't 🐧 belt 8
#2 symbol first 🐧 belt 8
#3 symbol free 🐧 belt 6
#4 symbol xiaobao 🐧 belt 1