読者です 読者をやめる 読者になる 読者になる

SECCON信州大会CTF Write-up

解いた順。(多分)

パスワードを探せ (バイナリ, 100pt)

stamp.exe

exeのダウンロードリンクのみが与えられた。exeを起動すると以下のウィンドウが表示された。
f:id:xoreaxeax:20131010105129p:plain
IDAに読み込ませて眺めていると、以下の様な関数を発見した。
f:id:xoreaxeax:20131010105150p:plain
2つのループでそれぞれ別々にTextOutAを繰り返し呼んでいる。片方では座標を配列から決定していて、もう片方ではrandから決定している。
怪しい。OllyDbgで両方のTextOutAにブレークポイントを仕掛けて実行し、何度かポチポチしていたらフラグが出てきた。
f:id:xoreaxeax:20131010105202p:plain

解答

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実行委員会の皆さんお疲れ様でした。ありがとうございました。(メール対応お手数おかけしました。ありがとうございました)