初心者の初心者による初心者のためのWriteup [CTF(x)]
今回はあまり時間が取れなかったので、一人での参加です。
簡単な問題しか解けてないのでつらい。
Writeup
EBG13
Qrpelcg guvf sbe na rnfl 1 cbvag! Guvf vf na rknzcyr bs gur synt sbezng: pgs(ebg13vffhcrefrpher!)
13とflagの形式であるctf()となっているべきところがpgs()になっていることからROT13(シーザー暗号)と予想できます。
実際にpを13文字ずらしてみるとcになるので予想はおそらくあたっています。
先日作ったrot_nを解くプログラム(シーザー暗号を解きながらpythonの勉強 - 知ることは、たのしい。)を使いましょう。
$ python rot_n.py 'Qrpelcg guvf sbe na rnfl 1 cbvag! Guvf vf na rknzcyr bs gur synt sbezng:pgs(ebg13vffhcrefrpher!)' 13
ctf(rot13issupersecure!)
λ
標準入力から文字列を受けとり、それを並び替えた結果が出力される以下のプログラムを用いてflagを並び替えた
n1s4_t1An(f1ctdb@mpl_h3)m3lp3y__Eas
を復元する問題です。
print (lambda j,m:(lambda f,t:t if len(t) <= 1 else j([f(f,x)for x in m(j,m(reversed,(lambda s:zip(*[iter(s)]*(len(s)/2)))(t+"\x01"*(len(t)%2))))]))(lambda f,t:t if len(t) <= 1 else j([f(f,x)for x in m(j,m(reversed,(lambda s: zip(*[iter(s)]*(len(s)/2)))(t+"\x01"*(len(t)%2))))]),raw_input("Plaintext:")))(''.join,map).replace("\x01","")
ラムダ式いっぱいの非常に読みづらいコードですね。
見たところ文字列の長さにのみ依存して文字種は関係なさそうなので、
flagの長さである35字を入力して挙動を判断し、復号しようと思います。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi
に対し、MLNJKRQOPDCEABIHFGedfbcighVUWSTaZXY
が得られるので、
このML~Yとflagのn1~sを対応させ、ML~Yをソートし、AB~iという順にすればflagが手に入ることがわかります。
c = list('n1s4_t1An(f1ctdb@mpl_h3)m3lp3y__Eas') m = list('MLNJKRQOPDCEABIHFGedfbcighVUWSTaZXY') tuple = zip(c,m) tuple = sorted(tuple, key=lambda tuple: tuple[1]) print ''.join(map(lambda t: t[0], tuple))
出力結果:ctf(1@mbd4_1nsAn1ty_pl3asE_h3lp_m3)
crash
配布されたzipを展開すると、flag.txtがありますが何も書かれていません。
$ ls -a
などで隠しファイルを見ると.flag.txt.swp
が見つかります。
.swpはvim swap fileのことでvim(vi)でファイルの編集中にクラッシュした時などに
swapに保存してあるファイルの変更情報からクラッシュ前に復元するためのファイルです。
vimでflag.txtを開き、swapファイルから復元するとflagが得られます。
ctf(v1m_is_be77er_than_3macs)
とけなかった
cafebage
普通にjpgファイルを開くとファイルが大きすぎるのか落ちました。GIMPで開いてみると横に長い画像が開け、なんとなくズームしたところ16進数の数値列を発見しました。
Free Online OCR - convert scanned PDF and images to Word, JPEG to Wordなどで抽出しようと試みたのですが、画像を拡大、補正が必要そうで、時間が足りずここで断念しました。