Skip to content

Hacking

OSVR, from NAND to 0-day: my curriculum for vulnerability research, and how far through it I am.

OSVR: from NAND to 0-day

A dependency-first curriculum for offensive vulnerability research and exploit development, from zero to published original research. The order comes from what each skill needs before it, not from what is popular.

The spine is binary / systems vulnerability research. A web / cloud fork runs in parallel with an earlier path to paid work. Phases 0–4 are a common foundation either way; the choice between them is made at Phase 5, once the foundation shows which one I’m drawn to, and not before.

Progress

Now: Phase 1, The Machine.

A phase is ticked when its gate is passed, not when its resources are finished.

The rules

  1. Gates are the only exit. Not “I covered it”, not “I get it”. Pass the unaided test or stay in the phase.
  2. Ship something public every 14 days. A commit, a writeup, a patch, a note. With no degree, this is the degree.
  3. Pass the gate, not the syllabus. Finishing the resources and passing the gate are different events. Only one counts.
  4. Written authorization or nothing against any system I don’t own, from Phase 5 on.
  5. One primary domain at a time, at most one secondary.

From Phase 6 on, a gate means finding something nobody pointed me at. Reproducing a writeup is study, not a pass. Every gate doubles as a skip test: pass it cold and the phase is done.

The dependency graph

LAYER 0  Linux+CLI ...... programming literacy ...... math
                                                      (algebra -> proofs/induction -> discrete)
LAYER 1  shell-as-adversary   machine model (gates -> CPU -> memory)   CS theory [deferred to L8]
LAYER 2  C + memory model ... data structures (implement, don't import)
LAYER 3  x86-64 asm (read fluently) <--- architecture
LAYER 4  toolchain/loader/formats --- OS internals --- concurrency --- networking
LAYER 5a LAW + authorization + lab (HARD GATE, blocks everything below)
LAYER 5b access control --- crypto (build before break) --- web + browser model --- [FORK]
LAYER 6  static+dynamic RE -> bug classes -> primitives + shellcode (mitigations OFF)
LAYER 7  mitigations + bypass -> heap -> code reuse -> reliability -> ARM64
LAYER 8  automata + decidability -> compilers + dataflow + SSA -> static analysis
LAYER 9  source auditing --- fuzzing --- symbolic exec --- n-day/patch-diff
         triage + exploitability --- disclosure --- Rust/Go FFI boundary
LAYER 10 one or two branches: kernel / browser+JIT / windows / hypervisor / firmware /
         mobile / smart contracts / program analysis / RF / cloud+web VR

The hard edges:

The sequence

Phase 0: Prerequisites

Use the Linux CLI daily, write a small program from scratch, prove a statement by induction. No calculus.

ResourceWhat forHoursStatus / Proof
OverTheWire BanditThe shell through a wargame, all levels40–80In Progress
The Linux Command LineReference——
Khan Academy Algebra 1 → 2The floor: weak algebra sinks induction30–60In Progress
Book of ProofLogic, proof methods, induction40–70—
MIT 6.042JGraph theory and number theory only20–30—

Gate: the three tasks above, cold, no reference.

Phase 1: The Machine

What a computer physically does, in a fortnight, not a season.

ResourceWhat forHours
Code, Petzold, 2nd ed.NAND to CPU, readable on a bus20
Nand2Tetris projects 1–5Build the ALU; numeracy by construction. Stop at 530
picoCTFBeginner encoding, forensics, trivial reversing5

The Hack machine has no cache, MMU or privilege rings: it teaches that computers are comprehensible, not the machine I’ll attack.

Artifact: base conversion and fixed-width arithmetic from scratch, plus an explainer of two’s complement and IEEE-754.

Gate (1 h): a 32-bit hex word on paper, read as unsigned, two’s-complement, IEEE-754 single and four ASCII bytes, by hand, under 5 minutes. Then what two words overflow to when added, and the bytes in little- vs big-endian.

Phase 2: The Program

C properly, the process as a laid-out address space, data structures implemented rather than imported.

ResourceWhat forHours
CS50x weeks 1–5C, first pass. Stop at week 580
Modern C, GustedtC, second pass, never before CS5070
Data structures in CDynamic array, linked list, hash table, BST, graph with BFS/DFS90
Algorithms, EricksonThe chapters the data structures touch60
Discrete Math, LevinPrerequisite for theory and crypto—
Nand2Tetris project 6Write the assembler15
My own C program1,000+ lines, with tests, something I wanted25
Valgrind, ASan, UBSan, gdbFrom week one—
cppreferenceUndefined behaviour is a vulnerability class—
pwn.college Intro to CybersecuritySecurity thread20

Artifact: the C program, public, with its design decisions and tests.

Gate (3 h): draw a recursive function’s stack frame at maximum depth and verify it against the compiled binary; classify five behaviours as defined, unspecified, implementation-defined or undefined; prove a data structure’s invariant by induction.

Phase 3: The Instruction Stream

Read compiled x86-64 and reconstruct the source, without a decompiler.

ResourceWhat forHours
pwn.college Computing 101, Playing With ProgramsHands-on first70
OST2 Arch1001x86-64 assembly, in depth80
OST2 Dbg1012GDB fluency15
CS:APP, 3rd ed.The bomb lab and attack lab60
Compiler ExplorerSource and assembly side by side, always open—
Reverse Engineering for BeginnersReference, never front to back50
challenges.reBetween the ramp and real binaries20
crackmes.oneVolume25
Intel SDMOne instruction at a time, forever—

Artifact: an annotated disassembly of my own program, every instruction explained.

Gate (3 h): an unseen stripped binary: calling convention, argument count and types, the syscall boundary. Disassembler only, no internet.

Phase 4: The System

Down to the syscall boundary, until loader, instruction stream, kernel and wire are visible at once.

ResourceWhat forHours
OSTEPVirtualization, concurrency, persistence; do the projects110
MIT 6.1810xv6 labs: page tables, traps, threads, a filesystem90
OST2 Arch2001x86-64 OS internals, after Arch100160
The Life of BinariesCompile, link, load, run as one story30
ELF and PE by handWrite a parser for each40
Computer Networks: A Systems ApproachThe model50
Stanford CS144Build a working TCP50
Beej’s networking guideWrite the clients40
The Little Book of SemaphoresRaces are a bug class20
The Linux Programming InterfaceSyscall reference—
xv6, musl or SQLiteRead one whole system once—

Artifact: a loader-to-entry-point teardown of a real binary, and a small syscall-layer tool.

Gate (4 h): which mitigations a toolchain applied and how I know; page fault vs segfault, from memory; a race’s interleaving and minimal fix; a binary protocol client from spec, accounting for every captured byte.

Phase 5a: The Boundary (hard gate)

What a trust boundary is, in access control and in law, and a lab that cannot leak. Nothing after this starts until it is passed.

ResourceWhat forHours
Saltzer & Schroeder, The Protection of InformationLeast privilege, fail-safe defaults, complete mediation5
Access-control modelsThreat-model two systems I depend on20
Lei do Cibercrime (Lei 109/2009), Budapest ConventionThe law, read directly15
Five bug-bounty policiesRead side by side as legal documents5
CERT Guide to CVDCoordinated disclosure5
The lab as codeHypervisor, Vagrant or Ansible, host-only networking, snapshots25

Artifact: a published threat model, and a dated written authorization for my own lab plus a one-page summary of the law that applies to me.

Gate (4 h): for five activities against five targets, whether I’m authorized and the specific basis; then destroy the lab, rebuild it from my own scripts and show it can’t reach anything I don’t own. Any “probably fine” fails.

Phase 5b: The Application Surface (the fork)

Build deployments before breaking them. Here I choose: binary spine (Phase 6), web/cloud fork, or both side by side.

ResourceWhat forHours
MIT 6.858Systems security: isolation, privilege separation, side channels60
PortSwigger Web Security AcademyAll labs; SSRF, deserialization, auth, smuggling at source level80
flaws.cloud, flaws2.cloud, CloudGoatIAM privesc, metadata SSRF, tenant isolation60
Serious Cryptography, 2nd ed.Crypto, and how deployments get it wrong45
CryptoHack, Cryptopals sets 1–3Implement the attack85
SEED LabsNetwork, PKI, access control, containers30

Artifact: a crypto-misuse writeup with the maths, and a compromise chain against a target I built or am authorized on.

Gate (6 h): map an unfamiliar application’s trust boundaries and authorization model before testing, then find an authorization or logic flaw nobody pointed me at.

Fork gate: an original, published SSRF or cloud-isolation chain against a named product, plus repeatable income.

Phase 6: The Bug

Find a memory-corruption bug in something I didn’t write, state the primitive precisely, take control. Mitigations off, so the mechanism stays visible.

ResourceWhat forHours
pwn.college Program SecurityShellcode, memory errors, exploitation150
OST2 Vulns1001C/C++ bug-class taxonomy60
Ghidra, pwndbg, pwntoolsThe tools30
exploit.education PhoenixPlanted bugs in tiny programs50
Nightmare, ir0nstone’s notesWhen stuck, after the hint floor70
Smashing the Stack, Once upon a free(), Basic Integer OverflowsThe founding papers7
Practical Binary Analysis, AndriesseWriting my own analysis tools40
Practical Reverse Engineering, Dang et al.RE method across architectures40
A real C-heavy open-source projectHunting, from hour one40

Artifact: a memory-safety bug I found in real software, written up through disclosure.

Gate (8 h): a binary with a memory-corruption bug, no source, no hint: find it, characterize the primitive precisely, demonstrate control of execution. The characterization is the skill, not the crash.

Phase 7: The Defended Target

Everything from Phase 6 against targets that fight back: mitigations on, reliability required, two architectures, no bug handed over. The employability line for the binary track.

ResourceWhat forHours
pwn.college Software ExploitationMitigations on180
Georgia Tech CS6265Graduate binary exploitation70
how2heapHeap techniques per glibc version (record it: 2.44)70
HeapLAB 1, 2Deriving heap techniques (paid, ~€20–40 each)60
ROP EmporiumCode reuse, 32- and 64-bit40
Azeria LabsARM64, the second architecture70
pwnable.tw, pwnable.krCTF-grade practice60
Shacham, Geometry of Innocent Flesh; SoK: Eternal War in MemoryROP, and mitigations as a system10
Vendor docs: glibc, Intel CET, ARM PAC/BTI/MTE, MS CFGCurrent mitigations50
BinDiff, DiaphoraPatch diffing: three CVEs to PoC60
Exploit-DBTen exploits for one bug class across a decade20
CTFtimeA team, one competition per quarter40

Artifact: an end-to-end exploit against modern mitigations, a valid in-scope bounty finding, and a patch-diffing writeup.

Gate: reliable code execution against NX, full RELRO, PIE, canary and ASLR at ≥80% over 100 runs (12 h); find and exploit an undisclosed bug with mitigations on (16 h); a known bug class on an unfamiliar binary in 4 hours.

Phase 8: The Theory

Automata, compilers, dataflow and static analysis, placed late so it never blocks a beginner but comes before the research that needs it.

ResourceWhat forHours
Models of Computation, Erickson or MIT 18.404JAutomata and undecidability50
Crafting InterpretersBuild a parser and bytecode VM once60
Static Program AnalysisDataflow, lattices, abstract interpretation60
LLVM passesInstrumentation, how fuzzing works40
A hand-written parserFor a real attacker-controlled format20

Artifact: a small analysis tool, with what it computes and what it soundly cannot.

Gate (4 h): recover a flattened control-flow graph; a dataflow analysis by hand with its lattice and fixed point; why no analyser can decide whether an arbitrary program has a given bug.

Phase 9: The Research

Pick a target on my own reasoning, audit adversarially, fuzz as engineering, triage, disclose.

ResourceWhat forHours
The Art of Software Security AssessmentAuditing as a method100
Codebases with their CVE historiesSupervised audit practice, approximated120
Fuzzing101Fuzzing real software to real CVEs60
AFL++Read the engine; write harnesses80
The Fuzzing BookGrammar, coverage, mutation, reduction60
OSS-FuzzA harness in a real project60
libFuzzer, honggfuzzSecond and third engines30
Klees et al., Evaluating Fuzz TestingBefore believing any benchmark5
angrSymbolic and concolic execution60
CodeQLTurn one bug into a query for its variants50
Project Zero, RCAsFinished research as a model, one per fortnight60
C–Rust FFI boundarycargo-fuzz, unsafe-block auditing40
CERT Guide to CVD, security.txtDisclosure20

Artifact: a coordinated disclosure with a published timeline.

Gate: a previously unknown defect in software I chose myself, triaged unaided and carried through disclosure to resolution.

Phase 10: The Frontier

One or two branches, never more.

BranchNoteNeeds
Linux kernelThe most direct extension of Phase 7Phase 7
Browser + JITHighest ceiling, no structured coursePhases 5b + 8
WindowsHalf the fieldPhase 7
Program analysisTheory into tools nobody else hasPhase 8
HypervisorsSmall field, brutal entryKernel
Firmware / hardwareA complete free path nobody knows aboutPhase 4
MobileLarge paid surfacePhase 7
Smart contractsShortest path from study to paid workPhase 9
Cloud / webThe fork’s deep endFork gate
RF / SDRThe only branch that needs calculusCalculus

Gate: original research in the branch that a stranger cites, adopts or builds on.