crackmes.one — R77 "Secret Key"
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:
- Load the binary into a decompiler and let it auto-analyze.
- Find
main(or whatever the entry logic is). - 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:
- The program reads an integer into
local_cand checkslocal_c == 33. So the first prompt, "Enter Your Number", wants33. - Only if that passes does it read a second integer into
local_10and checklocal_10 == 102. So the second prompt, "Enter The Secret Key", wants102.
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
- Enter Your Number:
33 - Enter The Secret Key:
102
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.