Bueno, yo también me voy a animar a explicarlo de forma detallada para refrescar la parte de representaciones de números negativos, que supongo yo es el objetivo del crackme
0. El crackme es:
https://ns2.elhacker.net/crackmes/Crackme2alfa.zip00401372 | 8D45 AC | lea eax,dword ptr ss:[ebp-54] |
00401375 | 50 | push eax |
00401376 | 68 62124000 | push crackme.401262 | 401262:"%i"
0040137B | E8 88010000 | call <JMP.&scanf> |
00401380 | 83C4 10 | add esp,10 |
00401383 | 8145 AC 0CFEFFFF | add dword ptr ss:[ebp-54],FFFFFE0C |
0040138A | 8B45 AC | mov eax,dword ptr ss:[ebp-54] |
0040138D | 89C2 | mov edx,eax | edx:EntryPoint
0040138F | 01D2 | add edx,edx | edx:EntryPoint
00401391 | 8D0C10 | lea ecx,dword ptr ds:[eax+edx] | ecx:EntryPoint
00401394 | 894D AC | mov dword ptr ss:[ebp-54],ecx | ecx:EntryPoint
00401397 | 817D AC 40E20100 | cmp dword ptr ss:[ebp-54],1E240 |
0040139E | 75 16 | jne crackme.4013B6 |
004013A0 | 83C4 F8 | add esp,FFFFFFF8 |
004013A3 | 8D45 B0 | lea eax,dword ptr ss:[ebp-50] |
004013A6 | 50 | push eax |
004013A7 | 68 70124000 | push <crackme.sub_401270> | 401270:"\n\t\tGracias por haberte registrado %s"
004013AC | E8 6F010000 | call <JMP.&printf> |
1. Pone en EAX la dirección que utilizará para guardar el serial ( [ebp-54] )
2. Pasa el segundo argumento de la funcíón "scanf" al stack, que será la dirección donde guardará el serial, recordar que EAX contiene la dirección [ebp-54] alias "la dirección donde guarda el serial"
3. Pasa el primer argumento de la función "scanf" al stack, este es un puntero a una String que tiene el formato del dato a recoger, en este caso es "%i", es decir, traerá el serial introducido como un número entero tal cual
4. Llama a la función "scanf" ( scanf("%i",[ebp-54]) ) para recoger el serial introducido, recordar que por los parámetros dados anteriormente, será un número entero y se guardará en la dirección [ebp-54]
5. Acomoda el Stack, no no interesa
6. Toma el contenido de [ebp-54] (el serial) y lo "suma" (add) con 0xFFFFFE0C, el resultado se guarda en el primero operando ( [ebp-54] ). Puse "suma" entre comillas porque en realidad resta, recodar que la representación numérica está restringida al tamaño especificado del operando, es decir, se está haciendo una operación con el DWORD 0xFFFFFE0C que tiene 4 bytes de tamaño, entonces solo permite números positivos que van desde 0x00000001 al 0x7FFFFFFF y los negativos van desde 0x80000000 a 0xFFFFFFFF. El número 0xFFFFFE0C está dentro de la representación de número negativos y equivale a -500 en decimal, hay que realizar la operación correctamente si se usará tal cual en la calculadora:

- De momento tenemos:
[ebp-54] = serial + 0xFFFFFE0C7. Pone en EAX el contenido de [ebp-54] que ahora contiene el resultado de la operación anterior:
EAX = [ebp-54]
EAX = (serial + 0xFFFFFE0C)8. Pone en EDX lo que hay en EAX, ahora tenemos tanto en EAX como en EDX el resultado anterior:
EDX = EAX
EDX = (serial + 0xFFFFFE0C)9. Suma EDX con EDX y guarda el resultado en EDX:
EDX = EDX + EDX
EDX = (serial + 0xFFFFFE0C) + (serial + 0xFFFFFE0C)10. Pone en ECX el resultado de sumar EAX y EDX:
ECX = EAX + EDX
ECX = (serial + 0xFFFFFE0C) + ( (serial + 0xFFFFFE0C) + (serial + 0xFFFFFE0C) )11. Pone en [ebp-54] el resultado anterior
[ebp-54] = ECX
[ebp-54] = (serial + 0xFFFFFE0C) + ( (serial + 0xFFFFFE0C) + (serial + 0xFFFFFE0C) )12. Compara [ebp-54] con 0x1E240
13. Si son iguales no salta y se prepara para mostrar el mensaje del "chico bueno"
- Entonces tenemos que hacer sean iguales para que no salte, solo hay que hacer la ecuación y despejarla como en el colegio:
0x1E240 = [ebp-54]
0x1E240 = (serial + 0xFFFFFE0C) + ( (serial + 0xFFFFFE0C) + (serial + 0xFFFFFE0C) )
0x1E240 = (serial + 0xFFFFFE0C) + 2 * (serial + 0xFFFFFE0C)
0x1E240 = 3 * (serial + 0xFFFFFE0C)
0x1E240 / 3 = serial + 0xFFFFFE0C
(0x1E240 / 3) - 0xFFFFFE0C = serial
0xA0C0 - 0xFFFFFE0C = serial
0xA2B4 = serial
41652 = serial- O si lo desean trabajar todo en decimal
123456 = (serial + (-500)) + ( (serial + (-500)) + (serial + (-500)) )
123456 = (serial - 500) + ( (serial - 500)) + (serial - 500) )
123456 = (serial - 500) + 2 * (serial - 500)
123456 = 3 * (serial - 500)
(123456 / 3) = serial - 500
(123456 / 3) + 500 = serial
41152 + 500 = serial
41652 = serial---
Referencias:
TEORIA Assembler por CAOS REPTANTE, en la página 5 está el capítulo de Sistemas de Representación, que habla de los números negativos en Hexadecimal:
https://mega.nz/file/JgY0gApa#3zKqcAJm9yrFMzuqqGgdGsVfub5gPsafZhAdHC01L2QInformática Básica (2010), en la página 117 "Números con signo" habla de forma detallada la representación de números negativos:
https://repositori.uji.es/bitstreams/9f608796-c3c6-46b0-aa2c-c10da81d685c/download