記録は作業の証

鉄道とコンピュータ

picoCTF Write-up Transformation

問題文

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を使って復号してみることにした。

gist81fcbf8dd6172c81d919c0d37ab23a64