$ cat writeup.md…
$ cat writeup.md…
broncoctf2026
Task: unknown extensionless file that is a Krita .bundle (ZIP) of brush presets. Solution: identify via file/MIME, unzip, then read the Brush 99.kpp PNG metadata with exiftool to extract the kis_text_brush text= attribute containing the flag.
Yoshie found this random file laying around. Do you have any idea what this 'bundle' is? Apparently someone told him it's the 99th bundle of brushes? What is that supposed to mean... P.S. This challenge can be solved without downloading any software, but you'll have to hunt for a way to run the related program online and send the bundle to it.
English summary: An extensionless file Bundle_99 (83110 bytes) is provided. The wordplay ("bundle", "brushes", "99th bundle", "run the related program online") points to Krita and its .bundle resource bundle format. The goal is to recover a bronco{...} flag. The intended path was to load the bundle in Krita (or a web build of Krita) and paint with a text brush to stamp the flag — but the flag is stored as plaintext in the brush preset's PNG metadata, so no software is required.
Recon on the unknown file:
$ file Bundle_99
Bundle_99: Zip data (MIME type "application/x-krita-resourcebundle"?)
$ strings Bundle_99 | grep -Ei 'mimetype|kpp|preview|manifest|meta'
mimetype
application/x-krita-resourcebundle
paintoppresets/Brush 99.kpp
preview.png
META-INF/manifest.xml
meta.xml
Key deductions:
file magic + MIME application/x-krita-resourcebundle identifies this as a Krita resource bundle — a ZIP container. Krita is the "related program" the description hints at.paintoppresets/Brush 99.kpp is the "99th bundle of brushes" / "Brush 99" wordplay: a single brush preset named Brush 99..kpp brush presets are PNG files (here 200×200 RGBA) that store the serialized preset XML inside a PNG text chunk named Preset. Krita text brushes (kis_text_brush) store their rendered string in a text= attribute — a perfect place to hide a flag.No pixel LSB stego is involved; preview.png is just a laughing emoji and is a decoy.
unzip Bundle_99 -d extracted
Preset text chunk. Read the embedded metadata with exiftool (no need to run Krita):exiftool "extracted/paintoppresets/Brush 99.kpp"
<param> entries in the serialized preset, the brush_definition param holds a Krita text brush. The relevant snippet:<Brush font="Segoe UI,9,-1,5,50,0,0,0,0,0" spacing="0.2" pipe="false" type="kis_text_brush" BrushVersion="2" text="bronco{REDACTED}"/>
The text= attribute of the kis_text_brush is the flag — the string that would be stamped onto the canvas if you actually painted with this brush in Krita.
unzip -p Bundle_99 "paintoppresets/Brush 99.kpp" | strings | grep -o 'text="bronco{[^"]*}"' # text="bronco{REDACTED}"
$ cat /etc/motd
Liked this one?
Pro unlocks every writeup, every flag, and API access. $9/mo.
$ grep --similar