SECCON信州大会CTF Write-up
解いた順。(多分)
パスワードを探せ (バイナリ, 100pt)
stamp.exe
exeのダウンロードリンクのみが与えられた。exeを起動すると以下のウィンドウが表示された。
IDAに読み込ませて眺めていると、以下の様な関数を発見した。
2つのループでそれぞれ別々にTextOutAを繰り返し呼んでいる。片方では座標を配列から決定していて、もう片方ではrandから決定している。
怪しい。OllyDbgで両方のTextOutAにブレークポイントを仕掛けて実行し、何度かポチポチしていたらフラグが出てきた。
解答
ST4MPS3CURITY
2012/4/27 11:08:54 に作成されたエントリの名前は何ですか? (フォレンジック, 100pt)
ファイル Filesystem001.bin の内容を確認し、次の設問に回答してください。
2012/4/27 11:08:54 に作成されたエントリの名前は何ですか?Filesystem001.bin
こんな感じ。
0000000: 2e 20 20 20 20 20 20 20 20 20 20 10 00 59 dc 58 . ..Y.X 0000010: 9b 40 9b 40 00 00 dd 58 9b 40 05 00 00 00 00 00 .@.@...X.@...... 0000020: 2e 2e 20 20 20 20 20 20 20 20 20 10 00 59 dc 58 .. ..Y.X 0000030: 9b 40 9b 40 00 00 dd 58 9b 40 00 00 00 00 00 00 .@.@...X.@...... 0000040: 42 2e 00 6a 00 70 00 67 00 00 00 0f 00 c7 ff ff B..j.p.g........ 0000050: ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff ................ 0000060: 01 43 00 68 00 72 00 79 00 73 00 0f 00 c7 61 00 .C.h.r.y.s....a. 0000070: 6e 00 74 00 68 00 65 00 6d 00 00 00 75 00 6d 00 n.t.h.e.m...u.m. 0000080: 43 48 52 59 53 41 7e 31 4a 50 47 20 00 1d e3 58 CHRYSA~1JPG ...X 0000090: 9b 40 9b 40 00 00 8d 6e ee 3a 06 00 22 6b 0d 00 .@.@...n.:.."k.. 00000a0: e5 44 00 65 00 73 00 65 00 72 00 0f 00 e3 74 00 .D.e.s.e.r....t. 00000b0: 2e 00 6a 00 70 00 67 00 00 00 00 00 ff ff ff ff ..j.p.g......... 00000c0: e5 45 53 45 52 54 20 20 4a 50 47 20 00 20 e3 58 .ESERT JPG . .X 00000d0: 9b 40 9b 40 00 00 8d 6e ee 3a dd 00 75 e8 0c 00 .@.@...n.:..u... 00000e0: e5 67 00 00 00 ff ff ff ff ff ff 0f 00 1d ff ff .g.............. 00000f0: ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff ................ ...... 0000b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000b90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000ba0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000bb0: 00 00 00 00 00 00 00 00 ........
8.3ファイル名が見えるのでFATの一部を切り出したバイナリっぽい。適当なFATのイメージを作って同じタイムスタンプのファイルを作ることにする。
dd if=/dev/zero of=fat16.bin count=65536 mkfs.vfat -F 16 fat16.bin sudo mount -o loop fat16.bin /mnt/work0 sudo touch -t 1204271108.54 /mnt/work0/MIKU sudo umount /mnt/work0
作成したファイル名でfat16.bin中を検索。
00107f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0010800: 4d 49 4b 55 20 20 20 20 20 20 20 20 00 00 2d 5e MIKU ..-^ 0010810: 46 43 9b 40 00 00 1b 59 9b 40 00 00 00 00 00 00 FC.@...Y.@...... 0010820: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x0010816:0x001081aの1b 59 9b 40がなんとなくタイムスタンプっぽかったので、その値でFilesystem001.bin中を検索した。
00004a0: 41 50 00 61 00 6e 00 64 00 61 00 0f 00 90 2e 00 AP.a.n.d.a...... 00004b0: 6a 00 70 00 67 00 00 00 ff ff 00 00 ff ff ff ff j.p.g........... 00004c0: 50 41 4e 44 41 20 20 20 4a 50 47 10 00 04 1b 59 PANDA JPG....Y 00004d0: 9b 40 9b 40 00 00 1c 59 9b 40 9b 05 00 00 00 00 .@.@...Y.@......
解答
Panda.jpg
RXでアセンブラ短歌 (プログラミング, 100pt)
以下のアセンブラ短歌で出力される文字列は? fb 7e 67 6d 62 fb 62 15 08 0c 65 03 fc 37 67 7e a7 66 11 66 43 66 55 03 ef 02 75 60 ff 67 01
( ´_ゝ`)……。
IDAではRXシリーズは逆アセンブルできなかった。objdumpで逆アセンブルしようと思って "objdump rx renesas" 等のキーワードで検索したがヒットしない。まだ対応していないのかと思いルネサスの開発キットやマニュアル等を当たっていた所、隣で同じ問題を解いていた@maytheplicが「RXシリーズ用のgccならあった」 と言ってRX用gccについてのWebページを見せてくれた。これで気付いた。gccがあるならbinutilsもあるはずであり、検索するならobjdumpではなくbinutilsで検索すべきだった。
"binutils rx"等のキーワードで検索をして、このページに行き着いた。アーキテクチャ欄に"elf32-rx-be"等があるので使えるはず。早速逆アセンブル。
>all-objdump.exe -D -b binary -mrx rxasm.bin rxasm.bin: file format binary Disassembly of section .data: 00000000 <.data>: 0: fb 7e 67 6d 62 mov.l #0x626d67, r7 5: fb 62 15 08 0c 65 mov.l #0x650c0815, r6 b: 03 nop c: fc 37 67 xor r6, r7 f: 7e a7 push.l r7 11: 66 11 mov.l #1, r1 13: 66 43 mov.l #4, r3 15: 66 55 mov.l #5, r5 17: 03 nop 18: ef 02 mov.l r0, r2 1a: 75 60 ff int #255 1d: 67 01 rtsd #4
解答
% python -c "from struct import pack; print pack('<I', 0x626d67 ^ 0x650c0815)" rene
キーワードは番組の中で。 (ネットワーク, 200pt)
10.0.2.3 2222/tcpでサーバが動作しています。
パーツを集めて正解文字列を特定してください。
答えは正解文字列のsha1ハッシュ値です。
10.0.2.3:2222にncで接続すると4~5桁の数字が送られてきて数秒間(?)停止した後に通信が切れる という様な挙動を示した。送られてくる数字は以下の6つの数字のいずれかで接続毎(1秒毎?)に不規則に変わっていた。
7372 8271 9812 16212 39812 54721
数字の規則性などを見出そうとしばらく悩んだ後、この問題のジャンルがネットワークである事からこれらの数字はポート番号ではないかと気付いた。通信が停止している最中にncでそのポートに接続してみた所、文字が1文字だけ送られてきて通信が切れた。ポート番号毎に送られてくる文字は決まっていて、以下のように対応していた。
{7372: 's', 8271: '3', 9812: 'C', 16212: 'C', 39812: '0', 54721: 'N'}
解答
% echo -n "s3Cc0N" | sha1sum fdc6a976e1971ca680ed5328814333cbff321881 -
キーワードは番組の中で(2) (ネットワーク, 300pt)
10.0.2.3 3333/tcpでサーバが動作しています。
パーツを集めて答えを見つけてください。
今回はたぶん人力では無理です、かしこ。
基本は1と同じ。ポート番号を送ってくる接続がすぐ切れる点と、送られてきたポート番号で接続しに行った時に降ってくるデータがやたらデカい点が違っていた。
3333/tcpにポート番号を聞きに行って各ポートからの受信データを全てつなぎ合わせて保存するPythonスクリプトを適当に書いた。
#!/usr/bin/env python import subprocess import time def set_nonblocking(fh): import fcntl import os fd = fh.fileno() fl = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) ports = {} for _ in xrange(50): target0 = subprocess.Popen(['nc', '10.0.2.3', '3333'], stdout=subprocess.PIPE) set_nonblocking(target0.stdout) time.sleep(0.1) portnum = target0.stdout.read().rstrip() target1 = subprocess.Popen(['nc', '10.0.2.3', portnum], stdout=subprocess.PIPE) set_nonblocking(target1.stdout) time.sleep(0.3) recv = target1.stdout.read() target0.kill() target1.kill() if int(portnum) not in ports or len(ports[int(portnum)]) < len(recv): ports[int(portnum)] = recv recvdata = "" for key in sorted(ports.iterkeys()): recvdata += ports[key] with open('recvdata.bin', 'w') as f: f.write(recvdata)
(接続周りが変だったので変なことをしている)
% file recvdata.bin recvdata.bin: Zip archive data, at least v2.0 to extract % unzip recvdata.bin Archive: recvdata.bin inflating: q3.exe
解答
>q3.exe key = sashimi-umai
反省とか
4時間の短期決戦だったので、ピンと来ない問題を避けて解ける問題に集中した。正しい選択だったと思う。
"We are still here"が解けなかったのが残念。実行ファイルではなくSECCON横浜の"King of 目grep"的な問題かと思っていたがWriteupを読んで納得した。Web問の "管理者ページからキーを探せ" は解けなかったがチームメイトが頑張ってくれていた。お疲れ様と言いたい。
参加者の皆さん、今回のCTFを企画して下さったSECCON実行委員会の皆さんお疲れ様でした。ありがとうございました。(メール対応お手数おかけしました。ありがとうございました)