Keygenme or Not este o provocare drăguță de reversing pe care am găsit-o pe root-me.org. Cere un nume de utilizator și o cheie de activare. Mi-a plăcut în mod deosebit această provocare și am decis să scriu un articol despre ea. Particularitatea acestei provocări este că o poți rezolva fără să scrii niciun cod, de unde și numele ‘Keygenme or Not’.
Dacă vrei să rezolvi această provocare, dar ești blocat, ar trebui neapărat să mai încerci o dată, pentru că rezolvarea este foarte ușoară. Revino dacă vrei să vezi codul keygen-ului și părerea mea despre această provocare.
Să ne imaginăm că acesta este de fapt un program util, cu o protecție slab implementată. Programul KMN este înregistrat pe utilizatorul ‘root-me.org’ și va funcționa doar cu cheia lui. Folosind orice altă combinație de nume de utilizator și cheie nu va face programul să funcționeze, chiar dacă sunt valide.
Să vedem cum autentifică KMN utilizatorii: primește numele de utilizator și cheia, după care apelează funcția _auth. După ce _auth se întoarce, programul verifică dacă autentificarea a reușit comparând valoarea returnată de _auth cu zero. Dacă valoarea returnată de _auth este orice altceva decât zero, autentificarea eșuează.
__text:0000000100000D81 call _auth __text:0000000100000D86 cmp eax, 0
Nu ar trebui să modificăm instrucțiunea cmp și să lăsăm programul să-și facă „treaba”, pentru că _auth setează o stare internă de care avem nevoie mai târziu.
Acum, sper că ești familiarizat cu reversing-ul, pentru că voi sări peste unele detalii. Singura parte care mă interesează este bucla care derivă cheia aplicației din numele de utilizator. Am făcut reverse engineering la această parte și am publicat codul C în acest articol.
Dacă ne uităm la locLastCheck, putem vedea că cheia aplicației pentru numele de utilizator ‘root-me.org’ este codificată direct în program și tot ce trebuie să faci pentru a obține flag-ul este să o furnizezi lui KMN.
Putem evita constrângerea numelui de utilizator codificat direct înlocuind instrucțiunea jz cu jmp; astfel, programul va verifica dacă cheia aplicației este corectă și va funcționa indiferent de nume de utilizator. Iar pentru a construi un keygen, va trebui să eliminăm complet locLastCheck și doar să afișăm uiSeed calculat.
Mai jos este codul meu pentru keygen:
https://gist.github.com/dnutiu/86b4391c0ea3b9cc6a9bb3bb16ee9012
Și demonstrația că binarul modificat funcționează efectiv cu chei de activare valide:
➜ Desktop ./macho_patched.username.dnutiu.activation key.6232821Authenticated! You can use this password to valid85;@PO-d{bEN~Mulțumesc că ai citit și sărbători fericite!