yyp٩( 'ω' )و

色々触って遊んでます

第2回 SECCON Beginners CTF Write-up

まえがき

初めてCTFに参加しました。
解けたのは下記2問。
- Misc: [warmup]Welcome
- Reversing: [warmup]Seccompare
正直今回は初参加だし、全然解けなくてもいいや〜と思っていたので、ちょっとでも解けてよかったです。

CTFとは?

CTFとは、"Capture the Flag"の略で、プログラムに埋め込まれているFlagを自分の持っているIT知識を駆使してGetする競技です。
何人かでチームを組んでも、一人で参加してもいいみたいです。
問題の分野はその会によって違いますが、今回参加したSECCON Beginnersは下記5分野でした。

  1. Web
  2. Pwnable
  3. Reversing
  4. Crypto
  5. Misc

細かい説明はwikipediaさんへ…
セキュリティ周りの知識が必要なので、その辺りに興味がある人は楽しいと思います。

環境

  • OS: macOS Mojave
  • OS version: 10.14.4
  • VirtualBox: 5.2.28
  • Kali Linux: 2019.2

    【Misc】[warmup]Welcome

    「SECCON Beginners CTFのIRCチャンネルで会いましょう。」とあります。
    何のことかよく分からずしばらく別の問題に取り組んでいたのですが、ルールを確認しようと思ってスコアサーバのRulesページをみたら、IRCへのリンクがあります。
    これをクリックすると"Connect to freenode IRC"ページに飛ぶので、必要事項を入力して"Connect"をクリックします。
    すると、IRCのページの一番上にFlagが表示されています。
    f:id:mizukichi3:20190526203439p:plain これでFlagゲットです。

    【Reversing】[warmup]Seccompare

    Kali Linuxsshし、Seccompareのファイルをwgetします。

$ wget https://score.beginners.seccon.jp/files/seccompare_44d43f6a4d247e65c712d7379157d6a9.tar.gz  

圧縮されているので解凍します。

$ tar xvzf seccompare_44d43f6a4d247e65c712d7379157d6a9.tar.gz  
./._seccompare
./seccompare

"seccompare"と"._seccompare"というファイルが生成されました。
どんなファイルか確認します。

# seccompareファイル  
$ file seccompare  
seccompare: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=4a607c82ea263205071c80295afe633412cda6f7, not stripped  
# ._seccompareファイル  
$ file ._seccompare 
._seccompare: AppleDouble encoded Macintosh file

"seccompare"の方は実行するファイルみたいです。
"._seccompare"の方はMac用にエンコードされたファイルみたいです。
grepしてファイルの中にflagがないか見てみます。

# 今回のflagの形式で検索  
$ grep ctf4b ./ -r
ヒットなし  
# "flag"という文字列で検索  
$ grep flag ./ -r
Binary file ./seccompare matches

"seccompare"ファイルの中に"flag"が含まれているようです。
stringsで"seccompare"ファイルの文字列だけ出力します。

$ strings seccompare  
/lib64/ld-linux-x86-64.so.2
libc.so.6
puts
......  
usage: %s flag
correct
wrong

flagという文字列がありました。
ファイルの権限を変えて、実行してみます。

$ chmod 755 seccompare  
$ ./seccompare 
usage: ./seccompare flag

引数が必要みたいです。
適当に引数を与えて再度実行してみます。

$ ./seccompare flag
wrong

どうやら正誤判定をしているらしいというところまで分かりました。
ltraceでトレースしながら実行してみます。

$ ltrace ./seccompare flag
strcmp("ctf4b{5tr1ngs_1s_n0t_en0ugh}", "flag")                          = -3
puts("wrong"wrong
)                                                           = 6
+++ exited (status 0) +++

strcmpは文字列の比較をするC言語のコマンドみたいです。
"ctf4b{5tr1ngs_1s_n0t_en0ugh}"と引数を比較しているみたいです。
引数"ctf4b{5tr1ngs_1s_n0t_en0ugh}"を与えてみると…

$ ltrace ./seccompare ctf4b{5tr1ngs_1s_n0t_en0ugh}
strcmp("ctf4b{5tr1ngs_1s_n0t_en0ugh}", "ctf4b{5tr1ngs_1s_n0t_en0ugh}")  = 0
puts("correct"correct
)                                                         = 8
+++ exited (status 0) +++

correctでした!flagゲットです。

まとめ

他の問題にも挑戦したのですが、分かりそうで分からなくて、「俺にもっと力があれば…!」という気持ちで取り組んでいました。
サーバは6/9までオープンしているそうなので、他の方のWrite-upなどを見つつやってみたいなと思います。