DEFCON 19 CTF Binary L33tness 100 writeup

問題文: Your journey begins
ファイルはまとめて公開している方がいるのでそちらでどうぞ
b100で始まるやつです。

このファイルは何じゃろな。

tkito@ubuntu:~/CTF19/b100$ file b100_6817e51fa3b60f176b56
b100_6817e51fa3b60f176b56: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped

実行ファイルだというので実行してみる。

tkito@ubuntu:~/CTF19/b100$ chmod +x b100_6817e51fa3b60f176b56
tkito@ubuntu:~/CTF19/b100$ ./b100_6817e51fa3b60f176b56
./b100_6817e51fa3b60f176b56 [1-11|all]

試しにパラメータとして1を入れてみると…

tkito@ubuntu:~/CTF19/b100$ ./b100_6817e51fa3b60f176b56 1
H4sICJmMlU0AA2JpbjItYQAAGYDmfzd6vK8nHAADiX4awcXXBwAAAAAAVgAAAAAAAABE/zLqAD+RRYRoO97epg8j1uh8YELiOq3V
AGLLApTK6rlYLEJUfbuFA7AjiEibibmCYY3LzZtNmjivC1gt6wA+ZbuLo8SkO/lzVk2VQBa6XUP8kWbfjjMD5Gq5OLQ10TekvQDS
PV+do8rAY6zuu1A21HFTamb8rvPM5dmHusPFPemVy/FSwj8szTQ9k7LuEIDhBarqs4w36+p76Pcr3k+RF9pSx42qRV4ojtLjAbR3
(以下略)

右にはみ出してしまっているのは気にしない。
こんな感じでどわーっとテキストが出力されるが、よく見ると絵が書いてあるっぽい。
一部を切りだしたのが以下の画像。



ずっと見てるとちょっときもい。
こんなのが14回繰り返されている。
なお、1~11まで全て同じような出力が得られる。
構成文字を見てみると、スペースが入ってたり100文字で改行されてたり後ろの方はパディングなのか@で書かれてたりしたけれど、どう見てもBASE64です。本当にありがとうございました。
というわけでデコードする。
ちなみに各パラメータを入れた際の出力を1.txt~11.txt, all.txtとして保存している。
以下1~11までまとめて行けるところまで一気に処理。

tkito@ubuntu:~/CTF19/b100$ for i in `seq 1 11`; do base64 -id $i.txt > b100_1_`printf "%02d" $i`; done
tkito@ubuntu:~/CTF19/b100$ file b100_1_*
b100_1_01: gzip compressed data, was "bin2-a", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_02: gzip compressed data, was "bin2-b", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_03: gzip compressed data, was "bin2-c", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_04: gzip compressed data, was "bin2-d", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_05: gzip compressed data, was "bin2-e", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_06: gzip compressed data, was "bin2-f", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_07: gzip compressed data, was "bin2-g", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_08: gzip compressed data, was "bin2-h", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_09: gzip compressed data, was "bin2-i", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_10: gzip compressed data, was "bin2-j", from Unix, last modified: Fri Apr  1 01:28:09 2011
b100_1_11: gzip compressed data, was "bin2-k", from Unix, last modified: Fri Apr  1 01:28:09 2011
tkito@ubuntu:~/CTF19/b100$ for i in `seq -w 1 11`; do gzip -cd b100_1_$i > b100_2_$i; done
tkito@ubuntu:~/CTF19/b100$ file b100_2_*
b100_2_01: 7-zip archive data, version 0.3
b100_2_02: data
b100_2_03: data
b100_2_04: data
b100_2_05: data
b100_2_06: data
b100_2_07: data
b100_2_08: data
b100_2_09: data
b100_2_10: data
b100_2_11: data
tkito@ubuntu:~/CTF19/b100$ 7zr x b100_2_01

7-Zip (A) 9.04 beta  Copyright (c) 1999-2009 Igor Pavlov  2009-05-30
p7zip Version 9.04 (locale=en_US.utf8,Utf16=on,HugeFiles=on,2 CPUs)

Processing archive: b100_2_01

Error: Can not open file as archive

1と2~11が無関係なわけがない、と考えて結合することにした。

tkito@ubuntu:~/CTF19/b100$ cat b100_2_* > b100_3
tkito@ubuntu:~/CTF19/b100$ file b100_3
b100_3: 7-zip archive data, version 0.3
tkito@ubuntu:~/CTF19/b100$ 7zr x b100_3

7-Zip (A) 9.04 beta  Copyright (c) 1999-2009 Igor Pavlov  2009-05-30
p7zip Version 9.04 (locale=en_US.utf8,Utf16=on,HugeFiles=on,2 CPUs)

Processing archive: b100_3

Extracting  bin2

Everything is Ok

Size:       980647
Compressed: 514107

OK!
ちゃっちゃと進んでいこう。

tkito@ubuntu:~/CTF19/b100$ file bin2
bin2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
tkito@ubuntu:~/CTF19/b100$ ./bin2
UzAgUzBSUlkgNDFOVCBOVVRIMU4gQlVUIDQgUDM0TlVUIFMwIFMwUlJZIDQxTlQgTlVUSDFOIEJVVCA0IFAzNE5VVCBTMCBTMFJS
WSA0MU5UIE5VVEgxTiBCVVQgNCBQMzROVVQgUzAgUzBSUlkgNDFOVCBOVVRIMU4gQlVUIDQgUDM0TlVUIFMwIFMwUlJZIDQxTlQg
TlVUSDFOIEJVVCA0IFAzNE5VVCBTMCBTMFJSWSA0MU5UIE5VVEgxTiBCVVQgNCBQMzROVVQgUzAgUzBSUlkgNDFOVCBOVVRIMU4g
(以下略)

またかよ!
今度はこんな絵。

きもいです。
やっぱりBASE64っぽいのでデコード。

tkito@ubuntu:~/CTF19/b100$ ./bin2 > b100_4.txt
tkito@ubuntu:~/CTF19/b100$ base64 -id b100_4.txt > b100_4
tkito@ubuntu:~/CTF19/b100$ file b100_4
b100_4: Motorola S-Record; binary data in text format

知らないフォーマットではあるものの、テキストファイルっぽいので中身を見てみる。

tkito@ubuntu:~/CTF19/b100$ cat b100_4
S0 S0RRY 41NT NUTH1N BUT 4 P34NUT S0 S0RRY 41NT NUTH1N BUT 4 P34NUT S0 S0RRY 41NT NUTH1N BUT 4 P34NUT S0 S0RRY 41NT NUTH1N BUT 4 P34NUT
(以下略)

何だろうこれは。
S0 S0RRY 41NT NUTH1N BUT 4 P34NUTが延々と繰り返されている。
sorryとか言ってるし何かどっかで間違えたのだろう。
戻って別の道がないかどうかさがすことにした。

結果オーライではあったが、↑の判断はよくなかった。
何がよくなかったかというと、得られた謎の文字列を無意味なものだと断じてしまったこと。
もしかしたらこれが求めるべきKeyだったかも知れない。
ダメもとで回答ボックスに入力してみるくらいはするべきであった。
結論から言うとS0 S0RRY 41NT NUTH1N BUT 4 P34NUTはKeyではなかったのでよかった。

一番最初まで戻って、放置していたall.txtを処理してみる。

tkito@ubuntu:~/CTF19/b100$ base64 -id all.txt > b100_1_all
tkito@ubuntu:~/CTF19/b100$ file b100_1_all
b100_1_all: gzip compressed data, was "bin2-a", from Unix, last modified: Fri Apr  1 01:28:09 2011
tkito@ubuntu:~/CTF19/b100$ gzip -cd b100_1_all > b100_2_all
tkito@ubuntu:~/CTF19/b100$ file b100_2_all
b100_2_all: 7-zip archive data, version 0.3
tkito@ubuntu:~/CTF19/b100$ 7zr x b100_2_all

7-Zip (A) 9.04 beta  Copyright (c) 1999-2009 Igor Pavlov  2009-05-30
p7zip Version 9.04 (locale=en_US.utf8,Utf16=on,HugeFiles=on,2 CPUs)

Processing archive: b100_2_all

file bin2
already exists. Overwrite with
bin2?
(Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit? u
Extracting  bin2

Everything is Ok

Size:       980647
Compressed: 514107
tkito@ubuntu:~/CTF19/b100$ cmp bin2 bin2_1
tkito@ubuntu:~/CTF19/b100$

結局、1~11とallでは分割してあるかどうかだけで得られるファイルはまったく同じであった。
では、バイナリの中にキーが隠されているかもしれないと思い、bin2の中をstringsで見てみた。

tkito@ubuntu:~/CTF19/b100$ strings bin2 | less
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
stdout
fprintf
strcmp
__libc_start_main
GLIBC_2.0
PTRh
QVh`
[^_]
h3rr0m3y3n4m31zbr0br0gan
(以下BASE64データっぽかったので見るのを中止)

注目部分はコマンド行以外のハイライト部。
実行されるとテキストを吐き出すだけだと思っていたプログラムに何故かstrcmpがリンクされている。
これはもしや、特定のパラメータを入れた場合と入れない場合とで動作が分かれるのではないだろうか、strcmpはパラメータが特定のものであるかどうかを判定するために使われているんだ、そうに違いない、と思って周辺をよく見ると、BASE64データの真上にあからさまに怪しい文字列が。
これを実行時のパラメータとして入れてみると…

tkito@ubuntu:~/CTF19/b100$ ./bin2 h3rr0m3y3n4m31zbr0br0gan
 H4sICCNylU0AA2JpbjMAFJx/YNXT/8df55z3r/v7ve1uu/v9rtZaa613a1trrTqraGXq9kurVt6lMiRXJUM4+1GmkoswhLeESbglGcJZpYbkIgzxeUt8h3ARhvA9/FfZ3b3nvF7P5+PR7e7WugUzwOfOdOumYboocREABNDMLty2eTGI/6Sll60aNf5BeTBI//0KYGvT
 HW15D0bz0gZQZ3nSYwWgtE/9coUCRS8cMVu6nRpXzv5PVr7VtWfR46NWVlx+rOubxRMmrDz54n0rvjxxa8H9jTs/zi+gG4s/Weo17mmEFzO+UyAy8god1v8y6+QXwVv+13pT7LedNSkAxvRnVha7dWiBkXBw4AIypBuu4rN2Tt2BKSBmXZjEf1Q/mwC7//4O3vmfx/jr
 oQ3f/t598uVr/32mcc/vgXdH1rznZTN/m3HHa5f+M93ZjBHkZQ1dhmD/mdtGqetOv/1l+mUnClatPtnb+17R0eev+Xfv64OMd97cte7fwuf3fHTmkxHrZn2y/c69t9/9ctmZujeK9m9ZlDTopoZjz516tjs65rmJ7NNfD7e9qt5R8f3s34s3vDLlpjPOF0T152qrznz5
(以下略)

だめだったか!
と思ってしまったがよく見ると、1行の長さは違うし文字列も異なるしでパラメータを入れない場合と違う出力であることは明らか。
描かれている絵はこんなもの。

KI☆MO☆I☆YO!
毎度おなじみBASE64にしか見えないので、処理を進めていく。

tkito@ubuntu:~/CTF19/b100$ ./bin2 h3rr0m3y3n4m31zbr0br0gan > b100_5.txt
tkito@ubuntu:~/CTF19/b100$ base64 -id b100_5.txt > b100_5
tkito@ubuntu:~/CTF19/b100$ file b100_5
b100_5: gzip compressed data, was "bin3", from Unix, last modified: Thu Mar 31 23:35:15 2011
tkito@ubuntu:~/CTF19/b100$ gzip -cd b100_5 > b100_6
tkito@ubuntu:~/CTF19/b100$ file b100_6
b100_6: lzop compressed data - version 1.030, LZO1X-999, os: Unix
tkito@ubuntu:~/CTF19/b100$ lzop -d -o b100_7 b100_6
tkito@ubuntu:~/CTF19/b100$ file b100_7
b100_7: compress'd data 16 bits
tkito@ubuntu:~/CTF19/b100$ compress -cd b100_7 > b100_8
tkito@ubuntu:~/CTF19/b100$ file b100_8
b100_8: gzip compressed data, was "bin3", from Unix, last modified: Thu Mar 31 07:10:38 2011
tkito@ubuntu:~/CTF19/b100$ gzip -cd b100_8 > b100_9
tkito@ubuntu:~/CTF19/b100$ file b100_9
b100_9: ARC archive data, uncompressed
tkito@ubuntu:~/CTF19/b100$ arc x b100_9
Extracting file: bin3
tkito@ubuntu:~/CTF19/b100$ mv bin3 b100_10
tkito@ubuntu:~/CTF19/b100$ xz -cd b100_10 > b100_11
tkito@ubuntu:~/CTF19/b100$ file b100_11
b100_11: rzip compressed data - version 2.1 (276265 bytes)
tkito@ubuntu:~/CTF19/b100$ rzip -d -o b100_12 b100_11
tkito@ubuntu:~/CTF19/b100$ file b100_12
b100_12: gzip compressed data, from Unix, last modified: Thu Mar 31 23:10:06 2011
tkito@ubuntu:~/CTF19/b100$ gzip -cd b100_12 > b100_13
tkito@ubuntu:~/CTF19/b100$ file b100_13
b100_13: POSIX tar archive (GNU)
tkito@ubuntu:~/CTF19/b100$ tar xvf b100_13
bin3
tkito@ubuntu:~/CTF19/b100$ mv bin3 b100_14
tkito@ubuntu:~/CTF19/b100$ file b100_14
b100_14: lzop compressed data - version 1.030, LZO1X-999, os: Unix
tkito@ubuntu:~/CTF19/b100$ lzop -d -o b100_15 b100_14
tkito@ubuntu:~/CTF19/b100$ file b100_15
b100_15: bzip2 compressed data, block size = 900k
tkito@ubuntu:~/CTF19/b100$ bzip2 -cd b100_15 > b100_16
tkito@ubuntu:~/CTF19/b100$ file b100_16
b100_16: 7-zip archive data, version 0.3
tkito@ubuntu:~/CTF19/b100$ 7zr x b100_16

7-Zip (A) 9.04 beta  Copyright (c) 1999-2009 Igor Pavlov  2009-05-30
p7zip Version 9.04 (locale=en_US.utf8,Utf16=on,HugeFiles=on,2 CPUs)

Processing archive: b100_16

Extracting  bin3

Everything is Ok

Size:       272781
Compressed: 274332
tkito@ubuntu:~/CTF19/b100$ mv bin3 b100_17
tkito@ubuntu:~/CTF19/b100$ file b100_17
b100_17: ARJ archive data, v11, slash-switched, original name: , os: Unix
tkito@ubuntu:~/CTF19/b100$ arj x b100_17
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [18 Dec 2009]

Can't find b100_17.arj

Found     1 error(s)!
tkito@ubuntu:~/CTF19/b100$ mv b100_17 b100_17.arj
tkito@ubuntu:~/CTF19/b100$ arj x b100_17
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [18 Dec 2009]

Processing archive: b100_17.arj
Archive created: 2011-03-31 23:01:36, modified: 2011-03-31 23:01:36
Extracting bin3-a                      OK        
Extracting bin3-b                      OK        
Extracting bin3-c                      OK        
     3 file(s)
tkito@ubuntu:~/CTF19/b100$ file bin3-*
bin3-a: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, stripped
bin3-b: data
bin3-c: data

玉ねぎの皮を剥くように幾重にも重なったアーカイブの殻を一つ一つ外していき、ようやくELFにたどり着いた。
このように何重にもアーカイブの殻で覆われたファイルのことをアーカイブマトリョーシカと呼ぶように提案しようかと思ったが、使いどころがCTFくらいしかないので放置。
何はともあれ実行ファイルにたどり着いたので実行しよう、そうしよう。

tkito@ubuntu:~/CTF19/b100$ chmod +x bin3-a
tkito@ubuntu:~/CTF19/b100$ ./bin3-a
Segmentation fault

単体ではダメなことがわかったのでレッツ結合。

tkito@ubuntu:~/CTF19/b100$ cat bin3-* > bin3
tkito@ubuntu:~/CTF19/b100$ chmod +x bin3
tkito@ubuntu:~/CTF19/b100$ ./bin3
-=-=-=-=-=-=-=-=- Wh4t W1ll B3 R3v34l3d? -=-=-=-=-=-=-=-=-
.key the is This
-=-=-=-=-=-=-=-=- Wh4t W1ll Be R3v34l3d? -=-=-=-=-=-=-=-=-

“What Will Be Revealed?”と言われてもこんなんじゃわからないのでstringsを仕掛けてみる。

tkito@ubuntu:~/CTF19/b100$ strings bin3 | less
(中略)
Th1s1zt3hK3yk3yk33H33H33H33.N0t!
t00rongD1DNTg1ve
canthisbethekeybecauseitissuchalongstringandddteklikeslongstrings?
l33tsp33k1z0ut.RealTalkIsIn.
h1tth3r04dj4ck3ndd0nty3wc0m3b4ckn0m0ren0m0R3n0M0R3N0M0R3!
k3ysk3yst3hmm4g1c4lfr3wtthm0r3y3we4tth3mt3hm0r3y3wr00t
5tunt1n1z4h4b1tput171nth3a1r
! is i upside down!i!i!
A complete statement can also be the key to victory.
This is the key.
.key the is This
Can y3w feel it coming in the air tonight?
Random thoughts give way to random problems give way to random solutions
Lorem Ipsum is a bitch.
(以下略)

あるわあるわ怪しい文字列の山が。
とりあえずこのあたりのをいくつか回答として入れてみたけどダメ。
何回かbin3を実行してみたところ、この怪しい文字列の山から秒変わりで1つを選択して表示しているようであることがわかった。
山の中に何回実行しても出力されない文字列があってそれがKeyなのではないかと思ったが、もしそんな答えだった場合、コード解析できない自分にはお手上げなのでそれはないものとして進めることにした。
stringsの出力を眺めていると、最後の方、エラーメッセージ用の定型文エリアの後に明らかにエラーメッセージではない、しかし意味のある文字列があった。

stack smashing detected
*** %s ***: %s terminated
zPLR
Where we're going we don't need... roads.
CAk[S

こいつは怪しい、と思ってこれを回答してみたところ、見事正解!
というわけでKeyは、Where we're going we don't need... roads.でした。
ちなみにBack to the Futureからの引用だそうで。

感想:
バイナリ解析問題なので、もしかしたらコード解析の知識が必要なのではないかと危惧していたが、その必要はなかったようで助かった。
問題を解いている間はパズルを解いているような感覚で楽しかった。
特に、正解ルートへの道を見つけたときはよっしゃ!とちょっと声を上げてしまった。

しかし、解けてよかった。
1問も解けないかもしれないと思っていたとはいえ、本当に1問も解けなかったらそのがっかり度はハンパなかった。
(Retro Revisited 100は除く)
これを解いた後、Forensicsの100にも挑戦したものの、詰まってしまったため、考えるのをやめてしまった。

他の人のwriteupはGrab Bag 100, Retro Revisited 100, Binary L33tness 100, Forensics 100を見た。
逆に言うとその他のは見ていないため、まだ答えを知らない状態で挑戦できる。
(ファイルがあるものに限定されるけれど)
今度の週末辺りに時間があったら他の問題もやってみようかなと思ったりしている。
すぐにお手上げになる可能性が高いけれど。

DEFCON 19 CTF Binary L33tness 100 writeup」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください