Introduction to Level 6 CrackMes
CrackMes.one categorizes its challenges by difficulty, with Level 6 representing the pinnacle of complexity. These are not trivial puzzles; they are designed to push the boundaries of a reverse engineer's capabilities. Currently, only three Assembly-based crackmes reside in this top tier. We will focus on one of these formidable challenges: chili_crackme_11_by_witeg, created by the author witeg.
Approaching any crackme begins with reconnaissance. A standard first step is to examine the executable file using a hex editor. A hexdump -C on CrackMe11_wg.exe provides an initial glimpse into the binary's structure, revealing byte sequences and hinting at potential data or code sections. However, this raw hex view is often cryptic without further analysis.
Initial Analysis with IDA Pro
To make sense of the binary, we turn to a powerful disassembler and debugger, such as IDA Pro. Loading CrackMe11_wg.exe into IDA Pro allows us to view the disassembled code. The initial view presents the program's entry point and the functions it calls.
The goal of a crackme is to bypass its intended functionality, typically by finding a way to make it accept an invalid input or to reveal a hidden flag. In this case, the program likely prompts the user for a serial key or password. Our task is to understand the validation logic and find a way to circumvent it, effectively 'cracking' the program.
Dissecting the Validation Logic
Upon initial inspection of the disassembled code, we look for strings that might indicate user interaction, such as prompts for input or messages related to success or failure. Identifying these strings often leads us to the relevant code blocks responsible for processing user input and performing validation.
A key function in this crackme appears to be responsible for comparing the user's input against a hardcoded value or a computed correct answer. We need to trace the execution flow from the point of input to the point of validation. This involves understanding how the input is read, potentially transformed, and then compared.
The complexity of Level 6 crackmes often means the validation isn't a simple string comparison. It might involve:
- String Manipulation: The input string could be reversed, XORed with a key, or subjected to other transformations before comparison.
- Algorithmic Checks: The program might implement a custom algorithm to generate the correct key based on some initial value or even system information.
- Anti-Debugging Techniques: Sophisticated crackmes often include checks to detect if a debugger is attached, making static analysis or dynamic analysis more challenging.
- Obfuscation: Code might be intentionally made difficult to read through techniques like opaque predicates, control flow flattening, or junk code insertion.
In chili_crackme_11_by_witeg, we observe that the program likely performs several operations on the user's input. Tracing these operations is crucial. We identify a loop that iterates through the input string, applying transformations at each character. This suggests a character-by-character validation process rather than a single block comparison.

Identifying the Core Algorithm
By carefully following the execution path and examining the instructions within the validation loop, we begin to piece together the algorithm. We see specific arithmetic and bitwise operations being applied. For instance, a character might be incremented or decremented, then XORed with a constant value. The result of this operation is then compared against another value, possibly derived from a hardcoded table or computed on the fly.
The surprising detail here is not the complexity of the operations themselves, but how they are chained together. Each character's transformation depends on the previous character's original value and the result of its own transformation. This creates a dependency chain that makes it difficult to brute-force individual characters without understanding the entire sequence.
Let's assume, for illustrative purposes, that the correct input 'PASS' is expected. The program might internally transform 'P' in a specific way, then use that result to help transform 'A', and so on. A simple string comparison would be trivial to bypass, but this algorithmic approach requires understanding the state changes as the input is processed.
Bypassing the Validation
With a solid understanding of the algorithm, we have two primary paths to bypass the validation:
- Static Patching: We can modify the executable file directly. The most straightforward approach is to find the conditional jump instruction that determines whether the program prints a success or failure message. By changing this jump instruction from a conditional jump (e.g.,
jne- jump if not equal) to an unconditional jump (e.g.,jmp- jump), or by patching the condition to always be true, we force the program to execute the success path regardless of the input. - Dynamic Analysis and Input Generation: Alternatively, we can use a debugger to step through the program and observe the expected transformations. If the algorithm is fully understood, we can write a script or program to compute the correct input string. This involves reverse-engineering the algorithm and implementing it in a language like Python. This method is more robust as it doesn't alter the original binary.
For chili_crackme_11_by_witeg, the validation involves a series of arithmetic and bitwise operations. After careful analysis, we can determine the correct sequence of transformations. A common technique involves mapping the expected output character back to the required input character. If the program computes `output_char = transform(input_char, previous_state)`, we need to find `input_char = inverse_transform(output_char, previous_state)`. In this specific crackme, the transformation involves adding a value that increases with the index of the character, and then XORing with a constant. By reversing these operations, we can calculate the correct input for each position.
The successful bypass of this crackme yields a flag, typically a string that confirms the user has successfully completed the challenge. This flag serves as proof of mastery over the particular reverse engineering techniques employed by the crackme's author.
Conclusion and Next Steps
Level 6 crackmes like chili_crackme_11_by_witeg are invaluable for honing reverse engineering skills. They demand patience, meticulous attention to detail, and a deep understanding of assembly language and binary analysis tools. The process involves static analysis to understand the logic, dynamic analysis to observe behavior, and often creative problem-solving to bypass security mechanisms.
What nobody has addressed yet is how the specific choice of transformations in Level 6 crackmes influences the learning curve for different reverse engineering paradigms. For instance, does a crackme emphasizing complex arithmetic teach skills more transferable to exploit development than one focusing on anti-debugging tricks?
For those interested in further challenges, exploring the other two Level 6 Assembly crackmes on crackmes.one is the logical next step. Each will present unique algorithms, obfuscation techniques, and validation schemes, further solidifying reverse engineering expertise.
