Fireshell CTF 2019|Alphabet

#FireshellCTF2019

https://ctftime.org/task/7486

問題文

If you know your keyboard, you know the flag

一緒に渡されるファイル https://gist.githubusercontent.com/theoldmoon0602/fcf5368212f584262ae730bb1b34cbc6/raw/f3fb787e62053a78178da51f8a2ada0a7f534497/submit_the_flag_is_here.txt

問題分からキーボードと関連することはわかるが、それはそれとして渡されたファイルはなにかのハッシュが大量に並んでいる。長さが違うものがあるので複数のアルゴリズムが使われていそう。

長さから適当にsha256だろうとあたりをつけてオンラインのHash Crackerにかけてみる。今回は https://md5decrypt.net/en/Sha256 をつかった。すると最初のハッシュは

72dfcfb0c470ac255cde83fb8fe38de8a128188e03ea5ba5b2a93adbea1062fa : L

65c74c15a686187bb6bbf9958f494fc6b80068034a659a9ad44991b08c58f2d2 : o

とわかった。このサイトレスポンス早くていいな。みじかいのはMD5

6f8f57715090da2632453988d9a1501b : m

だった。

というわけで雑に変換用のスクリプトを書く

from hashlib import md5, sha256

table = {}
for i in range(256):
    v = chr(i)
    k1 = md5(v.encode()).hexdigest()
    k2 = sha256(v.encode()).hexdigest()

    table[k1] = v
    table[k2] = v

xs = open("submit_the_flag_is_here.txt").read().strip().split(" ")
ys = []
for x in xs:
    ys.append(table[x])
print("".join(ys))

結果はこうなった。Lipsumが見えているしどうやらこの方針は正しかったっぽい

https://gist.githubusercontent.com/theoldmoon0602/fcf5368212f584262ae730bb1b34cbc6/raw/baebda24dfa28afe905812b4d7c765146162190c/decoded.txt

このあとどうすれば良いのかわからず困っていたけど、こんな感じで解けた。keyboardは……?

$ cat decoded.txt |tr . '\n' | grep {
_Congratulations!_T#e_Flag_Is_F#{Y3aH_Y0u_kN0w_mD5_4Nd_Sh4256}_Donec_facilisis_turpis_vel_ex_tempus_lacinia