CTF for ビギナーズ 2016 長野
CTF for ビギナーズ 2016 長野参加してきました。
プロによる講習を受けたので、プロに一歩近づいたような感じがする。
講習は、バイナリ、Web、フォレンジックの3つ。
内容としては、初心者向けといった感じでctf4bに適した良い講習でした。
フォレンジックで、知らなかったツールの使い方を知れたのがよかった。
講習後には、メインコンテンツとも言える実践編。
問題は、講習の内容+αといった感じ。ちょうどよかった。
結果は、全体50人弱中3位でした。
点数で見れば、1位、2位と同点で、3人の同点優勝という感じだったのですが、
ルール上では先にその点数に到達した方が上になるので、3位でした。
後から解けた問題もあったので、惜しかったなーといった感じ。
以下が、解けた問題のwriteup。
練習
そのまま
Leet
Wikiepediaの一覧と見比べながら
てけいさん for びぎなーず
残り時間5分でスクリプトを書いている余裕がなかったので、100回計算問題を解いたらフラグが取れた。
ぴょんぴょん
とりあえずdisasしてみると、フラグを出してくれそうな関数がいた。
コマンドライン引数の数が0x37dあれば良いらしいが、めんどうなので、eipを書き換えてprint_flag関数を実行させてみることにした。
main関数に入ったらブレークして、eipを書き換え、そのまま実行したらフラグが取れた。フラグから、正攻法だったようでよかった
しんぷるさいふぁー
参加者で自分だけが解けていた。
デコンパイルしたソースコードを読むと、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
みてみよう
pcapファイルを見てみると、HTPPでflag.pngへとアクセスしてみる。レスポンスコードが200なので、画像を抽出してみた。
抽出した画像をexiftoolでみてみると、flagが取れた
みわけよう
pcapファイルには、いくつかのHTTPでのアクセスとそのレスポンスがキャプチャされていた。
縦読み(?)だと思い、並べてみるとフォーマットに合致した文字列となった。
このままではダメだったので、400レスポンスの文字列を排除してみたところ上手くいった。
つないでみよう
pcapファイルには、/networl/へのHTTPアクセスのみであった。
http://172.20.1.1/networkへアクセスしてみたところ、flagへのリンクがあり、flagゲット!
ping-pong
講習の内容そのままだったので、そのままやった。