【picoCTF】Time Machine - Git履歴をたどってフラグを復元

問題概要

picoCTFの「Time Machine」という問題の解説記事です。

  • カテゴリ: General Skills
  • 難易度: Easy

問題文

picoCTF Time Machine

解説

ステップ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 loggit reflogで履歴を読む
  • 最悪でも.git/logs/HEADなどを直接読めば情報が取れることがある
NEXT
次におすすめ

【picoCTF】Super SSH - SSH接続の基本操作でリモートからフラグ取得

カテゴリ: General Skills難易度: Easy#picoCTF
次の記事へ →
同じカテゴリ/難易度/picoCTFでの表示順が近い記事を優先しておすすめしています。