HQ HQData est. 2026 / vault n.01
Case file · CTF-ZD-001 · available on license Volume N.01 · Offensive Security · Reasoning corpus

Security Reasoning
Corpus.

A founding release for teams training cyber-capable models on real operator traces. The corpus captures the parts generic security content usually loses: the vulnerability stated plainly, the tool choice, the discarded branches, and the sequence that actually reaches the exploit.

Call number CTF-ZD-001
Records 10k+
Formats SQLite, JSONL
Pricing from $1,990

What is inside.

Every entry pairs a real security problem with one or more expert solutions. The problem block preserves the original prompt verbatim, plus binary protections, flag formats, and any provided artifacts. The solution block reconstructs the full reasoning path: the canonical vulnerability, the technique chain, the tool inventory, the working exploit script, and the recovered flag.

Beyond the happy path, we record the dead ends. Every record carries a failed_hypotheses log with the approaches that were tried, why they were tried, what killed them, and the lesson extracted. A decision_trace captures the judgement calls at branching points: the options considered, the chosen path, the rationale, and a confidence rating. This is the signal that separates senior practitioners from tutorials, and the signal that scraping writeups cannot give you.

Composite SHA-256 identities deduplicate the same problem across multiple authors while preserving every solution as its own multi-perspective record. Quality scoring is explicit, reproducible, and exposed in every row.

Who it is for.

AI-native security startups, eval teams, research labs, and vendors adding cyber-agent capabilities. It fits best when the buyer needs commercially usable data for training, eval development, or internal experimentation and wants more structure than raw public writeups.

How to review it with buyers.

This corpus is not being sold as a pile of CTF writeups. CTF tasks are the legal training substrate: controlled problems where the reasoning, tool selection, and exploit chains are observable and reproducible. That makes the data useful both for fine-tuning and for designing internal evaluation workflows.

For the first customers, the winning move is not a vague "models get better" promise. It is a concrete sample review: representative records, schema clarity, evaluation ideas, and a clean explanation of what signal the corpus adds. The panel here shows the kind of reasoning-depth comparison buyers should expect to see, not a public performance benchmark.

Schema disclosure.

Top-level fields on every record. Full reference, JSON examples, and export formats ship with every license.

challenge_idComposite SHA-256 over normalised event + task names. Primary dedup key.
event_nameCanonical event label, e.g. "DownUnderCTF 2020".
categorypwn, web, crypto, rev, forensics, misc, osint, stego, jail, blockchain, hardware, mobile.
difficultyGround truth when available, else inferred from solves/points. One of trivial | easy | medium | hard | insane.
descriptionThe challenge prompt as contestants saw it, verbatim.
binary_infochecksec output and basic static analysis for binary challenges: arch, bits, NX, PIE, canary, RELRO.
vulnerabilityPlain-language root cause of the break.
technique_chainOrdered array of canonical technique labels from our taxonomy.
tools_usedConcrete tool inventory: pwntools, ghidra, seccomp-tools, libc-database, and so on.
solve_stepsStructured step objects with phase, action, command, tool, and observation. The training signal.
failed_hypothesesArray of rejected approaches with rationale, test, result, and extracted lesson.
decision_traceArray of branching decisions with options considered, chosen path, rationale, and confidence.
exploit_codeFull, working exploit script. Language captured separately.
flagRecovered flag, preserved verbatim.
quality_score0.00 to 1.00. Weighted over description, structured steps, code, flag, tools, vulnerability identification, and failed approaches.
§ 04  //  specimens

Ten records, unredacted below the line.

Ten examples across pwn, web, crypto, reverse, forensics, kernel, blockchain, stego, and OSINT. Same reasoning shape; different depth, technique, and tools. Redactions ship in the clear on license.

file: record #01 / 10ctf-zd-001 · pwn · q=0.95
// challenge event: "DownUnderCTF 2020" task: "Return to what's revenge" category: "pwn" difficulty: "hard" quality: 0.95 // solution vulnerability: "Stack buffer overflow via gets() on 40-byte buffer. Seccomp whitelist permits open/read/write; execve blocked." technique_chain: ["buffer-overflow", "rop-libc-leak", "libc-identification", "rop-syscall-chain-open-read-write"] tools_used: ["checksec", "ghidra", "seccomp-tools", "pwntools", "libc-database"] failed_hypotheses: [ "ret2libc system('/bin/sh'): seccomp BPF kills execve (syscall 59); filter confirmed via seccomp-tools dump", "SROP with one sigreturn frame per syscall: ~248 bytes/frame, total ~1000 bytes vs 300-byte pop-gadget chain. Rejected on size", "mmap+mprotect for RWX shellcode: added complexity with a known flag path. Dropped for direct ORW" ] decision_trace: [ "After seccomp-tools showed open/read/write whitelisted, chose ORW ROP chain over SROP or shellcode: textbook bypass, compact, flag path known", "Stored filename and file contents in BSS (bss+0x30 / bss+0x40). No PIE means static addresses, no leak needed" ] exploit_code: | from pwn import * context.binary = elf = ELF('./vuln') libc = ELF('./libc-2.27.so')                                            flag: "DUCTF{...}"
file: record #02 / 10ctf-zd-001 · forensics · q=0.91
// challenge event: "TAMUctf 2026" task: "Phantom 2" category: "forensics" difficulty: "medium" quality: 0.91 // solution vulnerability: "Flag hidden in orphan commit of a public GitHub repo. Main branch does not reference it; reflog + fsck expose it." technique_chain: ["git-forensics", "orphan-commit-discovery", "reflog-walk"] tools_used: ["git", "github-api", "python-requests"] failed_hypotheses: [ "Brute-forcing branch names against GitHub API: rate-limited at 60 req/h without token, low hit-rate", "GitHub code-search API: only indexes default branch HEADs, orphan commits invisible" ] decision_trace: [ "git clone --mirror then git fsck --unreachable, iterating git cat-file --batch over dangling commits until flag regex hits" ] exploit_code: | import subprocess subprocess.run(['git', 'clone', '--mirror', TARGET]) unreachable = subprocess.check_output(['git', '-C', 'repo.git', 'fsck', '--unreachable'])                                            flag: "gigem{...}"
file: record #03 / 10ctf-zd-001 · web · q=0.88
// challenge event: "HackTheBox 2025" task: "Headless" category: "web" difficulty: "medium" quality: 0.88 // solution vulnerability: "Server-side template injection in admin error page. User-Agent header rendered directly through Jinja2 on 500 responses." technique_chain: ["recon", "header-injection", "ssti-jinja2", "python-rce"] tools_used: ["burp", "curl", "python"] failed_hypotheses: [ "Reflected XSS on product-search parameter: CSP enforces nonce-based script-src, output escaped", "SQLi on search endpoint: parameterised, no boolean/time-based delta measurable" ] decision_trace: [ "Probed {{7*7}} in User-Agent against a forced 500: response body returned '49', confirmed Jinja2 SSTI in error template" ] exploit_code: | import requests p = "{{ request.application.__globals__.__builtins__.__import__('os').popen('id').read() }}" r = requests.post(LOGIN_URL, headers={'User-Agent': p}, data=BAD_CREDS)                                            flag: "HTB{...}"
file: record #04 / 10ctf-zd-001 · crypto · q=0.93
// challenge event: "PicoCTF 2024" task: "Smooth Criminal" category: "crypto" difficulty: "hard" quality: 0.93 // solution vulnerability: "ECDSA signing oracle reuses nonce k across two distinct messages. Private key recoverable in closed form." technique_chain: ["nonce-reuse-detection", "ecdsa-private-key-recovery", "signature-forgery"] tools_used: ["sage", "python", "fastecdsa"] failed_hypotheses: [ "Discrete log attack on secp256k1: computationally infeasible inside the competition window" ] decision_trace: [ "Oracle returned identical r for two distinct H(m). Recovered k = (H1 - H2) * (s1 - s2)^-1 mod n, then d = (s*k - H) * r^-1 mod n. Verified by re-signing a probe" ] exploit_code: | from fastecdsa.curve import secp256k1 as C n = C.q k = ((h1 - h2) * pow(s1 - s2, -1, n)) % n                                            flag: "picoCTF{...}"
file: record #05 / 10ctf-zd-001 · rev · q=0.96
// challenge event: "Midnight Sun CTF 2024" task: "Kiwi" category: "rev" difficulty: "insane" quality: 0.96 // solution vulnerability: "Custom stack-based VM with obfuscated opcode dispatch. Flag check is a bytecode routine combining XOR and bit rotation." technique_chain: ["vm-opcode-recovery", "dispatch-table-extraction", "symbolic-execution"] tools_used: ["ghidra", "angr", "python", "unicorn"] failed_hypotheses: [ "XOR key brute up to 4 bytes: keyspace too large, no structural match against captured output", "Ghidra native decompilation on the dispatcher: computed jump table produced noise, not recoverable pseudo-code", "Pattern-match against known CTF VM fingerprints: custom ISA, no signature overlap" ] decision_trace: [ "Extracted dispatch table via Ghidra xref on the opcode-fetch site, then ran each opcode through Unicorn with instrumented hooks to record register/memory deltas, reconstructing the ISA semantically", "Solved the final flag-check constraint symbolically with z3 after extracting per-byte XOR+rotation expressions" ] exploit_code: | from unicorn import Uc, UC_ARCH_X86, UC_MODE_64 from z3 import BitVec, Solver, RotateLeft mu = Uc(UC_ARCH_X86, UC_MODE_64); mu.mem_map(BASE, 0x4000)                                            flag: "midnight{...}"
file: record #06 / 10ctf-zd-001 · pwn · q=0.92
// challenge event: "SECCON 2024" task: "Backpack" category: "pwn" difficulty: "hard" quality: 0.92 // solution vulnerability: "glibc 2.36 tcache poisoning via UAF. Struct contains a function pointer; controlled next-ptr overwrite lands on __free_hook." technique_chain: ["uaf", "tcache-poisoning", "free-hook-overwrite", "one-gadget"] tools_used: ["pwndbg", "pwntools", "one_gadget", "ghidra"] failed_hypotheses: [ "Largebin attack: required at least 3 pre-UAF allocations, only 2 menu options reachable", "Fastbin dup: tcache reuse path disabled, fastbin consolidation not triggerable", "Unsorted bin split for libc leak: top-chunk protection prevented split, no viable read" ] decision_trace: [ "Single post-free UAF on a struct holding a callback pointer. glibc 2.36 tcache keys are bypassable by poisoning the next-ptr field after heap feng shui. Pointed next-ptr at __free_hook, wrote one_gadget, triggered free() for shell" ] exploit_code: | from pwn import * io = remote(HOST, PORT) create(0, 0x60); free(0); edit(0, p64(libc.sym.__free_hook ^ key))                                            flag: "SECCON{...}"
file: record #07 / 10ctf-zd-001 · blockchain · q=0.90
// challenge event: "DefCon Qual 2025" task: "Quinine" category: "blockchain" difficulty: "hard" quality: 0.90 // solution vulnerability: "Solidity withdraw() executes an external call before updating the sender's balance. Reentrancy drains the pool across recursive calls." technique_chain: ["reentrancy", "checks-effects-interactions-violation", "attacker-contract-deploy"] tools_used: ["foundry", "slither", "anvil"] failed_hypotheses: [ "Stake accounting overflow: SafeMath enforced across every arithmetic op, no wrap-around", "Oracle manipulation via local AMM: target reads Chainlink aggregator, no tamper path in local anvil fork" ] decision_trace: [ "slither --detect reentrancy-eth flagged withdraw() pre-deploy. Deployed attacker contract whose receive() recursively recalls withdraw() until pool == 0. Verified in anvil fork with a 0.01 ETH seed" ] exploit_code: | contract Drain { Target t; constructor(address a) { t = Target(a); } receive() external payable { if (address(t).balance > 0) t.withdraw(); }                                            flag: "OOO{...}"
file: record #08 / 10ctf-zd-001 · stego · q=0.86
// challenge event: "PlaidCTF 2024" task: "Dimension Rift" category: "stego" difficulty: "medium" quality: 0.86 // solution vulnerability: "LSB-encoded payload across the alpha channel of a PNG. Row order scrambled by a key embedded in the EXIF timestamp seconds field." technique_chain: ["lsb-extraction", "exif-metadata-pivot", "row-permutation-recovery"] tools_used: ["zsteg", "exiftool", "python-pillow"] failed_hypotheses: [ "Generic LSB across RGB channels via zsteg: output was structured noise, no flag bytes", "steghide brute with rockyou.txt: passphrase not in dictionary, signature byte absent from file" ] decision_trace: [ "EXIF DateTimeOriginal carried a seconds value of 47, out of the normal capture distribution. Treated it as a numpy.random seed to derive a row permutation; unshuffled the alpha-channel LSBs and reassembled the payload" ] exploit_code: | from PIL import Image; import numpy as np, exifread img = np.array(Image.open('chal.png')) seed = int(exifread.process_file(open('chal.png','rb'))['EXIF DateTimeOriginal'].values[-2:])                                            flag: "PCTF{...}"
file: record #09 / 10ctf-zd-001 · kernel · q=0.97
// challenge event: "RealWorldCTF 2025" task: "KubeSploit" category: "kernel" difficulty: "insane" quality: 0.97 // solution vulnerability: "io_uring SQE submission race in Linux 6.8. Concurrent close() and recvmsg() yields a use-after-free on a socket struct refcount." technique_chain: ["io-uring-race", "socket-uaf", "modprobe_path-overwrite", "root-shell"] tools_used: ["syzkaller", "kvm", "gdb-kernel", "libio_uring"] failed_hypotheses: [ "pipe_buffer spray post-free: slab sits under SLAB_TYPESAFE_BY_RCU, not reclaimable that fast", "shm_file_data spray: allocation size mismatch (0x280 vs 0x100 victim), no overlap", "msg_msg spray: randomize_kmalloc_cache on 6.8 builds breaks deterministic targeting" ] decision_trace: [ "Poll_list allocations sit in the same kmalloc-256 bucket as the victim. Held the recvmsg SQE window open via userfaultfd stall, raced close(fd), then sprayed poll_list to reclaim the freed slot", "Used controlled write primitive to overwrite modprobe_path to /tmp/p, triggered via an unknown-binfmt ENOEXEC; /tmp/p runs as root on first invocation" ] exploit_code: | struct io_uring ring; io_uring_queue_init(8, &ring, 0); sqe = io_uring_get_sqe(&ring); io_uring_prep_recvmsg(sqe, fd, &msg, 0); uffd = syscall(SYS_userfaultfd, O_CLOEXEC | O_NONBLOCK);                                            flag: "rwctf{...}"
file: record #10 / 10ctf-zd-001 · osint · q=0.84
// challenge event: "ASIS CTF 2025" task: "HighNote" category: "osint" difficulty: "medium" quality: 0.84 // solution vulnerability: "Target username reused on SoundCloud. Track description leaks a Discord handle; Discord profile banner embeds flag in the rightmost pixel column." technique_chain: ["username-pivot", "platform-cross-reference", "image-pixel-extract"] tools_used: ["sherlock", "discord-api", "python-pillow"] failed_hypotheses: [ "LinkedIn username pivot: account private, no posts visible without connection", "Twitter / web.archive.org snapshot: account suspended prior to challenge release, cache purged" ] decision_trace: [ "sherlock surfaced an active SoundCloud handle. Track description contained 'dm me on discord 0x??##1234'. Fetched the Discord banner via CDN, extracted the rightmost pixel column as bytes, reassembled the flag" ] exploit_code: | import requests user = requests.get(f'https://api.soundcloud.com/users/{H}?client_id={CID}').json() banner = requests.get(f'https://cdn.discordapp.com/banners/{UID}/{HASH}.png?size=512')                                            flag: "ASIS{...}"
§ 05  //  license & pricing

Founding release pricing.

Research stays self-serve. Team and OEM tiers are sales-assisted so fit, intended use, and delivery scope can be reviewed before anything expensive goes live. Countersigned license PDF and download URL still follow after review, typically within one business day.

RESEARCHImmediate access
USD1,990

Single academic institution. Best for labs evaluating fit through self-serve access.

Buy nowRead license ↗
  • Single institution
  • Non-commercial training
  • All export formats (SQLite + JSONL)
  • 30 days of schema support
  • Fastest self-serve option

Best for labs and evaluators who want the fastest path to the corpus. Self-serve checkout stays live and delivery usually lands within one business day.

REDISTRIBUTIONSales-assisted
USD79,900

Derivative datasets, public evaluation suites, and OEM redistribution rights.

Talk to usRead license ↗
  • Derivative datasets permitted
  • Public evaluation suites
  • Commercial redistribution
  • All export formats
  • Up to 90 days of schema support
  • Attribution required

For OEMs, public evaluation suites, and derivative corpora. Sales-assisted because rights, channel, and attribution terms need review.

By buying or requesting a pilot you are starting the license flow for the tier you select; read the current terms here: Research · Founding Commercial · OEM / Redistribution.
Sample pack / Bundles / Academic Need a sample slice, bundle, or different rights? [email protected]