問題概要
picoCTFの「interencdec」という問題の解説記事です。
- カテゴリ: Cryptography
- 難易度: Easy
問題文
解説
ステップ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..ZをT..Z A..Sに置換(= 7文字戻す) -
a..zをt..z a..sに置換(= 7文字戻す)
例えば先頭側だけ見ると
a → tb → 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での表示順が近い記事を優先しておすすめしています。