- 開催日時
2014/5/18〜5/19
- 情報共有
IRC, サイボウズ
- チーム
mochigoma
一日目、二日目午前まで予定があったため、私が参加したのは二日目の19日12時から。 事前に NTTコムの予選参加レポート 、Writeupなどを確認してWeb系ならまだ行けそうだな、という感覚で臨んだ。大会1週間を切ってからDEFCONに参加することになったため、準備不足感が半端ない。 バイナリ問題全然解けんぞ。。。
本番二日目、問題に手をつけ始める前にまずカテゴリがどうなっているのか確認した。 https://2014.legitbs.net/scoreboard/categories を参照のこと。
こんな問題が出題されるのかなーと思って自分用にメモしておいた。下記に記載する。
- Baby’s First
- 最初に開かれている問題
- Duchess
- ソフトウェア関連の問題
- Gynophage
- バイナリ関連の問題
- HJ
- どんな分野の問題が出てくるのか分からなかった。ホラー映画に出てくるような山小屋に住んでいる、ひげの生えたフランス言語学の熱狂者?
- Jymbolia
- パズル問題
- Lightning
- 常軌を逸した考えが必要な問題
- Selir
- ネットワーク関連の問題
- Sirgoon
- 電波、電気の復調に関する問題? 暗号の復号化なんですかね。
- Vito Genovese
- 暗号問題
ソフトウェア関連問題がこの中で解けそうだったので、Duchessから取り組もうと思ったが、19日13時時点でまだロックされた状態だった。
19日12時時点でチームメンバーに全て解かれていたため、何も手をつけなかった。
問題文
Just open /flag, and write it to stdout. How hard could it be?
polyglot_9d64fa98df6ee55e1a5baf0a170d3367.2014.shallweplayaga.me 30000
Password: w0rk_tHaT_tAlEnTeD_t0nGu3
とりあえずNetCatで繋いでみる。
$ nc polyglot_9d64fa98df6ee55e1a5baf0a170d3367.2014.shallweplayaga.me 30000
Password: w0rk_tHaT_tAlEnTeD_t0nGu3
Give me shellcode. You have up to 0x1000 bytes. All GPRs are 0. PC is 0x41000000. SP is 0x42000000.
0Throwing shellcode against linux26-x86.(http://services.2014.shallweplayaga.me/polyglot_9d64fa98df6ee55e1a5baf0a170d3367)
xx
Didn't send back the right value. Fail.
実行結果に、 http://services.2014.shallweplayaga.me/polyglot_9d64fa98df6ee55e1a5baf0a170d3367 が書かれていたため、 wget http://services.2014.shallweplayaga.me/polyglot_9d64fa98df6ee55e1a5baf0a170d3367
を叩いてみたら実行ファイルを手に入れられた。 file
コマンドを叩いてみたら、 ELF 32-bit LSB executable
ということが分かったので、 objdump -D
、 readelf -a
で解析してみるものの、これといった手がかりが掴めなかったため、途中で断念した。
問題文
Such a simple daemon.
http://services.2014.shallweplayaga.me/sftp_bf28442aa4ab1a4089ddca16729b29ac
sftp_bf28442aa4ab1a4089ddca16729b29ac.2014.shallweplayaga.me:115
さっそくNetCatで繋いでみた。
$ nc sftp_bf28442aa4ab1a4089ddca16729b29ac.2014.shallweplayaga.me 115
+LegitimateBusinessSyndicate SFTP
この状態でテキトーに文字入力をしてみると、 -Not Logged In.
と表示された。どうやらログインをしなければ次に進めない様子。 wget http://services.2014.shallweplayaga.me/sftp_bf28442aa4ab1a4089ddca16729b29ac
でバイナリをゲット後、file
コマンドでどのようなファイルか確認した。
$ file sftp_bf28442aa4ab1a4089ddca16729b29ac
sftp_bf28442aa4ab1a4089ddca16729b29ac: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, stripped
今回もELF 32bitのため、IDAで解析をしていった。 まずログインをするのにパスワードが必要だと思い、Hex ViewでPASSを検索していったところ、怪しい箇所を発見した。
defcon2014と入力したらいけんじゃね?と思ったらダメで、チームメイトが先にバイナリ解析をして PASS defcon2014
と入力すれば良いと教えてくれた。慣れない作業で終始辛い。。。
$ nc sftp_bf28442aa4ab1a4089ddca16729b29ac.2014.shallweplayaga.me 115
+LegitimateBusinessSyndicate SFTP ServicePASS defcon2014
! Logged in
今回バイナリ解析ができないとチームに貢献できないことが分かったので、 Hacking: 美しき策謀 第2版 、 アナライジング・マルウェア を早速買って帰ってきて読み始めている。 CTF終了後のWriteupを読み進めやすくするためにも基礎となる部分をこの本で補いたい。
DEFCON CTF、全く歯が立たなかったけど純粋に面白かった。 周りの方と一緒に取り組んで非常に刺激を受けたし、セキュリティ分野の引き出しが増えたので、参加して本当に良かった。 次回も参加したい。最低一問は解けるようになりたいっすね。 参加者各位、本当に2日間お疲れ様でした。
ざっくりとしたメモ書き
disas
で逆アセンブル
(gdb) disas main
Dump of assembler code for function main:
0x08048180 <+0>: push %ebp
0x08048181 <+1>: mov %esp,%ebp
0x08048183 <+3>: sub $0x18,%esp
0x08048186 <+6>: and $0xfffffff0,%esp
0x08048189 <+9>: mov $0x0,%eax
0x0804818e <+14>: add $0xf,%eax
0x08048191 <+17>: add $0xf,%eax
0x08048194 <+20>: shr $0x4,%eax
break
でブレークポイントを設定
(gdb) break *0x080481dd
Breakpoint 1 at 0x80481dd
run
でプログラムの実行
(gdb) run
Starting program: /home/nikuyoshi/Downloads/polyglot_9d64fa98df6ee55e1a5baf0a170d3367
Breakpoint 1, 0x080481dd in main ()
info
でブレークポイントに関する情報を表示。
(gdb) info register
eax 0xffffd908 -9976
ecx 0x804d928 134535464
edx 0x804d928 134535464
ebx 0x804d928 134535464
esp 0xffffd8e0 0xffffd8e0
ebp 0xffffd918 0xffffd918
esi 0xffffdb1c -9444
edi 0x0 0
eip 0x80481dd 0x80481dd <main+93>
eflags 0x296 [ PF AF SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x0 0
x
でメモリの内容を表示
(gdb) x/x 0xffffd908
0xffffd908: 0x00000005
逆アセンブルをするのに使用した。 Macで無償版が無いようだったので、Windowsにインストールした。
32bitで動くバイナリを64bit環境で気付かずに実行しててハマった。
$ ./sftp_bf28442aa4ab1a4089ddca16729b29ac
zsh: そのようなファイルやディレクトリはありません: ./sftp_bf28442aa4ab1a4089ddca16729b29ac
実行ファイルあるのにメッセージがこれで、なんじゃコレってなってたら、32bit用のバイナリ実行用のパッケージをインストールすれば問題ないことが分かった。
$ sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0
$ ./sftp_bf28442aa4ab1a4089ddca16729b29ac
+LegitimateBusinessSyndicate SFTP Service
参考: http://askubuntu.com/questions/107230/what-happened-to-the-ia32-libs-package
IDAでバイナリを追いながら、擬似コードを作成していくと良いとのこと。 http://www.ntt.com/wideangle_security/images/DEFCON_CTF.pdf
int ff(){
do {
get_meta();
} while (handle_checks());
}