Soluția lui cbm-hackers pentru easy_reverse

  • 1 minute de citit
  • 1 imagine

Disponibil și în English

Pe măsură ce îmi continui drumul în Reverse Engineering, am ales câteva provocări de pe root-me și altele de pe crackmes.one. Acesta este o soluție pentru o provocare care poate fi găsită aici: easy_reverse. Soluția se află la finalul acestui articol, atât cu IDA Free, cât și cu GDB, așa că ai grijă când derulezi, poate să îți strice provocarea.

O imagine face cât o mie de cuvinte! Dacă te uiți la captura de ecran din IDA, ai putea deja să ghicești care este flag-ul. Captură de ecran 2018-11-17 la 00.36.44

Hai totuși să explic. La început, programul salvează argc și argv în niște variabile locale, apoi compară argc. ARGC este contorul de argumente al programului. În mod implicit, dacă apelăm programul fără argumente, argc va fi 1, pentru că primul argument este numele programului. ARGV arată cam așa: [“./rev50_linux64-bit”].

Dacă apelăm programul așa: ./rev50_linux64-bit aa, atunci argc va fi 2, iar argv va arăta așa: [“./rev50_linux64-bit”, “aa”]

Să vedem ce face programul în continuare. Mută [rbp+argv] în rax și adaugă 8 la el. Face asta ca să sară peste primul argument, astfel încât rax va indica spre &”aa”. De ce a adunat 8? Pentru că acesta este un program pe 64 de biți, iar pointerii în programele pe 64 de biți au o lungime de 8 octeți, față de 4 octeți în programele pe 32 de biți.

Apoi, mută valoarea din rax în rax. Asta face mov rax, [rax]. Acum rax este “aa”. Trimite rax către strlen prin rdi și verifică dacă valoarea returnată este egală cu 10. Dacă nu este, afișează un mesaj de eroare.

Acum, să presupunem că am trecut un șir “123456789” și că am trecut verificarea strlen = 10. Programul pune al doilea argument în rax și adaugă 4. Asta este egal cu argv[1][4]. Acum rax va fi “567890”. Mută un singur octet în eax și îl compară cu ‘@’. Deoarece 5 != @, programul se oprește cu eroare. Atât, destul de simplu, dar un crackme distractiv.

Acum, să vedem cum se face asta cu gdb.