Root Me: Cracking: PE – protecție 0

  • 1 minute de citit
  • 1 exemplu de cod

Disponibil și în English

Deoarece această provocare nu are nicio protecție, o putem rezolva cu ușurință căutând șirul de caractere în fereastra Strings din IDA.

Selectează din meniu: View -> Open Subviews -> Strings, apoi fă dublu clic pe:

.rdata:00404053 0000000D C Gratz man 🙂

Acum ar trebui să fii în secțiunea .rdata a fișierului binar. Cu șirul încă selectat, fă clic dreapta pe el și apasă pe: Xrefs graph to…. Aceasta îți va oferi un grafic util pe care îl poți analiza.

Ar trebui să existe 3 funcții: Main -> SUB0 -> SUB1. Găsește funcția SUB1 în fereastra Functions și fă dublu clic pe ea.

Aici poți vedea următoarele date:

[code].text:00401726 interrestingFunction2 proc near         ; CODE XREF: interrestingFunction1+35↓p.text:00401726.text:00401726 Format          = dword ptr -28h.text:00401726 var_C           = dword ptr -0Ch.text:00401726 arg_0           = dword ptr  8.text:00401726 arg_4           = dword ptr  0Ch.text:00401726.text:00401726                 push    ebp.text:00401727                 mov     ebp, esp.text:00401729                 sub     esp, 28h.text:0040172C                 mov     [ebp+var_C], 0.text:00401733                 cmp     [ebp+arg_4], 7 ; Parola are 7 caractere..text:00401737                 jnz     short loc_4017AA ; locația parolei greșite.text:00401739                 mov     eax, [ebp+arg_0].text:0040173C                 movzx   eax, byte ptr [eax].text:0040173F                 cmp     al, 'S' ; Aici începe parola..text:00401741                 jnz     short loc_4017AA.text:00401743                 mov     eax, [ebp+arg_0].text:00401746                 add     eax, 1.text:00401749                 movzx   eax, byte ptr [eax].text:0040174C                 cmp     al, 'P'.text:0040174E                 jnz     short loc_4017AA.text:00401750                 mov     eax, [ebp+arg_0].text:00401753                 add     eax, 2.text:00401756                 movzx   eax, byte ptr [eax].text:00401759                 cmp     al, 'a'.text:0040175B                 jnz     short loc_4017AA.text:0040175D                 mov     eax, [ebp+arg_0].text:00401760                 add     eax, 3.text:00401763                 movzx   eax, byte ptr [eax].text:00401766                 cmp     al, 'C'.text:00401768                 jnz     short loc_4017AA.text:0040176A                 mov     eax, [ebp+arg_0].text:0040176D                 add     eax, 4.text:00401770                 movzx   eax, byte ptr [eax].text:00401773                 cmp     al, 'I'.text:00401775                 jnz     short loc_4017AA.text:00401777                 mov     eax, [ebp+arg_0].text:0040177A                 add     eax, 5.text:0040177D                 movzx   eax, byte ptr [eax].text:00401780                 cmp     al, 'o'.text:00401782                 jnz     short loc_4017AA.text:00401784                 mov     eax, [ebp+arg_0].text:00401787                 add     eax, 6.text:0040178A                 movzx   eax, byte ptr [eax].text:0040178D                 cmp     al, 'S'.text:0040178F                 jnz     short loc_4017AA.text:00401791                 mov     eax, offset aGratzMan ; "Gratz man :)" ; mesajul de confirmare a parolei.text:00401796                 mov     [esp+28h+Format], eax ; Format.text:00401799                 call    printf.text:0040179E                 mov     [esp+28h+Format], 0.text:004017A5                 call    exit

Putem observa că arg_0 este un pointer către un vector de octeți, iar putem presupune că arg_4 este lungimea vectorului. Mai jos se poate vedea că arg_0 este comparat cu parola octet cu octet. Pentru a converti caractere din hexazecimal și invers, selectează linia și apasă tasta R.

Mulțumesc pentru lectură, spor la hacking!