PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。

【Base・XOR・エンコーディング編】CTF頻出ウォームアップを瞬殺する|CTF思考フレームワーク #51

【Base・XOR・エンコーディング編】CTF頻出ウォームアップを瞬殺する|CTF思考フレームワーク #51 アイキャッチ画像
安全に生きたい編集部

広告・PRを含みます。この記事にはアフィリエイトリンクが含まれます。掲載内容は編集方針に基づいて作成していますが、価格・在庫・キャンペーン内容はリンク先で最新情報を確認してください。

Base64やXORって、暗号というより『エンコーディング』だよね?CTFで何見るの?🔄

そう、暗号ではなく『可逆変換』。でもCTFのウォームアップ問題で必ず出ます。Base64の特徴、XOR鍵の繰り返し検出、複数回エンコーディングの剥がし方――これらは『見抜く力』のトレーニングです。

Base64・Base32・Base58、URLエンコード、ROT13、XOR――これらは厳密には暗号ではなく『可逆エンコーディング』。CTF ではウォームアップ問題として頻出します。複数回エンコーディングを重ねた問題、XOR鍵の長さ推定、Base64末尾の=数からの推測などのテクニックがあります。

見た目で『これBase64だ』ってわかるようになるんだ…

この記事は、CTF思考フレームワーク第51回。エンコーディング系問題(Base*・XOR・ROT*)の見分け方、CyberChef での解析、自動判定ツール、CTF典型問題のパターンを整理します。

📖 この記事はシリーズの一部です
CTF思考フレームワーク#51 / 全86記事 → シリーズ一覧を見る →

🔢 Base64を見ても暗号と勘違いしないこと、それがCTFのCryptoカテゴリ最初の関門。Base・XOR・エンコーディングは「暗号化ではなく符号化」、見分けがつくと一気に視界が開けます。

Base16/32/58/64/85、XOR(単純鍵・繰り返し鍵)、URL/HTML/Unicodeエスケープ。問題文を眺めて「これは符号化、これは暗号、これは難読化」と素早く分類するのがCryptoの初動。

難易度:★☆☆(入門)

CTF頻出のウォームアップを瞬殺できるようになります⚡

Base64やXORはCTFの定番ウォームアップ。瞬殺できるようになろう⚡

この記事で出てくる言葉

先に意味を押さえておくと読みやすい用語です。

  • CTF: セキュリティの練習問題を解く競技。必ず許可された環境だけで試します。
  • マルウェア: 情報を盗む、端末を壊す、勝手に操作するなど悪意あるソフトの総称です。
  • JWT: ログイン状態や権限情報を安全に渡すために使われるトークン形式です。

👀 観察フェーズ:まず何を見る?

見たら「これBase64かな?」「Hex?」「URLエンコード?」と即座にパターン認識🔍

まず文字集合と長さ。Base64は A-Za-z0-9+/=、Base32は A-Z2-7=、Base58は 1-9A-HJ-NP-Za-km-z。長さが4の倍数ならBase64確定の補助証拠。

  • 使用文字(A-Z / a-z / 数字 / 記号)
  • 長さの倍数性(Base64は4倍数、Base32は8倍数)
  • 末尾パディング(= の数)
  • 繰り返しパターン(同じバイトのXOR痕跡)
  • エントロピー(高ければ暗号 or 圧縮、低ければ符号化)
  • 区切り文字(hex の空白・コロンなど)

Base64は[A-Za-z0-9+/]とパディング=、Base32は[A-Z2-7]、Hexは[0-9a-f]。文字種で見分けます👀

CyberChefのMagicレシピが自動判定してくれるから便利だね💡

🤔 仮説フェーズ:攻撃者は何を考える?

エンコーディング系の典型は4種類

🕶️ CTF出題者は「複数のエンコーディング段重ね」が大好物。Base64 → hex → reverse → Base85 みたいな多段がよくあります。XORは「鍵が短い繰り返し型」「ファイルヘッダ既知(PNG/PE)」のいずれかが多く、頻度+既知平文で素早く解けます。

📦 仮説①:Base64/Base32/Base58

長さが4の倍数で=パディングはBase64の典型。復号→中身確認を繰り返すと最終層に達する。

⚙️ 仮説②:XORエンコード

同じ鍵で繰り返しXOR。既知平文(flag{等)とXORすると鍵が出る。

🌐 仮説③:URL/HTML/Unicodeエンコード

%XX&#NNN;\\uXXXXのパターン。チェーンしてあると気づきにくい。

🔁 仮説④:多重エンコード(ROT→Base64→Hex)

CTFではよく3〜5層重ねた問題が出る。1層ずつ剥がす忍耐が必要。

「文字種・長さ・パディング」の3要素で大半は当てられるんだね💡

🔬 検証フェーズ:どうやって確かめる?

CyberChefのMagic recipeは強力。Pythonならcodecs.decodeでループ処理🧪

CyberChefの「Magic」機能でレシピ自動推定が王道。手動なら base64 → utf8 → 再判定 のループ。XORは xortoolxor-bruteforce で鍵長推定。

# Python: 多段デコード
import base64
x = b"S0RVe2V4YW1wbGV9"
for _ in range(3):
    try:
        x = base64.b64decode(x)
        print(x)
    except: break

# XOR:既知平文を使った鍵抽出
ct = bytes.fromhex("...")
known = b"FLAG{"
key = bytes(c ^ k for c, k in zip(ct[:len(known)], known))
print(key)

XORはxor.pyxortool鍵長+鍵推定まで自動化できるんだね💡

⚔️ 攻撃フェーズ:実際の手口

エンコーディング系で詰む典型トップ3

攻撃の典型:①Base64で隠した情報、②単純XORで「暗号化したつもり」、③繰り返しXORで鍵長=最頻周期、④HTMLエンティティ・URLエンコードで難読化、⑤Unicodeホモグリフ。

# 繰り返し鍵XOR:鍵長推定
from itertools import combinations
def hamming(a, b):
    return sum(bin(x ^ y).count("1") for x, y in zip(a, b))

def key_length(ct, max_k=40):
    res = []
    for k in range(2, max_k):
        chunks = [ct[i:i+k] for i in range(0, k*4, k)]
        d = sum(hamming(a, b) for a, b in combinations(chunks, 2)) / (6 * k)
        res.append((d, k))
    return sorted(res)[:3]

XORで難読化された設定ファイルや通信は今でも普通に出くわします。マルウェア解析でもXOR + 文字列定数の組み合わせは超頻出パターン⚙️

① 多重エンコードの読み違い

Hexっぽく見えるBase64を間違えてHexで読むと永遠に解けない。長さチェックが大事。

② XOR鍵長の見誤り

鍵長を間違えると部分的に意味が通る偽平文が出てハマる。Index of Coincidenceで確認。

③ ROT13かと思ったらROT47

記号も含むならROT47/Atbash/Affineの可能性も。最初の頭の柔らかさが鍵。

🛡️ 防御フェーズ:どう守る?

エンコーディングは「秘匿ではなく転送」のため!🛡️

実務の観点:「Base64は暗号化ではない」と全社員が知っているだけで、誤運用のかなりの部分が消えます。秘密はAES等の認証付き暗号で守る、が原則。

  • 機密情報をBase64・XORだけで守らない(暗号化ではない)
  • AES-GCM等の認証付き暗号を使う
  • XORで難読化されたマルウェア設定をDLPで検知(高エントロピー+ヘッダ既知)
  • Base64 + JSONで送るAPIにメッセージ完全性(HMAC)を付ける
  • URLエンコード・HTMLエンティティ二段デコードによるWAF Bypass対策
  • Unicodeホモグリフ攻撃対策(IDN表示制限)
🚫 Base64を秘匿目的で使わない

Base64は転送効率化のためのエンコーディング。秘匿性ゼロ。機密保護には暗号を使う。

🔒 XOR単独は使わない

使うとしてもストリーム暗号(ChaCha20等)の中の1要素として。鍵管理あってこその安全。

✅ 標準暗号で守る

Base64+暗号化、Base64+JWT、Base64+TLSのように本物の暗号と組合せて使う。

「Encoding != Encryption」を絶対に忘れない💪

⚠️ よくある落とし穴

  1. Base64 = 暗号化と誤解し、機密をBase64保存
  2. 多段エンコードを「1回デコードして終わり」と判断
  3. XOR鍵長推定で最頻ハミング距離だけ見て、第2候補を試さない
  4. Base32とBase64を文字集合だけで誤分類
  5. URL/HTMLエスケープ多段で、WAFが復号後を見ていない
  6. Unicode正規化(NFKC等)の前後で同一文字判定をミス

🧰 ツール早見表

ツール用途備考
CyberChef万能エンコーダMagic機能で自動判定
xortool繰り返しXOR鍵推定ファイル種別ヒント可
base58 / base85 cli少数派エンコードBTC/Bitcoin系で使用
Python codecs / base64自作スクリプト用多段ループに最適
Burp DecoderWeb系の多段デコードBurp内で完結

🎓 本気で学びたい人へ

暗号技術を「趣味」から「仕事」に変えたい方へ。🎓 ササエルはセキュリティ・インフラを体系的に学べるスクールです。

PR / 広告

ササエル

📚 もっと深く学びたい人へ

体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚

📚 次に読みたい

✍️ 学んだことを発信する

学んだことをWordPressブログでアウトプットしたい方は、ConoHa WINGから始めるのが手軽です。

PR / 広告

ConoHa WING

⚖️ 大事なお約束

必ず守ってね

この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝

この記事は合法な学習・防御目的での解説です。許可のないシステムへの攻撃は犯罪になります(不正アクセス禁止法ほか)。検証は必ず自分が管理する環境・CTF・公式ハンズオンで行ってください🙏

記事URLをコピーしました