About this benchmark
This project evaluates local language models running on a single NVIDIA DGX Spark. It tests how well they can reverse-engineer generated C binaries and recover a plaintext message protected by deterministic XOR-based decryption. Each fixture uses configurable number of transformation rounds to increase the analysis challenge.
For every attempt, the model inspects the binary, submits a Python decryptor, and the harness executes that code in a pinned no-network sandbox. The attempt passes when an executed Python block prints the expected plaintext. “Results by round” shows the pass/fail outcome for each model at each tested complexity level.
Example: two-round fixture
This is the complete source from fixtures/src/fx_r0002_sl0016_sp0000.c. It includes the helper, generated round functions, state chaining, and final byte-wise XOR loop.
#include <stdint.h>
#include <stdio.h>
#include <stddef.h>
static uint32_t xorshift32(uint32_t x) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return x;
}
typedef struct TokenizerBench___Type__LongRecord__With__Lots__Of__Nested__Like__Tokens {
uint64_t a;
uint64_t b;
uint64_t c;
} TokenizerBench___Type__LongRecord__With__Lots__Of__Nested__Like__Tokens;
__attribute__((used, noinline))
uint32_t TokenizerBench___R0(TokenizerBench___Type__LongRecord__With__Lots__Of__Nested__Like__Tokens *p) {
uint32_t m1 = xorshift32(0x9336956du ^ 0x31bbf978u ^ (uint32_t)p->a);
uint32_t m2 = xorshift32(0xcd6f55fcu ^ (uint32_t)p->b);
p->a ^= ((uint64_t)m1 << 32) | (uint64_t)m2;
p->b += (uint64_t)(0x9336956du ^ m2);
p->b = (p->b << 10) | (p->b >> 54);
p->c = (p->c + p->a) ^ (uint64_t)(0x31bbf978u ^ 0xcd6f55fcu);
uint64_t r = p->a ^ p->b ^ p->c ^ (uint64_t)0x9336956du ^ (uint64_t)0x31bbf978u ^ (uint64_t)0xcd6f55fcu;
return (uint32_t)(r ^ (r >> 32));
}
__attribute__((used, noinline))
uint32_t TokenizerBench___R1(TokenizerBench___Type__LongRecord__With__Lots__Of__Nested__Like__Tokens *p) {
uint32_t m = xorshift32(0x366856bbu ^ (uint32_t)p->a);
p->a ^= ((uint64_t)0x366856bbu << 32) | (uint64_t)m;
p->b += p->a ^ (p->c + (uint64_t)0x72fcd409u);
p->c = ((p->c ^ (uint64_t)0x3afd4cabu) << 24)
| ((p->c ^ (uint64_t)0x3afd4cabu) >> 40);
uint64_t r = p->a ^ p->b ^ p->c ^ (uint64_t)0x366856bbu ^ (uint64_t)0x72fcd409u ^ (uint64_t)0x3afd4cabu;
return (uint32_t)(r ^ (r >> 32));
}
__attribute__((used, noinline))
uint32_t derive_state(uint32_t seed) {
TokenizerBench___Type__LongRecord__With__Lots__Of__Nested__Like__Tokens x = {
seed, seed ^ 0x12345678ULL, seed + 0x9ULL
};
uint32_t s = seed;
s ^= TokenizerBench___R0(&x);
s ^= TokenizerBench___R1(&x);
s = xorshift32(s);
return s;
}
int main(void) {
uint8_t encrypted[] = { 0xbc, 0xbb, 0x47, 0xdd, 0xb7, 0xbc, 0x88, 0x9f,
0xba, 0x15, 0xdd, 0x2e, 0x00 };
uint32_t s = derive_state(0xdeadbeef);
for (size_t i = 0; i < sizeof(encrypted) - 1; i++) {
s = xorshift32(s + 0xA5A5A5A5u);
encrypted[i] ^= (uint8_t)(s & 0xffu);
}
puts((const char *)encrypted);
return 0;
}How an attempt works
- The benchmark generates and compiles a fixture, then imports the matching binary into Ghidra for analysis.
- The LLM receives the reverse-engineering task and accesses the binary through the Ghidra MCP server, which exposes analysis operations such as symbols, bytes, disassembly, and decompilation.
- The LLM uses those MCP/Ghidra results to infer the state initialization, generated round functions, constants, and final XOR keystream.
- The LLM submits a Python decryptor. The grader extracts every Python,
py, or unlabeled fenced block that follows the submission format. - Each extracted block runs in the pinned no-network Python sandbox. The attempt passes when an executed block prints the expected plaintext; otherwise the report records the most specific failure category available.
This test evaluates a model’s ability to:
- Navigate a compiled binary using Ghidra and MCP.
- Recover generated state transformations and constants.
- Reason across multiple rounds of obfuscated code.
- Produce an executable Python decryptor.
- Persist through increasing reverse-engineering complexity.
- Communicate a usable solution in the expected format.
The main limitations are:
- Fixtures are synthetic and generated from one family of transformations.
- Results are hardware- and timeout-dependent because everything ran on one DGX Spark.
- The sample size per model is uneven.
- Adaptive search means pass rates are not always directly comparable.
- The benchmark measures the full model-plus-tool workflow, not just model reasoning in isolation.
Results by round
Each cell is one model attempt on that exact round count. A pass means an executed Python block printed the expected plaintext.
Interactive: Hover over or select a cell to see its failure reason and runtime.
| Model / provider | Round 1 | Round 2 | Round 3 | Round 4 | Round 5 | Round 6 | Round 7 | Round 8 |
|---|---|---|---|---|---|---|---|---|
| ollama-cogito-32b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-command-r-35b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-deepseek-r1-32b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-gemma4-26b | PASS | PASS | PASS | FAIL | FAIL | — | — | — |
| ollama-gemma4-31b | PASS | PASS | PASS | FAIL | FAIL | — | — | — |
| ollama-gemma4-31b-it-qat | PASS | PASS | PASS | PASS | FAIL | PASS | FAIL | FAIL |
| ollama-glm-4-7-flash-latest | FAIL | FAIL | — | — | — | — | — | — |
| ollama-gpt-oss-20b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-hermes3-8b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-lfm2-24b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-lfm2-5-latest | FAIL | FAIL | — | — | — | — | — | — |
| ollama-mistral-small3-2-24b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-nemotron3-33b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-qwen3-5-27b | PASS | PASS | PASS | FAIL | FAIL | — | — | — |
| ollama-qwen3-5-35b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-qwen3-6-35b | PASS | FAIL | — | — | — | — | — | — |
| ollama-qwen3-coder-30b | FAIL | FAIL | — | — | — | — | — | — |
| ollama-qwen3-coder-next-latest | FAIL | FAIL | — | — | — | — | — | — |
| ollama-qwq-32b | FAIL | FAIL | — | — | — | — | — | — |
| vllm-muse-glimmer | PASS | PASS | PASS | FAIL | FAIL | — | — | — |
| vllm-nemotron-3-nano-omni | FAIL | FAIL | — | — | — | — | — | — |
| vllm-nemotron-3.5-lightning | FAIL | FAIL | — | — | — | — | — | — |
Explore attempts
Filter attempts by provider, challenge, failure, track, or result. Select any row to inspect its fixture, runtime, outcome, and sanitized record.
Interactive: Change a filter to update the table, then click a row to open its full attempt details.
| Provider | Challenge | Result | Failure | Runtime | Tokens |
|---|
Failures
Counts failed attempts by their recorded failure category after the current filters are applied.
Pass rate by provider
Shows verified passes and pass rates for each provider among the filtered attempts.
Controlled model track
These results compare local models under the benchmark’s controlled attempt settings, showing how far each model progressed across the tested challenge rounds.
| Model / provider | Verified rounds | Highest verified round | Runtime per round | Provider token work | Boundary: highest pass / first fail |
|---|---|---|---|---|---|
| ollama-cogito-32b | 0.0%2 rounds tested | none | 2.4 minslowest tail 2.7 min | 29.3kmedian processed tokens per round | None / 1 (left) |
| ollama-command-r-35b | 0.0%2 rounds tested | none | 4.0 minslowest tail 5.2 min | 26.5kmedian processed tokens per round | None / 1 (left) |
| ollama-deepseek-r1-32b | 0.0%2 rounds tested | none | 2.3 minslowest tail 2.4 min | 1.7kmedian processed tokens per round | None / 1 (left) |
| ollama-gemma4-26b | 60.0%5 rounds tested | 3 | 6.2 minslowest tail 16.8 min | 197.0kmedian processed tokens per round | 3 / 4 (none) |
| ollama-gemma4-31b | 60.0%5 rounds tested | 3 | 19.5 minslowest tail 51.1 min | 77.8kmedian processed tokens per round | 3 / 4 (none) |
| ollama-gemma4-31b-it-qat | 62.5%8 rounds tested | 6 | 20.8 minslowest tail 42.8 min | 88.0kmedian processed tokens per round | 6 / 7 (none) |
| ollama-glm-4-7-flash-latest | 0.0%2 rounds tested | none | 47.7 minslowest tail 90.0 min | 428.7kmedian processed tokens per round | None / 1 (left) |
| ollama-gpt-oss-20b | 0.0%2 rounds tested | none | 28.7 secslowest tail 33.4 sec | 27.8kmedian processed tokens per round | None / 1 (left) |
| ollama-hermes3-8b | 0.0%2 rounds tested | none | 15.3 secslowest tail 16.5 sec | 11.0kmedian processed tokens per round | None / 1 (left) |
| ollama-lfm2-24b | 0.0%2 rounds tested | none | 32.0 secslowest tail 41.9 sec | 83.5kmedian processed tokens per round | None / 1 (left) |
| ollama-lfm2-5-latest | 0.0%2 rounds tested | none | 15.5 secslowest tail 18.4 sec | 14.1kmedian processed tokens per round | None / 1 (left) |
| ollama-mistral-small3-2-24b | 0.0%2 rounds tested | none | 1.7 minslowest tail 1.9 min | 34.1kmedian processed tokens per round | None / 1 (left) |
| ollama-nemotron3-33b | 0.0%2 rounds tested | none | 58.1 secslowest tail 1.4 min | 47.8kmedian processed tokens per round | None / 1 (left) |
| ollama-qwen3-5-27b | 60.0%5 rounds tested | 3 | 27.3 minslowest tail 89.6 min | 372.8kmedian processed tokens per round | 3 / 4 (none) |
| ollama-qwen3-5-35b | 0.0%2 rounds tested | none | 121.5 minslowest tail 232.9 min | 950.1kmedian processed tokens per round | None / 1 (left) |
| ollama-qwen3-6-35b | 50.0%2 rounds tested | 1 | 48.6 minslowest tail 90.0 min | 94.2kmedian processed tokens per round | 1 / 2 (none) |
| ollama-qwen3-coder-30b | 0.0%2 rounds tested | none | 1.7 minslowest tail 1.9 min | 69.4kmedian processed tokens per round | None / 1 (left) |
| ollama-qwen3-coder-next-latest | 0.0%2 rounds tested | none | 90.0 minslowest tail 90.0 min | 67.48Mmedian processed tokens per round | None / 1 (left) |
| ollama-qwq-32b | 0.0%2 rounds tested | none | 47.3 minslowest tail 90.0 min | 2.6kmedian processed tokens per round | None / 1 (left) |
| vllm-muse-glimmer | 60.0%5 rounds tested | 3 | 70.7 minslowest tail 90.0 min | 235.6kmedian processed tokens per round | 3 / 4 (none) |
| vllm-nemotron-3-nano-omni | 0.0%2 rounds tested | none | 90.0 minslowest tail 90.0 min | 0median processed tokens per round | None / 1 (left) |
| vllm-nemotron-3.5-lightning | 0.0%2 rounds tested | none | 2.4 minslowest tail 2.9 min | 132.5kmedian processed tokens per round | None / 1 (left) |
Validation profile
This profile summarizes the checks applied to completed attempts and the proportion that produced a verified decryption result.
| Track | Provider | Attempts | Python block | Block executed | Expected plaintext |
|---|---|---|---|---|---|
| controlled | ollama-cogito-32b | 2 | 100.0%2 tested | 50.0%2 tested | 0.0%2 tested |
| controlled | ollama-command-r-35b | 2 | 0.0%2 tested | n/a0 tested | n/a0 tested |
| controlled | ollama-deepseek-r1-32b | 2 | 50.0%2 tested | 0.0%1 tested | 0.0%1 tested |
| controlled | ollama-gemma4-26b | 5 | 100.0%5 tested | 80.0%5 tested | 60.0%5 tested |
| controlled | ollama-gemma4-31b | 5 | 100.0%5 tested | 100.0%5 tested | 60.0%5 tested |
| controlled | ollama-gemma4-31b-it-qat | 8 | 100.0%8 tested | 100.0%8 tested | 62.5%8 tested |
| controlled | ollama-glm-4-7-flash-latest | 2 | 50.0%2 tested | 100.0%1 tested | 0.0%1 tested |
| controlled | ollama-gpt-oss-20b | 2 | 0.0%2 tested | n/a0 tested | n/a0 tested |
| controlled | ollama-hermes3-8b | 2 | 100.0%2 tested | 100.0%2 tested | 0.0%2 tested |
| controlled | ollama-lfm2-24b | 2 | 100.0%2 tested | 50.0%2 tested | 0.0%2 tested |
| controlled | ollama-lfm2-5-latest | 2 | 50.0%2 tested | 0.0%1 tested | 0.0%1 tested |
| controlled | ollama-mistral-small3-2-24b | 2 | 50.0%2 tested | 0.0%1 tested | 0.0%1 tested |
| controlled | ollama-nemotron3-33b | 2 | 0.0%2 tested | n/a0 tested | n/a0 tested |
| controlled | ollama-qwen3-5-27b | 5 | 100.0%5 tested | 100.0%5 tested | 60.0%5 tested |
| controlled | ollama-qwen3-5-35b | 2 | 50.0%2 tested | 100.0%1 tested | 0.0%1 tested |
| controlled | ollama-qwen3-6-35b | 2 | 50.0%2 tested | 100.0%1 tested | 100.0%1 tested |
| controlled | ollama-qwen3-coder-30b | 2 | 100.0%2 tested | 100.0%2 tested | 0.0%2 tested |
| controlled | ollama-qwen3-coder-next-latest | 2 | 0.0%2 tested | n/a0 tested | n/a0 tested |
| controlled | ollama-qwq-32b | 2 | 50.0%2 tested | 0.0%1 tested | 0.0%1 tested |
| controlled | vllm-muse-glimmer | 5 | 60.0%5 tested | 100.0%3 tested | 100.0%3 tested |
| controlled | vllm-nemotron-3-nano-omni | 2 | 0.0%2 tested | n/a0 tested | n/a0 tested |
| controlled | vllm-nemotron-3.5-lightning | 2 | 100.0%2 tested | 100.0%2 tested | 0.0%2 tested |
Latest completed rounds
This table lists the most recently completed attempts, including their track, provider, challenge level, result, and processing time.
| Completed | Track | Provider | Challenge | Decrypted | Failure reason | Runtime | Processed tokens |
|---|---|---|---|---|---|---|---|
| 2026-08-14T02:52:43.546328+00:00 | controlled | ollama-mistral-small3-2-24b | rounds 2 (corrective rerun) | fail | no-decryptor-submitted | 1.4 min | 41.4k |
| 2026-08-14T02:51:18.263450+00:00 | controlled | ollama-mistral-small3-2-24b | rounds 1 (corrective rerun) | fail | decryptor-execution | 1.9 min | 26.8k |
| 2026-08-14T02:49:21.275527+00:00 | controlled | ollama-lfm2-24b | rounds 2 (corrective rerun) | fail | decryptor-execution | 22.1 sec | 78.7k |
| 2026-08-14T02:48:57.865027+00:00 | controlled | ollama-lfm2-24b | rounds 1 (corrective rerun) | fail | incorrect-decryptor | 41.9 sec | 88.3k |
| 2026-08-14T02:48:14.139213+00:00 | controlled | ollama-hermes3-8b | rounds 2 (90-minute retry) (corrective rerun) | fail | incorrect-decryptor | 14.2 sec | 10.9k |
| 2026-08-14T02:47:59.351241+00:00 | controlled | ollama-hermes3-8b | rounds 1 (90-minute retry) (corrective rerun) | fail | incorrect-decryptor | 16.5 sec | 11.0k |
| 2026-08-14T02:47:41.274280+00:00 | controlled | ollama-command-r-35b | rounds 2 (corrective rerun) | fail | no-decryptor-submitted | 5.2 min | 31.8k |
| 2026-08-14T02:42:30.335119+00:00 | controlled | ollama-command-r-35b | rounds 1 (90-minute retry) (corrective rerun) | fail | no-decryptor-submitted | 2.8 min | 21.3k |
| 2026-08-14T02:11:43.840626+00:00 | controlled | ollama-qwen3-coder-30b | rounds 2 (corrective rerun) | fail | incorrect-decryptor | 1.6 min | 60.9k |
| 2026-08-14T02:10:08.896949+00:00 | controlled | ollama-qwen3-coder-30b | rounds 1 (corrective rerun) | fail | incorrect-decryptor | 1.9 min | 78.0k |
| 2026-08-14T02:08:10.997208+00:00 | controlled | ollama-nemotron3-33b | rounds 2 (corrective rerun) | fail | http-error | 34.8 sec | 33.5k |
| 2026-08-14T02:07:34.481596+00:00 | controlled | ollama-nemotron3-33b | rounds 1 (90-minute retry) (corrective rerun) | fail | http-error | 1.4 min | 62.1k |
| 2026-08-14T02:04:34.001686+00:00 | controlled | ollama-lfm2-5-latest | rounds 2 (corrective rerun) | fail | empty-response | 12.6 sec | 23.6k |
| 2026-08-14T02:03:23.596907+00:00 | controlled | ollama-gpt-oss-20b | rounds 2 (corrective rerun) | fail | http-error | 23.9 sec | 24.5k |
| 2026-08-14T02:02:59.226881+00:00 | controlled | ollama-gpt-oss-20b | rounds 1 (corrective rerun) | fail | http-error | 33.4 sec | 31.2k |
| 2026-08-14T01:56:50.809588+00:00 | controlled | vllm-muse-glimmer | rounds 5 | fail | timeout | 90.0 min | 0 |
| 2026-08-14T00:26:50.330586+00:00 | controlled | vllm-muse-glimmer | rounds 4 | fail | timeout | 90.0 min | 0 |
| 2026-08-13T22:56:49.667965+00:00 | controlled | vllm-muse-glimmer | rounds 3 | pass | — | 70.7 min | 469.9k |
| 2026-08-13T21:34:52.273358+00:00 | controlled | vllm-nemotron-3-nano-omni | rounds 2 (90-minute retry) | fail | timeout | 90.0 min | 0 |
| 2026-08-13T20:04:51.921486+00:00 | controlled | vllm-nemotron-3-nano-omni | rounds 1 (90-minute retry) | fail | timeout | 90.0 min | 0 |
Interpretation
Verified decryption matches the legacy runner: every Python, py, or unlabeled fenced block is executed, and the attempt passes when any block's standard output contains the expected plaintext. Function signatures, exact fence counts, structured evidence, and hidden alternate vectors are not grading requirements. Extracted code still runs in the pinned no-network Docker sandbox.
Search fixture success uses the configured decryptor metric and 1 attempt(s) per fixture. Boundaries are highest passing / first failing; censored values mean the search did not observe both sides. No composite ranking is computed.
Failure categories
decryptor-execution7empty-response1http-error4incorrect-decryptor18no-decryptor-submitted3submission-format1timeout10
Run summary
This campaign verified the expected plaintext in 18 of 62 completed attempts (29.0%).
ollama-gemma4-31b-it-qat showed the strongest progression, verifying 62.5% of its 8 tested rounds and reaching round 6.
Other consistent performers were ollama-gemma4-26b, ollama-gemma4-31b, ollama-qwen3-5-27b, vllm-muse-glimmer, each verifying at least 60% of tested rounds. Together, these results show clear separation as the generated round structure becomes more demanding.