In this write-up
These notes document the October 2026 CTF challenge. Commands, addresses and outputs refer to the supplied challenge environment.
Initial files#
ls
Output:
bundle.zip parcel.dat
The challenge hint says the filename lies and to identify formats by magic bytes, not suffixes. So we inspect both files.
file bundle.zip parcel.dat
Output showed:
bundle.zip: Zip archive data
parcel.dat: gzip compressed data
Interesting: parcel.dat is actually gzip despite the .dat extension.
If you only had bundle.zip, you could extract it first:
unzip bundle.zip
It contains another parcel.dat. In this run, the outside parcel.dat was already the gzip payload, so we worked directly with it.
Step 1 — Decompress gzip#
gzip -dc parcel.dat > layer1.bin
Check the result:
file layer1.bin
xxd -l 128 layer1.bin
Output:
layer1.bin: ASCII text, with no line terminators
00000000: 516c 706f 4f54 4642 5753 5a54 5753 4a38 QlpoOTFBWSZTWSJ8
The data starts with QlpoOT.... That is Base64.
binwalk will not detect this because it is just text, so file + xxd are important here.
Step 2 — Decode Base64#
base64 -d layer1.bin > layer2.bin
Check it:
file layer2.bin
xxd -l 64 layer2.bin
Output:
layer2.bin: bzip2 compressed data, block size = 900k
00000000: 425a 6839 3141 5926 5359 227c 6d0d 0000 BZh91AY&SY"|m...
BZh is the bzip2 magic header. So this layer is bzip2.
Step 3 — Decompress bzip2#
bzip2 -dc layer2.bin > layer3.bin
Check it:
file layer3.bin
xxd -l 128 layer3.bin
Output:
layer3.bin: Zip archive data
00000000: 504b 0304 1400 0000 0800 0000 475d 9fe2 PK..........
PK is the ZIP magic header.
The archive contains a file named:
last-dispatch.txt
Step 4 — Extract ZIP and read the flag#
unzip -o layer3.bin -d layer3_extracted
Then:
cat layer3_extracted/last-dispatch.txt
Output:
tibeb{matryoshka_a52321d3fbea56b2bea3}
Final Flag#
tibeb{matryoshka_a52321d3fbea56b2bea3}
Tricky / Interesting Parts#
-
parcel.datis not a.datfile.
It is gzip. Always trust magic bytes fromfileandxxd, not extensions. -
The Base64 layer has no newline.
file layer1.binsays “ASCII text, with no line terminators.”
binwalkfinds nothing. You need to look at the first bytes withxxdto recognizeQlpo...as Base64. -
bundle.zipis mostly a wrapper.
It containsparcel.dat. The outsideparcel.datwas already the same gzip payload, so extractingbundle.zipwas optional. If you start frombundle.zipalone, justunzip bundle.zipand continue from the gzip step.
Answer to submit:
tibeb{matryoshka_a52321d3fbea56b2bea3}