CSAW CTF 2013 Qualification Round に挑戦した (with Write Up)
概要
- CSAW CTF
- 2013年9月19日 18:00 〜 9月22日 18:00 (EDT)
- 入門レベルのCTFの大会
- 今年で10年目
- 決勝ラウンドへはUS,Canadaのチームのみ出場可能
CSAW CTFに挑戦して
大学院で結成した有志のチームで引き続き参加しました。入門レベルのCTFだけあって簡単な問題はかなり簡単でした。それに、しばらくしてから運営側からヒントが出されるという初心者には本当に優しいCTFです。自分は日本時間の9月21日の午後しか挑戦できませんでしたが、多少チームに貢献出来たのかなーと思います。
以下に簡単だった問題のWriteUpを記しますが、CTF初心者の人も少し頑張れば解ける問題もあるのでぜひ来年はトライしてみてほしいです。
簡単な問題のWriteUp
Exploitation 100
この問題は、netcatで特定のIPアドレスに接続すると、課題となるプログラムが動作しており、何かしらの入力を与えてサーバが保持しているKeyファイルの内容を出力させるという問題です。IPアドレスの他に、この問題では、バイナリファイルとソースコードもダウンロード出来る問題でした。
ダウンロード出来たソースコードは下記の様な内容です。
void handle(int newsock) { int backdoor = 0; char buffer[1016]; memset(buffer, 0, 1016); send(newsock, "Welcome to CSAW CTF.", 21, 0); recv(newsock, buffer, 1020, 0); buffer[1015] = 0; if ( backdoor ) { fd = fopen("./key", "r"); fscanf(fd, "%s\n", buffer); send(newsock, buffer, 512, 0); } close(newsock); }
やっていることは至って簡単で、
- int型のbackdoorを0に初期化
- char型のbufferの配列を宣言しmemsetで0で初期化
- newsockに”Welcome to CSAW CTF.”という文字列を送る
- newsockから1020バイト分、bufferへセットします
- bufferの1015番目に0を代入する
- backdoorが真ならばkeyファイルを読み込んでnewsockに512バイト分送信する
- newsockをクローズする
注目すべき点は、recvメソッドで受け取るバイト数が入れ物のbuffreのサイズより4バイト分多い点と、backdoorとbufferの宣言の順番です。メモリ上には[buffer][backdoor]という順番で変数の領域が確保されるので、bufferのバイト数より多い4バイト分がちょうどint型のbackdoorを上書きしてくれます。つまり、 aなどの適当な文字を1016文字と0x31(10進数で1)を送信してやればKeyの内容のフラグが帰ってきます。
ちなみに、Exploitation 200 はこの問題とほぼおなじで、おそらく配列のサイズがランダマイズされているんだろうなーというところまではわかったのですが、、、バイナリ与えられているんだから解析すればいいんですけど、うーん… Disassembler買うか…
Miscellaneous 50-1
この問題はネットワーク系の問題で、与えられるpcapファイルからキーを探せという問題です。とりあえず、Wiresharkで開くと、Telnetの通信が大半のようです。とりあえず適当なパケットを選択してFollowTCPStreamしてみます。すると、バーチャルマシンのログインIDとパスワードらしきものが出てきて、そのパスワード欄にフラグがありました。一問目だけあって簡単ですね。
Miscellaneous 50-2
この問題も、ネットワーク系の問題で、50−1と全く同じpcapファイルと、pcap.processファイルの二つがあります。pcap.processファイルをWiresharkで開くと、パケットが中途半端というエラーが出ますが、なんとか開けました。
パケットのプロトコルを見ると、HCI H4 とあり、これはBluetoothのプロトコルのようです。WireSharkではこれ以上の情報をエルことが出来ませんでした。いきなり難しくなるのかなー?と思って試しにバイナリエディタで開いてみると、flag{XXX},exeというファイルをやりとりしている様な痕跡が見えるではありませんか。案の定このXXXの値で正解でした。