0-day.club

notes on security, hardware, and building things

crackmes.one — R77 "Secret Key"

2026-07-05

A quick warm-up crackme: a single binary that asks for two numbers and prints a success message when both are correct. No packing, no anti-analysis, no obfuscation — the whole thing falls apart the moment you look at the decompiled main. Good first target for getting comfortable with the static-analysis workflow.

Approach

Rather than guess numbers or run the binary blind, I went straight to static analysis. The plan for any crackme like this:

  1. Load the binary into a decompiler and let it auto-analyze.
  2. Find main (or whatever the entry logic is).
  3. Read the control flow — the "password check" is almost always a plain comparison somewhere.

For a challenge this small, that's the entire solve. There's nothing to brute-force once you can read the source.

Static analysis in Ghidra

I opened the file in Ghidra, let the auto-analyzer run with the default options, and jumped to main. The decompiler gave back clean, readable C:

int __cdecl main(int _Argc, char **_Argv, char **_Env)
{
  int local_10;
  int local_c;

  __main();
  printf("Enter Your Number : ");
  scanf("%i", &local_c);
  if (local_c == 33) {
    printf("Enter The Secret Key : ");
    scanf("%i", &local_10);
    if (local_10 == 102) {
      printf("Congratulations, you have completed the challenge!");
    }
  }
  return 0;
}

That's the whole program. No further digging required — the two checks are sitting right there in plain sight.

Reading the logic

The flow is two nested if statements, each gating on a hardcoded integer comparison:

Both must match, in order, to reach the congratulations printf. There's no encoding or transformation on the input — scanf("%i", ...) reads the number as-is and compares it directly to the constant.

One small detail worth noting: %i (as opposed to %d) means scanf interprets the input base from its prefix — 0x for hex, a leading 0 for octal. So 33 could also be entered as 0x21, and 102 as 0x66. Not necessary here, but it's the kind of thing that matters on trickier challenges.

Solution

Run the binary, feed it those two values, and it prints the success message.

Enter Your Number : 33
Enter The Secret Key : 102
Congratulations, you have completed the challenge!

Takeaway

This one is really a "get your tooling working" exercise — the value is in the workflow, not the difficulty. Load it, analyze it, read main, and the answer is just two constants sitting in comparison instructions. When a crackme stores its key as a literal in a == check, static analysis makes it a non-event; the interesting challenges are the ones that force you to compute the key rather than read it.

← all posts