encode encode
※以下 Write up の為、ネタバレにります。
解いたのはこれです。
http://ctf.katsudon.org/problem/9
ジャンル:misc
ポイント:90
解法
まず上の例を見る。
# regular UTF-8 encode 漢 -> \346\274\242 # encode twice in UTF-8 漢 -> \303\246\302\274\302\242
なるほど。
ちなみに、二重エンコードというものがあるのを知ったのはこれを解く時でした。
ということは、問題文も二重エンコード??ってことでその問題文を見る。
c3:a3:c2:81:c2:8d:c3:a3:c2:82:c2:83:c3:a3:c2:81:c2:b7:c3:a3:c2:81:c2:a1:c3:a3:c2:82:c2:83:c3:a3:c2:83:c2:bc:c3:83:c2:a3:c3:82:c2:83:c3:82:c2:bb:c3:83:c2:a3:c3:82:c2:82:c3:82:c2:b6:c3:83:c2:a3:c3:82:c2:83:c3:82:c2:bb:e3:81:b5:e3:82:89:e3:81:a3:e3:81:90
ん?
なんだこれは。としばらく呆然。
で、以下の記事↓を見ると、「二重エンコード」のパラグラフに問題文に似たような英数字の配列があることが分かる。
どうやら二重エンコードされた結果、c3 a3 c2 ...
のようなビット列になるらしい。
とりあえず python 。
変数 str に一旦入れて普通に表示する。とりあえず「:」が邪魔、かつ16進表記にしたいのでちょっと整形して print してみる。
なんか出た。
「ふらっぐ」という文字が見えているので、どの辺からそうなってるのか、って事でutf-8 でデコードしてみる。
ちょっと見づらいので、後半部分だけ見る↓
変わってる。この、末尾の「¥u」から始まっている部分がutf-8でデコード出来た部分っぽい。
で、ここでちょっと閃いて「これ切り取っておけば良いのでは?」となる
ってことで、これをとりあえず切り離しておく。
second_str には切り離した部分「¥xbb」までを格納。
とりあえずもう一回この状態で print してみる。
また出てきた。
というわけで再び decode('utf-8') する。
なるほどこの部分。で前回と同様に、切り離して残った部分を print してみる。
「・ザ・」と出てくる
文字として読むことができたこの3箇所をまとめて print すると、
となるので、これで旗が得られたわけである。( print すると変数の間に半角スペースが挟まるので、フラグを投げる時は半角スペースを削除)
まとめ
・CTF力はまだ全然無いので、当初はutf-8でdecodeしたものを何か別の形式でdecodeするのでは…と試行錯誤して無駄に時間を食った。
・こういうのは解いてて楽しい。
・cheap cipher (revenge) を解くのが次の目標。あと ksnctf の 村人A も解きたい。