【picoCTF】interencdec - Base64とシーザー暗号の多段エンコード解読

問題概要

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

  • カテゴリ: Cryptography
  • 難易度: Easy

問題文

picoCTF interencdec

解説

ステップ1: 配付されたファイルの確認

まずは与えられたファイルenc_flag'の内容を確認します。
$ cat enc_flag
YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclh6ZzJhMnd6TW1zeWZRPT0nCg==

ファイルの中身はBase64エンコードされた文字列のようです。


ステップ2: Base64デコードの実行

Base64デコードを実行してみます。Linuxのbase64コマンドを使用します。
$ echo "YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclh6ZzJhMnd6TW1zeWZRPT0nCg==" | base64 -d
b'd3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrXzg2a2wzMmsyfQ=='

デコード結果もBase64エンコードされた文字列のようです。


ステップ3: 2回目のBase64デコードの実行

再度Base64デコードを実行します。''で囲われた部分をデコードします。

$ echo "d3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrXzg2a2wzMmsyfQ==" | base64 -d
wpjvJAM{jhlzhy_k3jy9wa3k_86kl32k2}

この文字列はシーザー暗号(ROT)でエンコードされているようです。


ステップ4: ROTデコードの実行

先ほど得られた文字列は

wpjvJAM{jhlzhy_k3jy9wa3k_86kl32k2}

でした。


ここで大事なポイントは、picoCTFのフラグはほぼ必ずという固定のプレフィックスから始まる、ということです。

picoCTF{...}

つまり今回の

wpjvJAM{...
picoCTF{...} がシーザー暗号(ROT)でずれている と考えるのが自然です。

どれだけずれているか(シフト量)の求め方

暗号文の先頭は w、平文の先頭は p なので、
  • w → p に戻したい

という対応が分かります。


アルファベット順(a b c ... z)で数えると
  • p(16)w(23)+7
なので、暗号化は「+7シフト」だった可能性が高いです。 復号はその逆で -7シフト を適用すれば元に戻ります。
この -7 シフトは、tr の対応表で表現できます。

tr コマンドで ROT(-7) を作る考え方


tr コマンドは「左の文字集合を、右の文字集合へ1対1で置換」します。

今回の

tr 'A-Za-z' 'T-ZA-St-za-s'

は、次の対応をまとめて作っています。

  • A..ZT..Z A..S に置換(= 7文字戻す)
  • a..zt..z a..s に置換(= 7文字戻す)

例えば先頭側だけ見ると

  • a → t
  • b → u
  • ...
  • h → a

となり、確かに「7つ前の文字へ戻す」変換になっています。


以上を踏まえて、復号を実行します。

$ echo "wpjvJAM{jhlzhy_k3jy9wa3k_86kl32k2}" | tr 'A-Za-z' 'T-ZA-St-za-s'
picoCTF{xxxxx}

※フラグはマスクしています。


フラグが得られました。


使用したコマンドの軽い解説

cat

cat <ファイル名>

ファイルの中身を表示します。今回のように配布ファイルがテキストのとき、まず最初に確認するのに使います。


echo

echo "<文字列>"
文字列を表示します。パイプ(|)で別コマンドに渡して加工するときによく使います。

base64

echo "<Base64文字列>" | base64 -d

Base64をデコードします。CTFでは多段Base64がよくあるので、怪しい文字列はまず疑ってOKです。


tr

echo "<文字列>" | tr '<変換元>' '<変換先>'
文字の置換(変換)を行います。 今回のようなシーザー暗号は「アルファベット置換」なので、tr で一発復号できることがあります。

まとめ

この問題は「Base64 → Base64 → ROT(シーザー暗号)」という、CTFで頻出の多段エンコードでした。

▼ポイントは以下の通りです。

  • まず cat で配布ファイルの中身を確認する
  • Base64っぽければ base64 -d を試し、必要なら繰り返す
  • picoCTF{...} の固定プレフィックスを手掛かりに、ROTのシフト量を推測する
  • シーザー暗号は tr で置換表を作ると手早い

閲覧ありがとうございました!

NEXT
次におすすめ

【picoCTF】Commitment Issues - Gitコミット履歴からフラグを復元する

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