前言
前面幾天我們學會了如何建立、複製、移動與搜尋檔案。
但在 Linux 中,有時候會遇到一種情況,同一份資料需要讓不同程式透過不同的路徑存取。
這時候就可以使用 Link(連結)。
Linux 的 Link 大致可以分成兩種:
/flag/challenge/catflag 不會直接讀取 /flag,而是固定讀取 /home/hacker/not-the-flag/home/hacker/not-the-flag
↓
/flag
這樣程式雖然讀的是 not-the-flag,實際上卻會取得 /flag 的內容。
Symbolic Link 可以想像成「捷徑」。例如我們有一個真正的檔案 /tmp/myfile
裡面存放 This is my file!
如果建立 ln -s /tmp/myfile /home/hacker/ourfile
那麼
/home/hacker/ourfile
↓
/tmp/myfile
當我們執行 cat /home/hacker/ourfile
Linux 就會跟著這個 Symbolic Link 找到原本的 /tmp/myfile。
所以最後看到的內容仍然是 This is my file!
建立 Symbolic Link 使用 ln -s TARGET LINK_NAME
其中
| 部分 | 意義 |
|---|---|
ln |
建立 Link |
-s |
建立 Symbolic Link |
TARGET |
Link 要指向的目標 |
LINK_NAME |
新建立的 Link 名稱 |
例如 ln -s /tmp/myfile /home/hacker/ourfile
可以理解成
TARGET
/tmp/myfile
↑
│
└──── /home/hacker/ourfile
也就是 /home/hacker/ourfile → /tmp/myfile
可以使用 ls -l 查看檔案資訊。
如果是 Symbolic Link,通常會看到 /home/hacker/ourfile -> /tmp/myfile 其中 -> 就很重要。
例如 lrwxrwxrwx 1 hacker hacker ... /home/hacker/ourfile -> /tmp/myfile
這表示 ourfile 並不是原本的資料,而是一個指向 /tmp/myfile 的 Symbolic Link。
另外也可以使用 file file /home/hacker/ourfile
它會告訴我們這是一個 symbolic link to /tmp/myfile
題目:linking files
今天的題目給了一個特殊的情境。
真正的 Flag 在 /flag 但是 /challenge/catflag
會去讀 /home/hacker/not-the-flag
所以我們需要讓
/home/hacker/not-the-flag
↓
/flag
這樣 /challenge/catflag 雖然讀取的是 not-the-flag,但最後會被導向真正的 /flag。
首先,我先確認 ls -l /home/hacker/not-the-flag
結果發現原本這個位置已經存在一個 Symbolic Linklrwxrwxrwx 1 hacker hacker 5 Sep 9 09:59 /home/hacker/not-the-flag -> /flag
因為題目提醒,如果之前的實驗留下了 not-the-flag,就必須先移除它,否則 ln 無法建立新的 Link。
所以我先執行 rm /home/hacker/not-the-flag
接著重新建立 Symbolic Link ln -s /flag /home/hacker/not-the-flag
再使用 ls -l 確認 /home/hacker/not-the-flag
看到 lrwxrwxrwx 1 hacker hacker 5 Oct 8 09:43 /home/hacker/not-the-flag -> /flag
這就代表建立成功。
現在
/home/hacker/not-the-flag
↓
/flag
最後執行 /challenge/catflag
接著就看到成功取得 Flag!
這也證明我們建立的 Symbolic Link 確實成功指向 /flag。
今天主要學的是 Symbolic Link,但題目也介紹了另一種 Link,Hard Link。
兩者可以簡單理解成
| 類型 | 概念 |
|---|---|
| Hard Link | 不同名稱直接指向同一份檔案資料 |
| Symbolic Link | 建立一個指向另一個路徑的連結 |
| Symbolic Link 常見用途 | 類似 Windows 的捷徑 |
這次使用的 ln -s 就是建立 Symbolic Link。
如果沒有 -s,ln 預設處理的是 Hard Link。
所以目前先把 Symbolic Link 搞懂比較重要。
九、今天的心得
今天第一次接觸 Symbolic Link,最大的收穫是理解了**「路徑不一定代表真正的檔案」。
表面上 /home/hacker/not-the-flag 看起來是一個檔案,但實際上它可以是一個指向其他檔案的 Symbolic Link。這次題目就是利用這個特性,讓 /challenge/catflag 照著原本指定的路徑讀取資料,但最後實際取得的是 /flag。也讓人更理解 Linux 檔案系統中的「路徑」和「實際資料」**並不是完全相同的概念。
另外,今天也再次遇到了一個實作上的小問題,如果目標位置已經存在檔案或 Link,就不能直接建立新的 Link。
因此在建立之前,需要先確認 ls -l /home/hacker/not-the-flag 必要時再使用 rm /home/hacker/not-the-flag,這種先確認環境、再進行操作的習慣,在後面的 Linux 與資安實作中應該也會很重要。