問題概要
picoCTFの「Time Machine」という問題の解説記事です。
- カテゴリ: General Skills
- 難易度: Easy
問題文
解説
ステップ1: ZIPファイルの確認
問題文からZIPファイルをダウンロードし、内容を確認します。
$ unzip challenge.zip
Archive: challenge.zip
creating: drop-in/
inflating: drop-in/message.txt
creating: drop-in/.git/
creating: drop-in/.git/branches/
inflating: drop-in/.git/description
creating: drop-in/.git/hooks/
(中略)
extracting: drop-in/.git/COMMIT_EDITMSG
creating: drop-in/.git/logs/
inflating: drop-in/.git/logs/HEAD
creating: drop-in/.git/logs/refs/
creating: drop-in/.git/logs/refs/heads/
inflating: drop-in/.git/logs/refs/heads/master
ステップ2: 配布物がGitリポジトリか確認
今回のzipには
.gitディレクトリが含まれているので、drop-in/はそのままGitリポジトリとして扱えます。まずは隠しファイル込みで中身を確認します。
$ cd drop-in
$ ls -a
. .. .git message.txt
message.txtには「コミット履歴を見ないと分からない」というヒントが書かれています。$ cat message.txt
This is what I was working on, but I'd need to look at my commit history to know why...
ステップ3: コミット履歴からフラグを探す
Gitのコミットメッセージを確認します。まずは定番の
git log。$ git log --oneline
705ff63 (HEAD -> master) picoCTF{xxxxx}
※フラグはマスクしています。
フラグを発見しました。
この問題は「過去(Time Machine)に戻って履歴を見る」系で、コミットメッセージにフラグがそのまま入っているパターンでした。
環境によっては
git logの代わりにgit reflogでも同様に確認できます。$ git reflog
705ff63 HEAD@{0}: commit (initial): picoCTF{xxxxx}
さらに「Gitコマンドが使えない / 使いたくない」場合でも、ログはテキストとして残っているので直接読めます。
$ cat .git/logs/HEAD
0000000000000000000000000000000000000000 705ff639b7846418603a3272ab54536e01e3dc43 picoCTF <ops@picoctf.com> 1710018636 +0000\tcommit (initial): picoCTF{xxxxx}
使用したコマンドの簡単な解説
unzip
unzip challenge.zip
ZIPファイルを展開します。CTFでは「配布ファイルの構造をまず確認する」ために最初に叩くことが多いです。
ls -a
ls -a
ディレクトリ内のファイル一覧を表示します。
-aを付けると.gitのような隠しファイル/隠しディレクトリも表示されます。cat
cat message.txt
ファイルの中身を表示します。CTFではヒントが書かれていることが多いので、まず読むのが定石です。
git log --oneline
git log --oneline
コミット履歴を1行形式で表示します。 今回のように「コミットメッセージにフラグが入っている」タイプだと、これだけで回収できることがあります。
git reflog
git reflog
HEAD(現在の参照)が辿ってきた履歴を表示します。
git logと合わせて、「過去に何があったか」を素早く確認するのに便利です。cat .git/logs/HEAD
cat .git/logs/HEAD
Gitが内部的に持っているHEADのログを直接表示します。
Gitコマンドが使えない状況でも、
.git配下のログが読めればコミットメッセージなどの情報を拾えることがあります。まとめ
- ZIPの中に
.gitが入っていたら、その配布物は「Gitの履歴込み」で解析する問題の可能性が高い - まずは
ls -aで.gitの有無を確認し、git logやgit reflogで履歴を読む - 最悪でも
.git/logs/HEADなどを直接読めば情報が取れることがある
NEXT
次におすすめ
読み終わったら、そのまま次へ
【picoCTF】Super SSH - SSH接続の基本操作でリモートからフラグ取得
カテゴリ: General Skills難易度: Easy#picoCTF
次の記事へ →
同じカテゴリ/難易度/picoCTFでの表示順が近い記事を優先しておすすめしています。