Day-of playbook

Read once the week before, skim again the morning of. Registration, offline pre-staging, CTF mechanics, triage order, and what to bring.

On this page
  1. The week before
  2. Pre-staging the environment
  3. CTF mechanics, for a first-timer
  4. Day-of workflow
  5. Pattern-recognition table
  6. What to bring
  7. After: writeups

The week before

Do not assume a specific start time or room. Check the platform and Discord directly.

Pre-staging the environment

The DEF CON network is hostile and unreliable by design and by reputation — assume there is no working internet on-site, and treat any internet that does work as adversarial. Everything needed has to be installed, configured, and tested offline before travel. Nothing gets pip installed on the con floor.

These pages work offline: git clone the repo and open site/index.html directly from disk, no server needed.

Pre-flight checklist — run through this at home, on the actual network you'll use con-side if possible (e.g. phone hotspot with WiFi/data off, to simulate no connectivity):

CheckCommand / action
venv builds on Python 3.12python3.12 -m venv .venv && source .venv/bin/activate && pip install -r env/requirements.txt
Qiskit + Aer import and runpython -c "import qiskit; from qiskit_aer import AerSimulator; print('ok')"
liboqs (PQC) installedbrew install liboqs && pip install liboqs-python, then python toolkit/pqc.py
Every toolkit module self-test green./run_selftests.sh
Toolkit importable from a scratch notebookopen Jupyter offline, from toolkit import bb84, chsh, qasm_tools, algorithms, pqc
This repo cloned locally, not just on GitHubgit clone to the laptop; confirm site/index.html opens from file://
Offline docs cachedlocal copies or downloaded PDFs of the Qiskit API reference, OpenQASM spec, Q# kata docs
Repo itself has no uncommitted state you needgit status clean, everything pushed somewhere retrievable

CTF mechanics, for a first-timer

This is background a CTF veteran wouldn't think to explain. It matters here because the first hour of the first-ever CTF is the worst time to be figuring out the UI instead of the challenges.

Day-of workflow

  1. Sweep every category's intro challenge first. Each category on the board opens with an easy, usually low-point intro challenge that unlocks the rest of that category (later challenges may be locked, or just conceptually build on it). Before going deep on anything, touch every category at least once. This also surfaces which categories are actually live/working early, when a report to the organizers still helps.
  2. Then sort by points ascending within the strongest categories (BB84/QKD and OpenQASM are historically the highest-yield). Low point value after the dynamic-scoring adjustment is a reasonable proxy for "most teams have already solved this" — i.e., probably approachable.
  3. Keep a Jupyter scratchpad open for the whole event, toolkit imported once: from toolkit import bb84, chsh, qasm_tools, algorithms, pqc, crypto_utils, qsim. Reuse the same kernel across challenges rather than re-launching.
  4. Note-taking discipline: one file per challenge under writeups/<challenge-name>/. Paste the challenge text in verbatim first — before doing anything else — then log what was tried, in order, including dead ends. This is what makes a later writeup possible without having to reconstruct the session from memory.
  5. Timebox each challenge. Pick a hard limit (e.g. 30–40 min) before starting. When it's hit with no thread to pull, stop and rotate to something else on the board rather than tunnelling. Coming back later with fresh eyes routinely unsticks things that felt impossible mid-session.
  6. Deciding when to keep going vs. move on: a partial result — a sifted key with a high QBER, a circuit that's close to the line budget, a factor that divides evenly but isn't prime — usually means the approach is right and it's an off-by-one or parameter issue, not a wrong technique. That's worth pushing through the timebox for. No traction at all after the timebox (no idea which toolkit module even applies) is the signal to bank the time and come back later, possibly after a hint.

Pattern-recognition table

Fast lookup from challenge-text keywords to category and toolkit entry point. This is the table to scan first when a challenge description doesn't immediately say what it is.

Keywords in challenge textCategoryToolkit entry point
"bases," "sifting," "Alice and Bob," "eavesdropper"BB84 / QKDbb84.sift, bb84.reconstruct_key, bb84.qber
"referee," "win rate," "75%," "Bell"CHSHchsh.quantum_winrate, chsh.classical_winrate
"in N lines or fewer," ".qasm"Circuit golfqasm_tools.golf_report, qasm_tools.load_qasm
"distinguish," "one query," "oracle"Q# kata / phase kickbackQ# kata harness — see categories page
"factor," "modulus," "RSA"Shoralgorithms.shor_factor
"find the input such that"Groveralgorithms.grover_search, algorithms.phase_oracle
"Kyber," "ML-KEM," "Dilithium," "signature"Post-quantum cryptopqc.kyber_encaps/kyber_decaps, pqc.dilithium_sign/verify
unfamiliar file, no obvious quantum contentMisc / stegofile, strings, exiftool, LSB extraction

What to bring

After: writeups

Keep the per-challenge notes in writeups/ (see day-of workflow) good enough that they could be published afterward with light editing — challenge text, approach, what worked, what didn't. This prep leaned directly on other people's published writeups (the CharonV DEF CON 32 walkthrough, the CUJO AI DEF CON 2021 CHSH/BB84/AES writeup — both linked from the start page); publishing a writeup afterward is how that same body of knowledge keeps growing for the next person doing this same prep.