Et maintenant, un ch'tit coup de SHA-256 sur un autre crackme de JuLio eL NeGRo écrit en ASM

Le gros avantage de l'ASM, c'est que le code n'est pas "perverti" par les mois de l'année, ou Dieu sait quels autres cochoneries qui viennet se rajouter lors de la compilation de langages "évolués". Et donc, en dehors de la création de la dialog box, la totalité du reste du code est consacré à la routine de cryptage, ce qui la rendra facile à ripper pour en faire un copié/collé dans un Key Generator, mais ce ne sera pas toujours aussi simple...

Comme son copain MD5, SHA est initialisé:

:00401023   mov     dword_0_406804, 6A09E667h
:0040102D   mov     dword_0_406808, BB67AE85h
:00401037   mov     dword_0_40680C, 3C6EF372h
:00401041   mov     dword_0_406810, A54FF53Ah
:0040104B   mov     dword_0_406814, 510E527Fh
:00401055   mov     dword_0_406818, 9B05688Ch
:0040105F   mov     dword_0_40681C, 1F83D9ABh
:00401069   mov     dword_0_406820, 5BE0CD19h

Moins facile à identifier, j'ai juste fait une recherche sur le net en utilisant "6A09E667" comme clé, pour trouver immediatement ce site et la réponse à ma question:

Description of SHA-1 and SHA-256 http://home.ecn.ab.ca/~jsavard/crypto/mi060501.htm

The SHA-256 algorithm is very similar in structure to SHA-1, but not only does it use eight, rather than five, 32-bit subblocks, but there are other ways in which it is not analogous.

For SHA-256, the message is padded, and divided into 512-bit blocks, in the same way as for SHA-1.

From each block, considered as 16 32-bit words, 64 (rather than 80) 32-bit words are produced, the first 16 being the block itself, and the remaining words being the sum, modulo 2^32, of the following quantities:

the word 16 words ago;
the word 7 words ago;
the XOR of the following three quantities:

the word 2 words ago rotated right 17 places
that word rotated right 19 places
that word shifted right 10 places;

the XOR of the following three quantities:

the word 15 words ago rotated right 7 places
that word rotated right 18 places
that word shifted right 3 places.

Comme j'avais eu l'occasion de le dire un peu plus tôt, le calcul d'un hash n'est pas tout, sinon il suffirait d'utiliser un tool comme celui de DAMN pour solutionner le crackme:

La réponse du Hash Calculator de DAMN va donner:

Calculating hash of 8 bytes string `christal`...

SHA-256 : 0AE43A9D51ADD58D6F75E7529BE67970AD7D5BC68F7B97771F4F511A8007886F

Le crackme, lui, va dabord saisir le Name, et l'envoyer dans la routine de hashage:

:00404457  CALL      USER32!GetWindowTextA     ; get the name
:0040445C  OR        EAX,EAX                   ; si le champ n'est pas vide
:0040445E  JZ        004044A8
:00404460  PUSH      0040616C                  ; pousse le name
:00404465  PUSH      EAX                       ; pousse sa taille
:00404466  PUSH      0040656C                  ; pousse adresse de stockage du hash SHA-256
:0040446B  CALL      00401000                  ; hachage du name
:00404470  MOV       ESI,0040656C              ; récupère le hash
:0040656C 0A E4 3A 9D 51 AD D5 8D-6F 75 E7 52 9B E6 79 70  ..:.Q...ou.R..yp
:0040657C AD 7D 5B C6 8F 7B 97 77-1F 4F 51 1A 80 07 88 6F  .}[..{.w.OQ....o

:00404475  XOR       ECX,ECX                   ; pointeur caractère                        
:00404477  XOR       EAX,EAX                   ; stockage du résultat
:00404479  XOR       EBX,EBX
:0040447B  MOV       BL,[ESI+ECX]              ; récupère une valeur du hash
:0040447E  TEST      BL,BL                     ; vérifie que ce n'est pas la dernière
:00404480  JZ        00404490                  ; sinon -> out vers XORage
:00404482  IMUL      EBX,ECX                   ; bidouille 1
:00404485  IMUL      EBX,EBX                   ; bidouille 2
:00404488  ADD       EBX,50                    ; bidouille 3
:0040448B  ADD       EAX,EBX                   ; stock le résultat
:0040448D  INC       ECX                       ; incrémente pointeur caractère
:0040448E  JMP       00404479     
:00404490  XOR       EAX,12345678              ; et à la sortie, le résultat est XORé
:00404495  PUSH      EAX                       ; avant d'être transformé en string
:00404496  PUSH      00406078                  ; et d'être comparé avec le serial
:0040449B  PUSH      0040676C
:004044A0  CALL      USER32!wsprintfA
:004044A5  ADD       ESP,0C
:004044A8  RET

Bref, rien de compliqué quand on a les bons outils...

Les informations ci dessus ont été complétées grace au travail et aux scripts de WinTerMiNator, Roy (et sa fameuse BigLib), HCCC6, tHE EGOiSTE, cryptosec.lautre.net