問題文
https://play.picoctf.org/practice/challenge/104
I wonder what this really is... enc ''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])
考えたこと
encというファイルには、文字化けする謎のバイナリデータが書かれている。 問題には以下のようなコード片があるが、これが暗号化に使われたコードだろう。
''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])
このコードのアルゴリズムは、要約すると次のようなものになる。
- 平文を2文字ずつに区切り、Unicodeの1文字に無理矢理まとめる。
- まとめかたは、2文字をそれぞれコードポイントに変換し、平文の先頭側を8ビット左シフトして、後尾側とビットORするもの。
ということは、逆の操作を実装すれば復号できるはず。
解答
Racketを使って復号してみることにした。