sea of theft — Flag of Yore
An unused sprite renders to a screenshot of the game in dev mode, and the version string in those pixels names a release the bucket never cleaned up.
FLAG
DCTF{M4yb3_cl34n_y0ur_S3_buCk375_fr0m_t1m3_t0_71m3} Target: https://sot-chall.abcjr.dev/ — PIPWORLD2, a Rust/WASM (Trunk) .io-style pirate game. The challenge carries three flags; this is the one solved here.
Q2 — Flag of Yore
An infrastructure flag: an old release was never cleaned out of the public bucket.
index.htmlpins a release and fetcheshttps://sot-chall-test-versions.abcjr.dev/releases/prod/<id>/release.json— a public Cloudflare R2 bucket with directory listing disabled.- The prod asset index (
assets.idx, magicPIDX) names an asset that the game never uses:dev_tutorial, 720×640, the last sprite intutorial.pak(raw RGBA frames, 24-bytePPAKheader,720*640*4bytes per frame). - Rendering it yields a screenshot of the game running in dev mode, and the dev HUD in that screenshot leaks an older release id:
release: v0.0.9-d2bad05a4314-20260914T130501Z
- That id does not exist under
prod, but it resolves under a different channel:/releases/dev/v0.0.9-.../release.json→variant: "dev". - That release’s
assets.idxlists a third pak,dev, containingflag.txt— 24-byte header plus a 52-byte flag.
The chain is: unused asset → screenshot → version string in pixels → sibling channel → extra pak.