yyy

CTFつよくなりたい

PlaidCTF 2017 Writeup

開催期間(JST)

04/22 AM6:00 ~ 04/24 AM6:00

結果

・チーム名:wabisabi

・得点:51pt

・順位:332/1150

解いた問題

・sanity check(Misc 1)

・zipper(Misc 50)

取り組んだが解けなかった問題

・Pykemon(Web 151)

・no_mo_flo(Reversing 125)

はじめに

参加しました.

また1問しか解けてないやんけ!!!ってことで,とりあえずやったことまとめ.

Writeup

sanity check(Misc 1)

PCTF{poop}

zipper(Misc 50)

問題文

Something doesn't seem quite right with this zip file. 

Can you fix it and get the flag?

zipファイルが渡される.

解凍しようとすると,

Archive:  zipper_50d3dc76dcdfa047178f5a1c19a52118.zip
warning:  filename too long--truncating.
:  bad extra field length (central)

バイナリを読む.

f:id:ywkw1717:20170424095413p:plain

ファイル名のサイズを格納しているところが2923となっていることから,めちゃくちゃな長さになっていることがわかる.(0x2329 → 9001文字?)

ここを正しい値にしないといけないが,正しい値がわからないので他の情報を元に修正する.

まず,zipファイルは大体,Local file header,File data,Central directory header,End of central directory recordの4つのフィールドから構成されている.

ZIP書庫ファイル フォーマット - 略して仮。

ここが詳しい.

読んでいくと,格納データがASCIIであることや,デフレート形式で圧縮されていることなどがわかる.

Central directory headerのファイル名が格納されている場所と,End of centralのシグネチャに注目した.

この間に格納されているデータは,

-----------
relative offset
of local header
-----------
file name
------------
extra field
------------
file comment
------------
End of central
dir signature
(0x50,0x4b,0x05,0x06)
------------

のようになっており,Central directory headerを読むとfile commentは0であることから,End of central directoryのシグネチャがある部分からextra fieldのサイズ分手前に戻し,求まった場所とrelative offset of local headerの間にあるのがファイル名であり,ファイルサイズも求めることができる.

extra fieldのサイズは,0x18(24bytes)

求まったファイル名は,

0000 0000 0000 0000

サイズは,0x8であることがわかる.

よって,Local file headerとCentral directory headerにあるfile name lengthという2byteの領域に書いてある,

2923

を,以下のように変更する.

0800

これで,いけると思ったがファイル名が指定されていないので適当に

666c6167

flagとかいうファイル名で書き換える.

これで解凍すると,

Huzzah, you have captured the flag:
PCTF{f0rens1cs_yay}

このようなテキストファイルが抽出できて,おしまい.

取り組んだが解けなかった問題

Pykemon(Web 151)

問題文

Gotta catch them FLAGs! 

Take this with you.

flaskで書かれたWebアプリケーションが与えられる.

Pykemonという名前の,ポケモンの丸パクリのゲーム.Pykemonを捕まえて,その記録とかを見れる.FLAGを捕まえてFLAGを読みだす.

こんな感じ.

f:id:ywkw1717:20170424125010p:plain

ソースコードも与えられる.

コードを読んでいくと,それぞれのPykemonにrarityという捕まえられる確率的なものが設定されていて,結論から言うとFLAGを捕まえることは不可能.

どうにかして,捕まえる必要がある.

やったこととしては,Burpを使ってセッションを書き換えたり,Pykemonをrenameするところに以下のようなstored XSSを見つけたりした.

f:id:ywkw1717:20170424125326p:plain

XSS使って何かするんだろうなぁと思ってたんだけど,結局はセッションをローカルでデコードするだけで良かったっぽい.

詳しくは他の方のwriteupへ.

no_mo_flo(Reversing 125)

問題文

Can you go with the flow?

file

no_flo_f51e2f24345e094cd2080b7b690f69fb: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b9de9235c1a8c49096daba03ce36e334cf150c1c, stripped

入力を受け取り,32文字より小さければ

Short input

32文字与えると,

You aint goin with the flow....

正しい入力値を与えて,

Good flow!!

と出力する値を探す.

中で,チェッカーみたいな関数が2つありなにかやって,その戻り値で分岐していることはわかって,objdump, gdb, radare2を使ってこんな感じで↓頑張っていた.

f:id:ywkw1717:20170424145358p:plain

分岐を書き換えてGood flow!!にすることはできたけど,それでは意味なくて,結局タイムアップ.

感想

rev問に関しては,解けなかったけど1日中向き合ってたこともあって,アセンブリを読むことに抵抗がなくなって少しは読めるようになってきたので収穫はあった.

Web担当のid:ktr_0731,忙しくて参加できてないのかなぁと思っていたら忘れていたらしく,今度からremindしまくってやるからなという気持ち.