問題文: 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を見た。
逆に言うとその他のは見ていないため、まだ答えを知らない状態で挑戦できる。
(ファイルがあるものに限定されるけれど)
今度の週末辺りに時間があったら他の問題もやってみようかなと思ったりしている。
すぐにお手上げになる可能性が高いけれど。
何か所か > が > になってますよ。
thx.