最近解了一些Git有關的CTF題目,用法基本上差不多只是有些解題時的小地方不同而已。這類題目的核心是要懂得翻repo的歷史紀錄。那趁今天就整理一下常用指令,以及我自己的心得。
首先我先來談一下常用到的git指令:
檢查狀態
git status
這是用來看哪些檔案是未追蹤、修改過及還沒commit過的指令。
查看檔案歷史
git log <檔案>
顯示該檔案的commit紀錄。
查看所有commit簡寫
git log --all --oneline
快速掃過整個repo歷史,有時候flag會直接藏在message裡。
檢視某個 commit 的檔案內容。
git show <commit>:<檔案>
看特定commit裡檔案的樣子。
檢查刪除紀錄
git log --diff-filter=D -- summary -- <檔案>
如果flag是藏在被刪掉的檔案裡,這招特別有用。
心得:
這幾天做了幾題和Git有關的挑戰,過程中慢慢體會到他在解題裡的特殊地位。題目表面上可能只丟給我們一個看似普通的檔案,但只要他有repo,就代表整個歷史都可以一步步慢慢去找出來。從一開始的git status去確認哪些檔案真的有被追蹤,到git log看commit訊息,再到git show打開舊版本檔案。每一個步驟都像是時光機,所以之前有個解過的題目就叫Time Machine。剛開始我常常會卡在檔案內容本身,直到後來才發現flag往往不在現在,而是藏在過去。這點讓我印象很深,因為在真實開發中也有相同的問題,如果不小心commit了敏感資料,就算之後刪掉也還是能被人找到。換句話說,Git題目不只是在測試指令熟不熟,更是在提醒我們資訊安全的基本觀念。做完這幾題,我覺得自己對git的理解不再只是會執著於題目的表象,而是真的能把它當作一種時間軸去思考,也更清楚為什麼很多公司會嚴格要求不要把密碼、金鑰等敏感資訊寫進repo。這些題目雖然難度不算高,但帶來的警惕卻很實在。