🛡️

setodaNote CTF Exhibition Writeup (Misc)

2024/10/12に公開

Misc - Welcome

ようこそ setodaNote CTF へ

これはチュートリアル用の設問です。
以下の内容を確認し、フラグを獲得してください。

:.:.:.:.:.:.:.:.:.:.:.:.:.:.:

flag{Enjoy_y0ur_time_here!}

:.:.:.:.:.:.:.:.:.:.:.:.:.:.:
上記の通り、本設問では flag{Enjoy_y0ur_time_here!} がフラグとなっています。
これを解答欄に入力してポイントを獲得してください。

正答:flag{Enjoy_y0ur_time_here!}

Misc - morse_one

友人から「秘密のメッセージを送るね」とあるテキストファイルが送られてきました。どうやらそのままでは読めないようです。添付されたファイルを解析し、秘密のメッセージを見つけ出してください。

フラグは得られた文字列を flag{} で囲んで答えてください。フラグに英字が含まれている場合はすべて大文字で答えてください。例えば得られた文字列が Flag の場合は flag{FLAG} となります。

問題にはmorse_one.txtが添付されており、内容は以下の通りです。

DDDBSDDSBDDDSDBDSBBBSDBBDSDBDDSDSBDDB

問題タイトルの「morse」からモールス信号だと推測できます。
Bを「-」、Dを「・」、Sを文字の区切りとして変換してみます。

DDDB:V
DD:I
BDDD:B
DBD:R
BBB:O
DBBD:P
DBDD:L
D:E
BDDB:X

正答:flag{VIBROPLEX}

Misc - Hash

ちくしょう、なんてことだ。知り合いから預かっていたファイルをゴミ箱に放り込みやがった。まだ中身の確認もしていなかったのにだ。問い詰める必要はあるだろうが、いまはとにかくファイルを取り戻すことが先決だ。優先順位を間違えてはいけない。とくにかくゴミ箱からファイルを取り戻さなくては。・・・なんだぁこいつは、ファイル名が書き換えられてしまっているじゃあないか。なんて野郎だクソっこれじゃほかのファイルと見分けがつかないじゃあないか。なんて日なんだ今日はよぉ。しかしまったくもって腹立たしいことは確かだが、まだ焦るのは早すぎるよなぁ。ぜんぜん焦る必要はねぇ。なぜならこっちにはファイルと共に受け取ったこのハッシュ値があるんだからよぉ・・・

添付ファイルを解析し、以下のハッシュ値を持つファイル見つけ出してください。フラグはそのファイルに記載されている文字列を組み合わせたものとなります。

aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7
8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb
e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962

問題にはpass001.txtpass090.txtが添付されています。
各テキストファイルのSHA256ハッシュ値を計算し、問題文末のハッシュ値と同一であればファイル名を出力するプログラムを作成します。

hash.py
import hashlib

hash_list = ["aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7", "8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb", "e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962"]

for i in range(1, 91):
    file_name = "pass" + str(i).zfill(3) + ".txt"
    with open(file_name, "rb") as file:
        data = file.read()
        hash = hashlib.sha256(data).hexdigest()
        if hash in hash_list:
            print(file_name)
$ python hash.py
pass024.txt
pass034.txt
pass079.txt
$ 

各ファイルには以下の内容が記載されています。

  • pass024.txtflag{hardest
  • pass034.txt_logic_
  • pass079.txtpuzzle}

正答:flag{hardest_logic_puzzle}

Misc - F

友人のプログラマーからあるテキストデータを受け取りました。中身はあるプログラミング言語で書かれたプログラムだというのですが、、、

以下のテキストデータを解析し、フラグを得てください。

+++++++[->++++++++++>+++++++++++>+++++++++>++++++++++<<<<]>.>-.>++.>+.>++++++++[>++++<-]>.>+++++[->+++++++++++++++++++++>+++++++++++++++++++++++<<]>.>.>++++++++[>++++<-]>.>++++++++++[->++++++++++>++++++++++>++++++++++>++++++++++>++++++++++++<<<<<]>++.>++++++++.>---.>+++.>+++.>++++++++[>++++++++<-]>++++.>+++++++++++[>++++++++++>++++++++++<<-]>+.>.>++++[>++++++++++<-]>-.>+++[->+++++[->++++++++<]<]>>----.>++++++++++[->++++++++++>+++++++++>++++++++++++>++++++++++>+++++++++<<<<<]>-----.>-----.>-----.>+.>+++++.>++++++++++++++++++++[>++++++>+++++>+++++>+++++>+++>++<<<<<<-]>----.>++++.>+.>-----.>++++++++++.>+++++.>++++++++++[->+++++++++>+++++++++++>+++++++++++>++++++++++<<<<]>---.>+.>++++.>.>+++[->+++++++++++<]>..>+++++[->+++++[->+++++<]<]>>.

これはBrainfuck[1]で書かれたコードです。
AtCoderでサポートされている言語なので実行してみます。


正答:flag{Don't_Use_the_F-Word!!}

Misc - magic_number

添付されたファイルから以下が示す3つのファイルを探してください。

[89 50 4e 47]
[52 61 72 21]
[ff d8 ff e0]

フラグは該当するファイル名を以下の順番にアンダースコアでつないで回答してください。

flag{[89 50 4e 47]_[52 61 72 21]_[ff d8 ff e0]}

例えばファイル名がそれぞれ以下の場合は flag{aaa_bbb_ccc} と答えてください。

[89 50 4e 47] = aaa.txt
[52 61 72 21] = bbb.exe
[ff d8 ff e0] = ccc.zip

問題には以下の12個のファイルが添付されています。

  • flag.txt
  • green.tif
  • light.jpg
  • moon.gif
  • mpmp.mp4
  • post.pdf
  • post.png
  • rar.rar
  • sea.txt.bz2
  • silent.bmp
  • undo.cab
  • victory.zip

問題タイトルになっているマジックナンバーとはファイルの種類を示す数字のことで、通常ファイルの先頭にあります。
各添付ファイルの先頭4バイトを表示してみます。

$ xxd -l 4 flag.txt 
00000000: 666c 6167                                flag
$ xxd -l 4 green.tif 
00000000: 4949 2a00                                II*.
$ xxd -l 4 light.jpg 
00000000: ffd8 ffe0                                ....
$ xxd -l 4 moon.gif 
00000000: 4749 4638                                GIF8
$ xxd -l 4 mpmp.mp4 
00000000: 0000 0020                                ... 
$ xxd -l 4 post.pdf 
00000000: 2550 4446                                %PDF
$ xxd -l 4 post.png   
00000000: 8950 4e47                                .PNG
$ xxd -l 4 rar.rar 
00000000: 5261 7221                                Rar!
$ xxd -l 4 sea.txt.bz2 
00000000: 425a 6839                                BZh9
$ xxd -l 4 silent.bmp 
00000000: 424d 1e77                                BM.w
$ xxd -l 4 undo.cab  
00000000: 4d53 4346                                MSCF
$ xxd -l 4 victory.zip 
00000000: 504b 0304                                PK..
$ 
  • [89 50 4e 47] = post.png
  • [52 61 72 21] = rar.rar
  • [ff d8 ff e0] = light.jpg

となっていることが分かります。
正答:flag{post_rar_light}

Misc - Stegano

友人からある画像が送られてきました。何かが写りこんでいるらしいのですが。

添付されたファイルを解析してフラグを入手してください。

問題にはstegano.pngとして以下の画像が添付されています。

画像中央にうっすら1s_cReA73d_byという文字列が見えますが、flagとしては不十分です。
「青い空を見上げればいつもそこに白い猫」のステガノグラフィ解析機能で調査してみます。

左上にflag{Re4l17y_という文字列が見えます。

右下に_7h3_m1nd_rA9}という文字列が見えます。

正答:flag{Re4l17y_1s_cReA73d_by_7h3_m1nd_rA9}

Misc - morse_zero

友人から「マジの秘密のメッセージを送るね」とあるテキストファイルが送られてきました。どうやらマジでそのままでは読めないようです。添付されたファイルを解析し、マジの秘密のメッセージを見つけ出してください。

フラグは得られた文字列を flag{} で囲んで答えてください。フラグに英字が含まれている場合はすべて大文字で答えてください。例えば得られた文字列が Flag の場合は flag{FLAG} となります。

問題にはmorse_zero.txtが添付されており、Zと空白文字の羅列になっています。
モールス信号では少なくとも3種類の文字が必要なはずなので、バイナリ表示してみます。

$ xxd morse_zero.txt 
00000000: e280 8ce2 808c e280 8be2 808b 5ae2 808b  ............Z...
00000010: 5ae2 808b e280 8ce2 808b 5ae2 808c e280  Z.........Z.....
00000020: 8ce2 808c e280 8ce2 808c 5ae2 808b e280  ..........Z.....
00000030: 8be2 808c e280 8ce2 808b e280 8c5a e280  .............Z..
00000040: 8be2 808c e280 8c5a e280 8be2 808c e280  .......Z........
00000050: 8ce2 808c e280 8c5a e280 8ce2 808b e280  .......Z........
00000060: 8b5a e280 8c5a e280 8be2 808b e280 8be2  .Z...Z..........
00000070: 808b 5ae2 808b e280 8be2 808c e280 8ce2  ..Z.............
00000080: 808b e280 8c5a e280 8be2 808b e280 8b5a  .....Z.........Z
00000090: e280 8be2 808c e280 8ce2 808b 5ae2 808b  ............Z...
000000a0: e280 8c5a e280 8ce2 808b e280 8ce2 808b  ...Z............
000000b0: 5ae2 808b                                Z...
$ 

よくよく見ると、空白文字にはe2808ce2808bの2種類があると分かります。
e2808cを「-」、e2808bを「・」、5aを文字の区切りとして変換してみます。

e2808c e2808c e2808b e2808b:Z
e2808b:E
e2808b e2808c e2808b:R
e2808c e2808c e2808c e2808c e2808c:0
e2808b e2808b e2808c e2808c e2808b e2808c:_
e2808b e2808c e2808c:W
e2808b e2808c e2808c e2808c e2808c:1
e2808c e2808b e2808b:D
e2808c:T
e2808b e2808b e2808b e2808b:H
e2808b e2808b e2808c e2808c e2808b e2808c:_
e2808b e2808b e2808b:S
e2808b e2808c e2808c e2808b:P
e2808b e2808c:A
e2808c e2808b e2808c e2808b:C
e2808b:E

正答:flag{ZER0_W1DTH_SPACE}

Misc - ransom_note

あなたの元に緊急の対応依頼が飛び込んできました。重要なファイルがランサムウェアによって暗号化されてしまった。なんとか助けてほしい。電話越しに状況を聞き取りつつ、1枚の画像が送られてきました。端末のディスプレイを写したもののようです。「No More Ransom Project の出番だな。」その画像を見た上司がつぶやきます。今回のあなたの仕事はランサムウェアによって暗号化されてしまったファイルを復元することです。

添付されたファイルを解析し、フラグを得てください。

※ この設問は Windows 環境で解くことを想定しています。

問題にはImage from iOS.jpgとして以下の画像が添付されています。

また、NPIEWI-DECRYPT.txtも添付されており、内容は以下の通りです。

---= GANDCRAB V5.0.3 =---

***********************UNDER NO CIRCUMSTANCES DO NOT DELETE THIS FILE, UNTIL ALL YOUR DATA IS RECOVERED***********************

*****FAILING TO DO SO, WILL RESULT IN YOUR SYSTEM CORRUPTION, IF THERE WILL BE DECRYPTION ERRORS*****

Attention!

All your files, documents, photos, databases and other important files are encrypted and have the extension: .NPIEWI

The only method of recovering files is to purchase an unique private key. Only we can give you this key and only we can recover your files.

The server with your key is in a closed network TOR. You can get there by the following ways:

----------------------------------------------------------------------------------------

| 0. Download Tor browser - https://www.torproject.org/
| 1. Install Tor browser
| 2. Open Tor Browser
| 3. Open link in TOR browser: http://xxxxxxxxxxxxxxxx.example.com/b9ba6918c4b4a232
| 4. Follow the instructions on this page

----------------------------------------------------------------------------------------

On our page you will see instructions on payment and get the opportunity to decrypt 1 file for free.

ATTENTION!

IN ORDER TO PREVENT DATA DAMAGE:

* DO NOT MODIFY ENCRYPTED FILES
* DO NOT CHANGE DATA BELOW

---BEGIN GANDCRAB KEY---
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
---END GANDCRAB KEY---

---BEGIN PC DATA---
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
---END PC DATA---

No More Ransom Projectではランサムウェアで暗号化されたファイルを復号するツール等が公開されています。

https://www.nomoreransom.org/ja/decryption-tools.html

Image from iOS.jpgNPIEWI-DECRYPT.txtにもある通り、今回はGandCrabというランサムウェアで暗号化されているようなので、「GandCrab (V1, V4 and V5 up to V5.2 versions) Ransom」をクリックして復号ツールをダウンロードします。  
あとはダウンロードしたBDGandCrabDecryptTool.exeを起動し、復号したいsecret.txt.npiewiが格納されているフォルダを指定して「START TOOL」を押下するだけです。

復号ツールの実行が完了すると、先ほど指定したフォルダに復号されたsecret.txtがあります。

正答:flag{unlock1ng_y0ur_d1gital_life_with0ut_paying;)}

Misc - Nothing

あなたは友人のプログラマーからあるテキストファイルを渡されました。中身を確認しますが画面には何も表示されません。何も書かれていないのか、いや、よく見ると、、、

添付されたファイルを解析してフラグを得てください。

問題にはnothing.txtが添付されており、空白文字が羅列されています。
これはWhitespace[2]で書かれたコードです。
AtCoderでサポートされている言語なので実行してみます。


正答:flag{And_Then_There_Were_None}

Misc - i_knew_it

「このアセンブリ、見た瞬間あなただと分かりましたよ。」

ある暗号方式の名称がフラグになっています。添付ファイルからその暗号方式の名称を特定し、フラグ形式で回答してください。

フラグに英字が含まれている場合は、すべて大文字で答えてください。例えば This_is_FLAG が得られた場合は flag{THIS_IS_FLAG} となります。

問題にはi_knew_it.pngとして以下の画像が添付されています。

「アセンブリ」「見た瞬間」でGoogle検索すると、以下のWebサイトがヒットします。

https://yasulib.hatenablog.jp/entry/20180127/1517041821

アセンブリを読んでいない(読めない)ので大分ずるいですが、RC4であることが分かります。

正答:flag{RC4}

Misc - Redacted

あなたの友人のジャーナリストは極秘ファイルの入手に成功しました。ですが重要な部分が黒塗りにされてしまっているようです。このままでは真実が闇に葬り去られてしまいます。あなたは極秘ファイルの解析を依頼されました。

添付されたファイルを解析し、真実を明らかにしてください。

問題にはtop_secret.pdfとして以下のようなPDFファイルが添付されています。

stringsコマンドで文字列を抽出してみます(実行結果が非常に長いため途中省略しています)。

$ strings top_secret.pdf
%PDF-1.7

~省略~

<?xpacket end="w"?>
endstream
endobj
20 0 obj
<</Author(FBI)/CreationDate(D:20210312003216+09'00')/Creator(Microsoft
 PowerPoint
 for Microsoft 365)/Keywords(Note: Never extract images...)/ModDate(D:20210626004046+09'00')/Producer(Microsoft
 PowerPoint
 for Microsoft 365)/Title(The Truth about the Roswell Incident)>>
endobj
xref
0000000000 65535 f
17 1
0000046482 00000 n
20 1
0000050291 00000 n
trailer
<</Size 21/Root 1 0 R/Info 20 0 R/ID[<C04E9C4056169F49B3B66D909F41437E><1FC7356DE215D546874C6C5D21C2A9A0>]/Prev 46302>>
startxref
50580
%%EOF
$

どうやらMicrosoft Officeで作成した資料のようなので、Wordでtop_secret.pdfを開きます。
すると、黒塗り部分のオブジェクトを削除できるようになります。

正答:flag{weather_balloon}

Misc - strong_password

あなたの同僚は部署内で利用されているパスワード規則に疑問を抱いているようです。脆弱なパスワードが生成されてしまうのではないかと。これを確かめるべく同僚は、過去実際にこの規則に従い作成されていたパスワード付きzipのコピーをあなたに送付し、その解析を依頼しました。

添付されたファイルを解析し、フラグを入手してください。なお、ファイルはコピーであり更新日時が実際にパスワード設定された日時とは異なる点に注意してください。

問題には情報セキュリティガイドライン(別紙1).pdfとして以下のようなPDFファイルが添付されています。

最初はPythonを使って総当たりしていたのですが、相当時間がかかりそうだった[3]ので、hashcatを利用する方針に切り替えました。
まずは、zip2johnでTopSecret.zipのパスワードハッシュを取得します。

$ zip2john TopSecret.zip
ver 2.0 TopSecret.zip/TopSecret.txt PKZIP Encr: cmplen=85, decmplen=73, crc=8578F5F9 ts=92C0 cs=8578 type=0
TopSecret.zip/TopSecret.txt:$pkzip$1*1*2*0*55*49*8578f5f9*0*2b*0*55*8578*598c6b323287ee253bad1378d1f4fe4d91648ea9f1e60fe80374b917e47421b6f3379cf786e9c22453d02e8192c2aecd93122be13b2c348d02c0229c6c8a6b433ac24b17d0e18f215252601daafe595eb6ba28eab3*$/pkzip$:TopSecret.txt:TopSecret.zip::TopSecret.zip
$

次に、[年月日]+[記号2]の部分の辞書ファイルを作成します。
ただし、日付は「情報セキュリティガイドライン(別紙1)」の発行日である2020年4月1日から、TopSecret.zipの作成日時である2021年7月14日までとします。

dict.py
import datetime

# 日付(2020/04/01 - 2021/07/14)のリストを作成
start_date = datetime.date(2020, 4, 1)
end_date = datetime.date(2021, 7, 14)
current_date = start_date
dates = []
while current_date <= end_date:
    dates.append(current_date.strftime("%Y%m%d"))
    current_date += datetime.timedelta(days=1)

# 記号のリストを作成
symbols = ["@", "#", "$", "%", "!", "-"]

# [年月日]+[記号2]のリストを作成
with open("dict.txt", "w") as f:
    for date in dates:
        for symbol in symbols:
            f.write(f"{date}{symbol}\n")
$ python dict.py 
$ head -n 30 dict.txt 
20200401@
20200401#
20200401$
20200401%
20200401!
20200401-
20200402@
20200402#
20200402$
20200402%
20200402!
20200402-
20200403@
20200403#
20200403$
20200403%
20200403!
20200403-
20200404@
20200404#
20200404$
20200404%
20200404!
20200404-
20200405@
20200405#
20200405$
20200405%
20200405!
20200405-
$

さらに、TopSecret.zipの圧縮方式を確認します。

$ zipinfo -v TopSecret.zip
Archive:  TopSecret.zip
There is no zipfile comment.

End-of-central-directory record:
-------------------------------

  Zip archive file size:                       245 (00000000000000F5h)
  Actual end-cent-dir record offset:           223 (00000000000000DFh)
  Expected end-cent-dir record offset:         223 (00000000000000DFh)
  (based on the length of the central directory and its expected offset)

  This zipfile constitutes the sole disk of a single-part archive; its
  central directory contains 1 entry.
  The central directory is 95 (000000000000005Fh) bytes long,
  and its (expected) offset in bytes from the beginning of the zipfile
  is 128 (0000000000000080h).


Central directory entry #1:
---------------------------

  TopSecret.txt

  offset of local header from start of archive:   0
                                                  (0000000000000000h) bytes
  file system or operating system of origin:      MS-DOS, OS/2 or NT FAT
  version of encoding software:                   6.3
  minimum file system compatibility required:     MS-DOS, OS/2 or NT FAT
  minimum software version required to extract:   2.0
  compression method:                             none (stored)
  file security status:                           encrypted
  extended local header:                          no
  file last modified on (DOS date/time):          2021 Jul 14 18:22:00
  32-bit CRC value (hex):                         8578f5f9
  compressed size:                                85 bytes
  uncompressed size:                              73 bytes
  length of filename:                             13 characters
  length of extra field:                          36 bytes
  length of file comment:                         0 characters
  disk number on which file begins:               disk 1
  apparent file type:                             binary
  non-MSDOS external file attributes:             000000 hex
  MS-DOS file attributes (20 hex):                arc 

  The central-directory extra field contains:
  - A subfield with ID 0x000a (PKWARE Win32) and 32 data bytes.  The first
    20 are:   00 00 00 00 01 00 18 00 f9 71 63 b2 91 78 d7 01 fa cd fc b2.

  There is no file comment.
$ 

最後に、hashcatのマニュアルを確認しながらパスワードクラックを実行します。

https://hashcat.net/wiki/doku.php?id=hashcat

  • -m 17210:ハッシュの種類(PKZIP (Uncompressed)[4]
  • $pkzip$1*1*2*0*55*49*8578f5f9*0*2b*0*55*8578*598c6b323287ee253bad1378d1f4fe4d91648ea9f1e60fe80374b917e47421b6f3379cf786e9c22453d02e8192c2aecd93122be13b2c348d02c0229c6c8a6b433ac24b17d0e18f215252601daafe595eb6ba28eab3*$/pkzip$:zip2johnで取得したパスワードハッシュ
  • -a 7:攻撃モード(Hybrid Mask + Wordlist)
  • -1 '?l?u':カスタム文字セット1(英大文字・英小文字)
  • -2 '@#$%!-':カスタム文字セット2(記号)
  • ?1?1?1?2:「案件コード」+「記号1」
  • dict.txtdict.pyで生成した辞書ファイル
$ hashcat -m 17210 '$pkzip$1*1*2*0*55*49*8578f5f9*0*2b*0*55*8578*598c6b323287ee253bad1378d1f4fe4d91648ea9f1e60fe80374b917e47421b6f3379cf786e9c22453d02e8192c2aecd93122be13b2c348d02c0229c6c8a6b433ac24b17d0e18f215252601daafe595eb6ba28eab3*$/pkzip$' -a 7 -1 '?l?u' -2 '@#$%!-' '?1?1?1?2' dict.txt
hashcat (v6.2.6) starting

OpenCL API (OpenCL 3.0 PoCL 6.0+debian  Linux, None+Asserts, RELOC, LLVM 17.0.6, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
============================================================================================================================================
* Device #1: cpu-penryn-12th Gen Intel(R) Core(TM) i5-12400F, 6944/13952 MB (2048 MB allocatable), 2MCU

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

Dictionary cache hit:
* Filename..: dict.txt
* Passwords.: 2820
* Bytes.....: 28200
* Keyspace..: 2820

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates

Optimizers applied:
* Not-Iterated
* Single-Hash
* Single-Salt

Watchdog: Temperature abort trigger set to 90c

Host memory required for this attack: 0 MB

Dictionary cache hit:
* Filename..: dict.txt
* Passwords.: 2820
* Bytes.....: 28200
* Keyspace..: 2379087360

Cracking performance lower than expected?                 

* Append -w 3 to the commandline.
  This can cause your screen to lag.

* Update your backend API runtime / driver the right way:
  https://hashcat.net/faq/wrongdriver

* Create more work items to make use of your parallelization power:
  https://hashcat.net/faq/morework

$pkzip$1*1*2*0*55*49*8578f5f9*0*2b*0*55*8578*598c6b323287ee253bad1378d1f4fe4d91648ea9f1e60fe80374b917e47421b6f3379cf786e9c22453d02e8192c2aecd93122be13b2c348d02c0229c6c8a6b433ac24b17d0e18f215252601daafe595eb6ba28eab3*$/pkzip$:qYL%20210228!
                                                          
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 17210 (PKZIP (Uncompressed))
Hash.Target......: $pkzip$1*1*2*0*55*49*8578f5f9*0*2b*0*55*8578*598c6b...pkzip$
Time.Started.....: Sat Oct 12 20:44:11 2024 (1 min, 18 secs)
Time.Estimated...: Sat Oct 12 20:45:29 2024 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (dict.txt), Right Side
Guess.Mod........: Mask (?1?1?1?2) [4], Left Side
Guess.Charset....: -1 ?l?u, -2 @#$%!-, -3 Undefined, -4 Undefined
Speed.#1.........: 24505.6 kH/s (9.20ms) @ Accel:128 Loops:1024 Thr:1 Vec:4
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 1990135808/2379087360 (83.65%)
Rejected.........: 0/1990135808 (0.00%)
Restore.Point....: 705536/843648 (83.63%)
Restore.Sub.#1...: Salt:0 Amplifier:1024-2048 Iteration:0-1024
Candidate.Engine.: Device Generator
Candidates.#1....: sXC%20200918! -> YAN%20210308#
Hardware.Mon.#1..: Util: 94%

Started: Sat Oct 12 20:44:10 2024
Stopped: Sat Oct 12 20:45:30 2024
$ 

パスワード「qYL%20210228!」でTopSecret.zipを解凍し、中に格納されているTopSecret.txtの内容を確認します。
正答:flag{And_n0w_h3re_is_my_s3cre7}

脚注
  1. Brainfuckは><>+-.,[]の8種類の命令を使うプログラミング言語です。 ↩︎

  2. Whitespaceは半角スペース、タブ、改行の3種類を使うプログラミング言語です。 ↩︎

  3. 慣れない並列処理を実装したらエラーが出て嫌になったことも理由の1つです…。 ↩︎

  4. zipinfoの実行結果「compression method: none (stored)」より分かります。 ↩︎

Discussion