private tips

プログラミングとその他諸々の備忘録。

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 

なるほど。

「漢」をUTF-8で二回エンコードするとこうなるらしい。

ちなみに、二重エンコードというものがあるのを知ったのはこれを解く時でした。

ということは、問題文も二重エンコード??ってことでその問題文を見る。

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

ん?

なんだこれは。としばらく呆然。

で、以下の記事↓を見ると、「二重エンコード」のパラグラフに問題文に似たような英数字の配列があることが分かる。

d.hatena.ne.jp

 

どうやら二重エンコードされた結果、c3 a3 c2 ...
のようなビット列になるらしい。

とりあえず python

f:id:zvub:20151016165430p:plain

変数 str に一旦入れて普通に表示する。とりあえず「:」が邪魔、かつ16進表記にしたいのでちょっと整形して print してみる。

f:id:zvub:20151016165824p:plain

なんか出た。

「ふらっぐ」という文字が見えているので、どの辺からそうなってるのか、って事でutf-8 でデコードしてみる。

f:id:zvub:20151016170612p:plain

ちょっと見づらいので、後半部分だけ見る↓

f:id:zvub:20151016170822p:plain

変わってる。この、末尾の「¥u」から始まっている部分がutf-8でデコード出来た部分っぽい。

で、ここでちょっと閃いて「これ切り取っておけば良いのでは?」となる

ってことで、これをとりあえず切り離しておく。

f:id:zvub:20151016171212p:plain

second_str には切り離した部分「¥xbb」までを格納。

とりあえずもう一回この状態で print してみる。

f:id:zvub:20151016171444p:plain

また出てきた。

というわけで再び decode('utf-8') する。

f:id:zvub:20151016171754p:plain

なるほどこの部分。で前回と同様に、切り離して残った部分を print してみる。

f:id:zvub:20151016172232p:plain

「・ザ・」と出てくる

文字として読むことができたこの3箇所をまとめて print すると、

f:id:zvub:20151016172517p:plain

となるので、これで旗が得られたわけである。( print すると変数の間に半角スペースが挟まるので、フラグを投げる時は半角スペースを削除)

 

まとめ

・CTF力はまだ全然無いので、当初はutf-8でdecodeしたものを何か別の形式でdecodeするのでは…と試行錯誤して無駄に時間を食った。

・こういうのは解いてて楽しい。

・cheap cipher (revenge) を解くのが次の目標。あと ksnctf の 村人A も解きたい。