Skip to main content

Reference

Evidence and provenance

Where every number on this site comes from, what the corpus is, what it is not, and the two images this course refuses to publish.

This course teaches from one curated research package. Every claim on every week page resolves to a file in it, and every one of those files is published here byte-for-byte — not retyped, not tidied, not summarised. The snippets you see inside week pages are sliced out of these same files while the site builds, so a listing on a page and the artefact behind it cannot drift apart.

artefacts published verbatim, with their SHA-256 recorded
181artefacts published verbatim, with their SHA-256 recordedartefacts/published-evidence.json
of source, IR, disassembly, graphs, solver queries and result files
10.3 MBof source, IR, disassembly, graphs, solver queries and result filessum of the published set
retained Windows x64 specimens, catalogued here and distributed through the lab
21retained Windows x64 specimens, catalogued here and distributed through the labBINARY_INDEX.json
executables downloadable from this site — deliberately
0executables downloadable from this site — deliberatelysee the execution boundary below

The frozen source

One 483-line C file underlies the entire corpus. It was frozen — hash recorded — before any build, and re-checked before every one of the sixty-eight builds in the comparison matrix. That is the fact that makes the rest of the course possible: no difference between two specimens can be a difference in the program.

SHOWCASE_VERSION.txt

the identity every build was checked against
SHOWCASE CORPUS VERSION: 1.0
SOURCE FILE: showcase.c
SOURCE SHA-256: 39FEF0BB2A9742870F3D6F7CC864F7CFFA129136F6D2A59C4FB37F25906B99D2
VALIDATION DATE: 2026-09-11 (Australia/Sydney)

CANONICAL SEMANTIC INPUTS
g_input_a = 0x00001337
g_input_b = 0x12345678

EXPECTED RESULTS
demo_substitution       = 0x08080000
demo_bogus_control_flow = 0x6665BBBC
demo_flattening         = 0xDBEFFCE7
demo_calls              = 0x12345F05
demo_data               = 0x57977293
demo_combined           = 0xEEBB6D71

FREEZE STATUS
Validated clean on Windows x64 with MSVC 19.51.36248,
Visual Studio clang-cl 22.1.3, and MSYS2 UCRT64 GCC 16.2.0.
All three executables produced the expected output and exit status 0.
21 linesopen SHOWCASE_VERSION.txt(693 B)

The same hash is recorded independently in the matrix report, the BinProtect report and the corpus description, and the copy this site publishes hashes to 39FEF0BB2A974287… — which is how you can tell nothing was edited in transit.

Its six exported targets each exist for a reason:demo_substitution has twenty-four repeated arithmetic sites,demo_bogus_control_flow has four genuine source conditions with memorable constants, demo_flattening has an if/else, a four-iteration loop and a four-way switch that reconverges, anddemo_calls, demo_data anddemo_combined cover calls, string and table data, and a mixed case. The program prints its six answers and checks them itself, which is what makes "did this build work?" a question with a one-line answer.

The specimens

Twenty-one executables, all Windows x64 PE. The retained runtime column is inherited from the original experiments and was not re-run during curation; the lab column is the course's own rule about what you may execute.

SpecimenLaneRetained runtimeIn the labdemo_substitutiondemo_bogus_control_flowdemo_flatteningSHA-256
ollvm16_clean_O0.exebaselines/ollvm16PASSrunnable0x10300x12100x12d07FC180DAA499…
polaris_clean_O0.exebaselines/polarisPASSrunnable0x10300x12100x12d04C75C71BD29C…
tigress_clean_O0.exebaselines/tigressPASSrunnable0x10600x14600x15004E366B3192FA…
ollvm16_sub_O0.exes01_ollvm_subPASSrunnable0x10700x15200x16701219EFD932F8…
polaris_mba_O0.exes02_polaris_mbaPASSrunnable0x10300x1a700x1b3048A7750AAAD7…
ollvm16_bcf_O0.exes03_ollvm_bcfPASSrunnable0x12400x16300x1cc03ED20E83BE53…
ollvm16_bcf_O0_triton_rewritten.exes03_ollvm_bcfPASSrunnable0x12400x16300x1cc015BF8731CD94…
polaris_bcf_O0.exes07_polaris_bcfPASSrunnable0x10300x12100x1670859F3F4303CF…
polaris_bcf_O0_triton_rewritten.exes07_polaris_bcfPASSrunnable0x10300x12100x16706E5C2E7D5AB2…
ollvm16_fla_O0.exes04_ollvm_flaPASSrunnable0x10300x12100x1440239D02B425E7…
ollvm16_fla_O0_stock_unflattened.exes04_ollvm_flaPASSrunnable0x10300x12100x1440FCF8827FF1E7…
polaris_fla_O0.exes05_polaris_fla_wrongPASSrunnable0x10300x12100x12d037DF40569659…
INCORRECT_DEOBFUSCATION_DO_NOT_USE_AS_WORKING_BINARY.exes05_polaris_fla_wrongWRONGinspect only0x10300x12100x12d0B5128151069B…
tigress_encode_arithmetic_O0.exes06_tigress_arithmeticPASSrunnable0x11d00x11100x1020DBC1B4078560…
tigress_encode_arithmetic_Ox.exes06_tigress_arithmeticPASSrunnable0x11a00x11100x102072AE9EF96306…
tigress_flatten_O0.exes08_tigress_flattenPASSrunnable0x13800x12c00x10204201A5095EFE…
showcase.exetigress clean O3PASSrunnable0x10300x11f00x1250E96777D3A2A3…
showcase.exehikari clean O0PASSrunnable0x10300x12100x12d01FCACD6A48C8…
showcase.exehikari fla O0PASSrunnable0x10300x12100x1440E7817F325DA3…
showcase.exetigress add_opaque O0PASSrunnable0x20500x11100x1020EC0422510CB4…
stock_rewritten.exeHikari FLA O0 stock rewritePASSrunnable0x10300x12100x144074FAC943439A…

One row is the reason the last column exists. The file namedINCORRECT_DEOBFUSCATION_DO_NOT_USE_AS_WORKING_BINARY.exe is a structurally valid PE, produced by a real tool that exited zero, which returns the wrong answer. It is kept, under that name, as negative evidence. It is not a broken build to be fixed and it is not to be executed as a working program.

The execution boundary

Reading works anywhere. Source, IR, generated C, exact disassembly, recovered graphs, solver queries and every result file are published here and are enough for every core exercise in the course, offline, on any platform. Execution and debugging need the Windows x64 lab image. No Wine route is supported and no Linux rebuild is equivalent — a rebuild would be a different specimen with a different ABI and different lowering.

No BinProtect protected output is bundled either, and none is published here. All eight tested protected outputs failed at runtime — seven access violations and one hang — so that lane is static-analysis evidence only and has no runnable specimen to distribute.

No PDB or MAP file is included anywhere, on purpose. Navigate by export name or by loaded base plus RVA. For a rewritten specimen, decline the original PDB if a debugger offers it: the RSDS identifier can survive patching while the instruction mappings inside the rewritten function go stale, which is one of the four traps week 12 collects.

Two images on publication hold

Twenty-five disassembler screenshots were supplied with the package and all twenty-five were inspected. Two of them have visible content that contradicts their filename, and this site does not display either:

The first is labelled as one obfuscator's rewrite; its visible right pane carries state constants and a branch target that match a different family's rewritten graph. The second is named for the arithmetic target and both of its visible pane titles say demo_flattening.

Neither was renamed, deleted or quietly repurposed. They stay in the package with their holds recorded in VISUAL_INDEX.md, and this course uses the alternatives the index recommends instead. A filename is a claim about provenance like any other, and a course that teaches you to check the analyst's evidence should check its own.

There is also evidence the package simply does not contain: no confirmed screenshot of the arithmetic target under source-level encoding, and no screenshot of any lifted IR. Week 5 and week 11 use the retained disassembly and the retained IR text instead of an illustration, and say so.

Reading the artefacts

Three things about these files routinely confuse people on first contact, and none of them is a defect.

Two graph conventions. The branch-rewriting study used a dedicated PE-byte audit that does not split blocks at calls and treatsret as terminal. The unflattening study used Miasm's recursive graphs, which do split at calls. A block count from one is not comparable with a block count from the other, and every page that quotes one names it.

Three disassembly flavours. The retained listings were dumped at different times with different settings. Some are AT&T order with a byte column, some are Intel order with a byte column, and some are Intel order with the bytes packed. Read the operand order before comparing two listings — it is the cheapest provenance lesson available.

Windows paths inside the files. Result files and reports carry absolute E:\Workspace\… paths from the machine the experiments ran on. They are provenance, not instructions, and the research tree they point at is deliberately not bundled.

Six examples worth opening in a disassembler

If you have lab access and an afternoon, these six are where the corpus repays manual reading. Start from the matched clean binary in every case, navigate by export name or RVA, and decline the original debug symbols for any rewrite.

One warning about this table specifically: its story numbers are theolder evidence-pack IDs, not the ones the week pages use. The table's own note says so, and the crosswalk is in VISUAL_INDEX.md. Two numbering schemes for the same eight stories is exactly the kind of provenance hazard this course keeps pointing at, and it is in our own material.

Table 12

Six examples worth opening in IDA

Use the evidence-pack walkthrough for exact binaries, hashes and RVAs.

StoryTargetWhat to compareTeaching point
01 - OLLVM SUBSubstitutionClean vs SUB; native code vs IRBackend canonicalization can undo apparent complexity.
02 - Polaris MBASubstitution115 vs 678 native instructionsLarge arithmetic expansion without many CFG blocks.
03 - OLLVM BCFBogus control flowClean / original / Triton rewriteProof-driven removal of impossible edges.
04 - Polaris BCFBogus control flowSame workflow, another implementationSemantic transfer is stronger than one signature match.
05 - OLLVM FLAFlatteningDispatcher vs working stock rewriteRecovered semantics need not reproduce the clean graph.
06 - Polaris FLAFlatteningOriginal vs explicitly marked wrong rewriteA cleaner-looking graph can compute the wrong answer.

Start with matched clean binaries. For every rewrite, navigate by export / RVA and distrust old PDB mappings.

Export names: demo_substitution, demo_bogus_control_flow, demo_flattening. Story 06 rewrite is failure evidence.Open the original lecture figure (SVG)

Start here

The complete published set, with a SHA-256 for each entry, is at published-evidence.json. The seventeen full research reports are under /artefacts/reports/ and are linked from the week that uses them.

Enlarged evidence

Open the file