← Back to all writeups
Misc

Parkour encoding

280 points • Minecraft world parsing • Solved during pingCTF 2026

This challenge ships a full Minecraft world save instead of a normal text file or script. The trick is that the parkour path itself is the bitstream: diamond blocks mean 1, gaps mean 0, and the whole route decodes cleanly into ASCII.

Challenge files

The archive extracts to a directory called parkour encoding that contains a normal Java Edition world save: level.dat, region/*.mca, entities/*.mca, and the usual metadata files.

That immediately suggests the flag is not going to be hidden in a single text blob. It is probably encoded in blocks, entities, signs, or some other world structure.

First inspection

I started by parsing level.dat and scanning the world for readable text. There was only one useful sign in the whole world, placed at the end of the course at (432, 2, 0):

congratz!
btw, did you get
the flag along
the way?

That hint is the whole challenge. The flag is not in a chest or a book at the finish line. It is encoded by the layout of the parkour itself.

Reading the path as bits

The actual course runs along the x-axis at y = 0, z = 0. Every position either contains a diamond_block or is empty air. Once you print those positions as a binary stream, the pattern jumps out immediately.

Interpret diamond_block as 1 and air as 0, then group the resulting 432 bits into bytes.

The first few bytes already decode as ping{, which confirms the idea and also matches the provided flag format ping{.*}.

Extracting the flag

I walked the route from x = 0 to x = 431, built a binary string, and decoded it in 8-bit chunks. The raw bitstream begins like this:

01110000 01101001 01101110 01100111 01111011 ...

Which is simply:

p        i        n        g        {

Decoding all 54 bytes yields the full flag directly.

Solver sketch

The exact MCA parsing code is a bit long, but once you can query blocks by coordinate, the actual solve logic is tiny:

bits = "".join(
    "1" if get_block(x, 0, 0) == "minecraft:diamond_block" else "0"
    for x in range(432)
)

flag = "".join(
    chr(int(bits[i:i + 8], 2))
    for i in range(0, len(bits), 8)
)

print(flag)

Downloads

The full solver and the extracted supporting artifacts are published with the writeup and can be downloaded directly:

  • solve.py - Self-contained Python solver that reads the world save and decodes the route.
  • bitstream.txt - The recovered 432-bit route, grouped into bytes and decoded to ASCII.
  • sign.txt - The end-of-course sign text and its block coordinates.

Flag

ping{fl4g_1s_Wh4t3V3R_Y0u_w4nT_1_h0p3_y0u_d0nt_us3_41}