SKIP TO MAIN CONTENT

[ EST. 2024 / INTERNATIONAL ]

SECURITY RESEARCH COLLECTIVE

SECURITY RESEARCH KNOWLEDGE TECHNIQUES
B3S/WRITEUPS/MATCHDAY-REPLAY-FORENSICS
← BACK TO ARCHIVE
EVENT: Safaricom PwnZone 2.0 Qualifiers 2026CATEGORY: ForensicsPOINTS: 200 PTS

Matchday Replay

AUTHORED BY:@bealthguy10/5/2026

Matchday Replay

200 pts. Forensics. The description pointed at a replay system still serving old data:

The match is over, but something was left behind in the replay system. Old plays, old moments, and old data are still being served. Not everything in the archive belongs on the screen.

The zip held two files: capture.pcap and session.log.

session.log was three lines:

18:44 volunteers crossed the end line
18:48 lights lowered
19:02 replay card: afterglow-17

capture.pcap was a USER0 capture with 87 packets, one per second over 86 seconds. Two packet types:

  • 80 IDLE packets, each IDLE + 18 bytes of high-entropy payload (cover traffic)
  • 7 LIVE packets, each LIVE + seq (uint16 BE) + len (uint16 BE) + data

The LIVE packets carried the replay data. Their seq values ran 0 to 6 with data lengths [7, 7, 7, 7, 7, 7, 2]. Concatenating the data fields in seq order gave 44 bytes:

ac95e2a67b7d7476fafbb326bbc4b4e83f2a3822e2fabe71ead9e5fd37282222f8abe172e9c7bda338286d3e

That blob is not plaintext, not a file magic, and not valid zlib. The session.log entry afterglow-17 is the key material. Taking SHA256("afterglow-17") and using its first 12 bytes as a repeating XOR key:

import hashlib
live = bytes.fromhex(class="hljs-string">"ac95e2a67b7d7476fafbb326bbc4b4e83f2a3822e2fabe71ead9e5fd37282222f8abe172e9c7bda338286d3e")
key = hashlib.sha256(bclass="hljs-string">"afterglow-17").digest()[:12]
plain = bytes(b ^ key[i % len(key)] for i, b in enumerate(live))
print(plain.decode())

produces:

safctf{5554fd00-017a-4915-a883-a7ef2639f73b}

The IDLE packets are noise. The value resides in the LIVE replay stream, XORed with a key derived from the replay card name recorded in the session log.

Flag:

safctf{5554fd00-017a-4915-a883-a7ef2639f73b}