Gen's blog

CTFとか、競プロとか、その他諸々

BITSCTF 2017 writeup

Harekazeで参加し、チームは520ptで18位でした。 私は5問解いて140pt入れました。

[Crypto 20] Banana Princess

PDFっぽいファイルを渡されるが、そのままだと開けない。バイナリエディタなどで開くと、ヘッダなどがおかしいことがわかる。本来であれば %PDF-1.5 であるべき部分が %CQS-1.5 になっているので、rot13だとわかった。

import string

with open('./MinionQuest.pdf', 'rb') as f:
    pdf = list(f.read())
    for i, c in enumerate(pdf):
        if c in string.ascii_letters:
            pdf[i] = c.encode('rot13')
    with open('./flag.pdf', 'wb') as out:
        out.write(b''.join(pdf))

出力されたPDFを開くと、Flagの部分が黒塗りされていて見えない。どこかで見たことある問題だなあと思いつつ、LibreOfficeで開いて黒塗り部分を削除すると、Flagが読めた。

BITSCTF{save_the_kid}

[Crypto 60] Sherlock

渡された final.txt を読むと、不自然に大文字になっている箇所があるので、スクリプトを書いて取り出すと ZEROONE という文字列の羅列になっていることがわかった。それぞれ数字の0と1に置換して、8bitずつ文字と解釈するとFlagが出てきた。

import string

with open('./final.txt', 'r') as f:
    txt = f.read()
    flag = []
    for c in txt:
        if c in string.ascii_uppercase:
            flag.append(c)
    bin = ''.join(flag).replace('ZERO', '0').replace('ONE', '1')
    print(''.join([chr(int(bin[i:i+8],2)) for i in range(0, len(bin), 8)]))

BITSCTF{h1d3_1n_pl41n_5173}

[Forensics 10] Woodstock-1

pcapファイルを渡されるので、Wiresharkで開いてみるとTCPのパケットが沢山ある。とりあえずTCPストリームを見てみたらFlagがあった。

BITSCTF{such_s3cure_much_w0w}

[Forensics 30] flagception

わけがわからず放置していたら、megumishさんがトップページのロゴの画像にある旗の色がおかしいことを発見。拡大して見てみると、

f:id:Gen_IUS:20170206100233p:plain

というようなパターンが見つかる。ちょうど1行に8パターンあるので、濃い方を1、薄い方を0として文字にすると、最初がBとわかったので、そのまま人力で解いた。解いたあと目が痛かったので、素直にソルバ書けばよかったと後悔した。

BITSCTF{f1agc3pt10n}

[Rev 20] Mission improbable

ファイル名にある TEENSY31ぐぐると、マイコンが出てくる。そのマイコンで動作するバイナリなんだろうなあと思いつつ、ディスアセンブル方法をぐぐると、

avr-objdump -j .sec1 -d -m avr5 MissionImprobable.TEENSY31.hex

で一応ディスアセンブルはできることがわかった。

全然読む気が起きないので、もうちょっとぐぐると、

avr-objcopy –I ihex –O binary MissionImprobable.TEENSY31.hex MissionImprobable.TEENSY31.bin

で、ふつうのバイナリに変換できることがわかった。変換後にstringsをかけるとFlagが見えた。

BITCTF{B4d_bad_U5B}

感想

pwnの練習しなさすぎて、自明っぽいpwnすら解けなかったので練習しなければな、と思いました。