• STATISTIQUES
  • Il y a eu un total de 2 membres et 8216 visiteurs sur le site dans les dernières 24h pour un total de 8 218 personnes!


    Membres: 2 605
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] Rankk
    Site de challenge construit sur le principe d'une pyramide à 9 level. Level 1: 60,Level 2: 72,Level 3: 68,Lev...
    Challenges
    [EN] Framework Metasploit
    Le Framework Metasploit est un logiciel gratuit, open source de tests de pénétration développ&ea...
    Vulnérabilités
    [FR] Forum-Webmaster
    Une communauté webmaster pour apporter / recevoir de l'aide en création de site internet. Webmaster...
    Webmaster
    [EN] social-engineer
    Site dédié au Social Engineering en général.
    Hacking
    [EN] SecurityFocus
    SecurityFocus a été conçu pour faciliter la discussion sur des sujets liés la sécu...
    Vulnérabilités
    [EN] hax.tor
    50 level de challenges mélangés
    Challenges
    [FR] Le top web
    Nous offrons une sélection la plus large possible de resources webmaster gratuites, hébergement gratuit...
    Webmaster

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Résolution greedy_fly keygenme_v1.6

(Apparemment j'ai pas les droits pour poster dans la section appropriée, donc libre à vous de déplacer le topic.... et me donner les droits pour une éventuelle prochaine fois) Angel

Kengenme: téléchargable ici http://crackmes.de/users/greedy_fly/keygenme_v1.6/

Difficulté: très facile Wink

Tous d'abord on remarque le même schéma qui revient GetDlgItem puis SendMessageA.

On breakpoint sur les GetDlgItem >> ctrl+n >> clic droit sur GetDlgItem puis clique sur "Set Breakpoint on every reference".

Voici la table des breakpoints:
[Image: gredidi_1.png]

On lance l'exécution avec F9. Rien d'intéressant n'est observé sur le 1er breakpoint, on l'enlève ainsi que celui sur le JMP. Huh

On relance, le kengenme demande un serial, pour une lecture plus facile nous mettons aaaaaa - bbbbbb - cccccc - dddddd

On avance pas à pas avec la touche F8

[Image: gredidi_2.png]

Quand nous arrivons en 00401272, on remarque l'apparition de cccccc dans la Fenêtre mémoire ( en bas à gauche).

Ensuite nous voyons un Call en 00401274, nous entrons dans ce call avec F7:

Code :
004014A9              INC EBX     ; EBX longueur du 3eme champ
004014AA          SHL EBX,4          ; ebx = ebx <<4
004014AD   MOV ESI,40      ; esi = 40
004014B2 LEA EDI,DWORD PTR DS:[EBX+ESI] ; edi = ebx + esi ;
004014B5   IMUL EBX,EDI,182 ; ebx = edi * 182
004014BB  XOR ESI,ESI  ; esi = 0
004014BD  XCHG EBX,ESI   ; esi = ebx
004014BF  SUB EBX,EBX   ebx = 0
004014C1   RETN

Quand on sort du call, on compare le résultat (esi) avec 0x10960.

En fait le call vérifie que le longueur du 3eme champ est égale à 6 ( comparaison en 00401279)

Si la longueur est 6 alors le résultat de l'algo sera égale à 0x10960

Voici l'équivalent en C:
Code :
int longueur()
{
    int ebx = 0x6 , edi = 0x0, esi = 0x40;
ebx = ebx + 0x1;
    ebx = ebx << 0x4 ;
    //printf("%x" , ebx);
    edi = ebx + esi ;
    printf("edi int : %x\n", edi);
    ebx = edi * 0x182 ;
    printf("ebx int : %x\n" , ebx);
    esi = 0 ;
    esi = ebx;
    ebx = 0;
printf("ebx : %x\n" , ebx);
printf("edi : %x\n", edi);
printf("esi : %x\n", esi);

Bon nous passons puisque notre champ3 "cccccc" a une longueur de 6. Shy

Ensuite en 004012AE ( voir screen 2), on teste la longueur de notre champ1, qui s'est affiché dans notre fenêtre de mémoire. Nous passons car égale à 6.

En xxxxx, nous entrons dans un call qui mène à une boucle:
[Image: gredidi_3.png]

En fait, j'ai mis pas mal de temps à comprendre que cet algo, convertis la valeur décimale de notre champ4 en valeur hexa.

Voici l'équivalent en C:
Code :
int main()
{
char chaine[6] = "123456";
for (count = 0 ; count != 6 ; count++)
  {
       valeur = chaine[count];
printf("valeur : %x", valeur);
     valeur = valeur - 0x30 ;
     printf(": %x\n", valeur);
     total = total + total * 0x4 ;
       printf("total: %x :", total);
      total = valeur + total *0x2 ;
        printf("total: %x :", total);
      printf("total: %x\n", total);
  }

   return 0;

}

en 004012F0, nous voyons qu'il compare le résultat avec 0x7A1E8. Si on est inférieur on passe sinon c'est le programme s'arrête. Avec nos lettres on ne passe pas. Nous mettons 123456 à la place de nos dddddd.

Nous passons, nous arrivons ensuite en 004012FC
Code :
004012FC CMP BYTE PTR DS:[4030A3],32

Il faut que notre 4ème caractère du 4ème champ soit égale à 0x32 soit 2.
2 lignes plus loin en 0040130A, nous voyons que notre 6eme caractère de notre 4eme champ doit être égale à 0x30 soit 0.

Ensuite:
[Image: gredidi_4.png]

De 00401377 à 0040138F, le code teste nos caractères pour savoir si sont compris entre 0x30 et 0x39, autrement il faut que se soit des chiffres.

Ensuite en 0040139F, on compare le 2eme caractère du 1er champ avec 0x39 soit 9.
Ensuite en 004013AD, on compare le 5eme caractère du 1er champ avec 0x37 soit 7.
Ensuite en 004013BB, on compare le 1eme caractère du 2er champ avec 0x38 soit 8.

(J'ai galéré pour savoir à quoi correspondait les tests, je me suis aidé de la fenêtre mémoire mais si quelqu'un a une idée plus rapide...).

Ensuite en 004013CD, le 1er champ est passé dans l'algo de "conversion hexa", puis la valeur de sortie est comparé à 0x7A057.

En 004013DB, le résulat de l'algo pour le 1er champ est passé mis dans esi.
En 004013E2, le 4eme champ est re-passé dans l'algo de conversion et le résultat est mis dans edi en 004013E7.

Les résultats du champ1 et du champ 4 soit additionné en 004013E9 et le résultat est mis dans esi.

Ensuite en 0040F0, nous voyons que le champ3 est passé aussi dans l'algo de conversion et son résultat est comparé à esi et donc à la somme (champ1 + champ4).

C'est fini

Les conditions sont donc:
- Le sérial doit être constitué de nombre
- Il doit être sous forme : x9x7xX-8XXXXX-XXXXXX-XXX2X0
- Le champ 4 doit avoir une valeur inférieure à 0x7A1E8 soit 500200 en décimal
- Le champ 1 doit avoir une valeur inférieure à 0x7A057 soit 499799 en décimal.
- Et champ1 + champ4 = champ3

Mon kengen en pièce jointe et merci à poupou9779 du site du zero pour sa fonction "changerrang" Angel

New Project News White Hat Hacker V2.3
Accueil | Challenges | Tutoriels | Téléchargements | Forum