読者です 読者をやめる 読者になる 読者になる

ブログ未満のなにか

ブログなのか誰にも分からない

CTF for ビギナーズ 2016 長野

writeup

CTF for ビギナーズ 2016 長野参加してきました。

プロによる講習を受けたので、プロに一歩近づいたような感じがする。

講習は、バイナリ、Web、フォレンジックの3つ。

内容としては、初心者向けといった感じでctf4bに適した良い講習でした。

フォレンジックで、知らなかったツールの使い方を知れたのがよかった。

講習後には、メインコンテンツとも言える実践編。

問題は、講習の内容+αといった感じ。ちょうどよかった。

結果は、全体50人弱中3位でした。

点数で見れば、1位、2位と同点で、3人の同点優勝という感じだったのですが、

ルール上では先にその点数に到達した方が上になるので、3位でした。

後から解けた問題もあったので、惜しかったなーといった感じ。

f:id:hama7230:20160520234226p:plain

以下が、解けた問題のwriteup。

練習

そのまま

Leet

Wikiepediaの一覧と見比べながら

Base64

そのままBase64でデコード

てけいさん for びぎなーず

残り時間5分でスクリプトを書いている余裕がなかったので、100回計算問題を解いたらフラグが取れた。

ぴょんぴょん

とりあえずdisasしてみると、フラグを出してくれそうな関数がいた。

コマンドライン引数の数が0x37dあれば良いらしいが、めんどうなので、eipを書き換えてprint_flag関数を実行させてみることにした。

f:id:hama7230:20160520234220p:plain

main関数に入ったらブレークして、eipを書き換え、そのまま実行したらフラグが取れた。フラグから、正攻法だったようでよかった

f:id:hama7230:20160520234637p:plain

しんぷるさいふぁー

参加者で自分だけが解けていた。

デコンパイルしたソースコードを読むと、ASCIIコードから乱数の値を引いたものを出力している。

乱数にシードがないので、常に乱数の値は一定であるとみて、適当に文字列を与えて、結果を吐き出させてみた。その差を元に復号するスクリプトを書いた。

enc = "D4E5D7A5D3ECE4E6D3D0DADFE4E5E3E6D4E5DAE0DFD0DED2EAD0D4D2E6E4D6D0E0E7D6E3D7DDE0E8EE"

st = enc.lower().decode("hex")
print st
print st.encode("hex")

t = ""
for c in st:
h += chr(ord(c)-113)
print t

f:id:hama7230:20160521000106p:plain

みてみよう

pcapファイルを見てみると、HTPPでflag.pngへとアクセスしてみる。レスポンスコードが200なので、画像を抽出してみた。
抽出した画像をexiftoolでみてみると、flagが取れた

みわけよう

pcapファイルには、いくつかのHTTPでのアクセスとそのレスポンスがキャプチャされていた。
縦読み(?)だと思い、並べてみるとフォーマットに合致した文字列となった。
このままではダメだったので、400レスポンスの文字列を排除してみたところ上手くいった。

つないでみよう

pcapファイルには、/networl/へのHTTPアクセスのみであった。
http://172.20.1.1/networkへアクセスしてみたところ、flagへのリンクがあり、flagゲット!

ping-pong

講習の内容そのままだったので、そのままやった。

PHP!PHP!PHP!

これもまた講習の内容そのままだった。
"x[]=0&y=9e9"を付与して投げたら、flagが取れた.