Skip to main content

Snyk Fetch the Flag CTF 2023 解説:Honey Baked Messages

snyk ctf honey baked messages

2023年11月30日

0 分で読めます

Fetchに参加してくれてありがとう! Fetch the Flag CTFに参加してくれた何千人もの皆さん、おめでとうございます。Snykの2023年Fetch the Flagに参加し、Honey Baked Messagesチャレンジの答えを探している方は、ここで解決策をご紹介します。一緒に解いていきましょう!

このチャレンジのテーマはハミング符号です。ハミング符号は誤り訂正符号の一種です。このチャレンジでは、ハミング符号の(7, 4)版を使います。

チャレンジは次の手順で構成されています。

  1. これはハミング符号化だと理解する。

  2. ファイルの各行を読み込む。 

  3. この問題に必要なH行列を特定する。

  4. ファイル全体の誤りを訂正して、フラグを取得する。

こちらが解答スクリプトsolve.pyです。

import numpy as np

H = np.array(
        [
            [1, 1, 1, 0, 1, 0, 0],
            [0, 1, 1, 1, 0, 1, 0],
            [1, 1, 0, 1, 0, 0, 1]
        ]
    )
errors = {
    "000":None,
    "001": 6,
    "010": 5,
    "011": 3,
    "100": 4,
    "101": 0,
    "110": 2,
    "111": 1
}

def np2usable(nparr):
    return np.array2string(nparr).replace(" ", "" ).replace("[", "").replace(']', "")

def fixErrs(hamming):
    error = (np.matmul(H, hamming)%2)
    err_idx = errors[np2usable(error)]
    if err_idx != None:
        # print(err_idx)
        hamming[err_idx] +=1
        hamming[err_idx] %= 2

    return hamming[:4]

data = []
with open("message_2.txt", "r") as reader:
    for line in reader:
        code = np.fromstring(" ".join(line.strip("\n")), dtype = int, sep=" ")
        data.append(np2usable(fixErrs(code)))
split_chars = (list(zip(*(iter(data),) * 2)))

[print(chr(int(j+k, 2)), end="") for j,k in split_chars ]

Fetchを盛り上げてくれてありがとう!

2023年のFetch the Flagに参加したすべてのチームに、心から感謝します!皆さんに会えてうれしかったです。いつでもYouTubeで私を見つけてください。

2023年のほかのチャレンジの解説はこちらです。ぜひご覧ください!

カテゴリー: