The Art of Reversing by Ap0x - Tutoriali.org
The Art of Reversing by Ap0x - Tutoriali.org
The Art of Reversing by Ap0x - Tutoriali.org
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
na kojoj se, kao sto vidimo na nase uneto ime dodaje string ‘BytePtr [e!]‘<br />
posle cega ce nase ime izgledati ovako ‘ap0xBytePtr [e!]’. Posle ove operacije<br />
se izvrsava sledeca MD5 kripto operacija:<br />
00401B08 . 68 A8564000 PUSH kgme_#1.004056A8 addr 004056A8<br />
00401B0D . 50 PUSH EAX addr 00000004<br />
00401B0E . 68 80334000 PUSH kgme_#1.00403380 ASCII "ap0xBytePtr [e!]"<br />
00401B13 . E8 E8F4FFFF CALL kgme_#1.00401000 addr 00401000<br />
Ovaj veoma jednostavan CALL ka MD5 funkciji ima samo tri ulazna<br />
parametra: 1) adresa na kojoj ce se naci MD5 hash posle izvrsavanja MD5<br />
hashing funkcije, 2) duzina stringa koji se pretvara u MD5 hash i 3) string<br />
koji se pretvara u MD5 hash.<br />
Kao sto vidimo ovde se nalazi jedna zamka koja nas moze drzati u zabludi<br />
veoma dugo! Obratite paznju da se kao string koji se pretvara u MD5 hash<br />
koristi ‘ap0xBytePtr [e!]’ ali da se kao duzina stringa koji se pretvara<br />
pojavljuje broj cetiri. Ovo znaci da se nece sva slova pretvoriti u MD5 hash<br />
nego ce se za pretvaranje koristiti samo prva cetiri slova od ovog stringa,<br />
odnosno koristice se bas nase uneto ime ‘ap0x’. I konacno posle izvrsenja<br />
CALLa za pretvaranje stringa u MD5 hash na adresi 004056A8 ce se nalaziti<br />
sledece:<br />
004056A8 AF 36 BC 6E BB AA 52 0E .6.n..R.<br />
004056B0 8F 20 CF 74 9A 07 E5 AE . .t...®<br />
Ako upotrebimo HashCalc (www.slavas<strong>of</strong>t.com) videcemo da je MD5 hash za<br />
nase ime (ap0x) jednak 6ebc36af0e52aabb74cf208faee5079a. Ocigledno je<br />
da je ovaj MD5 hash podeljen na cetiri dela i da se sva cetiri dela posmatraju<br />
kao DWORD. To jest posmatracemo sadrzaj adrese 004056A8 kao MD5_1,<br />
MD5_2, MD5_3 i MD5_4. Gde je MD5_x jednak jednakim delovima MD5<br />
hasha ali su u memoriji DWORDovani, to jest okrenuti.<br />
Posle pretvaranja naseg imena u MD5 hash poziva se sledeci CALL:<br />
00401B18 . E8 5C000000 CALL kgme_#1.00401B79<br />
koji je zaduzen za dodatne operacije koje se izvrsavaju na sad kreiranom<br />
hashu. Te operacije se izvrsavaju na sledecim adresama i na sledeci nacin:<br />
00401B84 |. 8B06 MOV EAX,DWORD PTR DS:[ESI] ; MD5_1<br />
00401B86 |. 8B5E 04 MOV EBX,DWORD PTR DS:[ESI+4] ; MD5_2<br />
00401B89 |. 33C3<br />
XOR EAX,EBX<br />
…<br />
00401B9D |. 81F3 9900BD0F XOR EBX,0FBD0099<br />
; XOR MD5_2<br />
…<br />
00401BB2 |. 8B4E 08 MOV ECX,DWORD PTR DS:[ESI+8] ; MD5_3<br />
00401BB5 |. 33CB XOR ECX,EBX ; XOR EBX<br />
…<br />
00401BC9 |. 81F3 090A0C0B XOR EBX,0B0C0A09<br />
00401BCF |. 8B56 0C MOV EDX,DWORD PTR DS:[ESI+C] ; MD5_4<br />
a posle vracanja iz ovog CALLa vidimo na koji nacin se promenio MD5 hash<br />
koji se sada poredi sa nasim unetim serijskim brojem:<br />
00401B1D . 68 D0794000 PUSH 004079D0<br />
"60EE9C1401EFAA2275208AADAEE5079A"<br />
00401B22 . 68 F89C4000 PUSH 00409CF8 "11111111111111111111"<br />
00401B27 . E8 CC000000 CALL <br />
Dakle nacin na koji se generise seriski broj je sledeci:<br />
[1] Uzimamo ime i hashujemo ga sa MD5 deleci ga na cetiri dela<br />
[2] Konacna formula za dobijanje serijskog broja je sledeca<br />
Serial_1 = MD5_1 xor MD5_2<br />
Serial_2 = MD5_2 xor 0FBD0099<br />
Serial_3 = MD5_3 xor EBX [Serial_2]<br />
Serial_4 = MD5_4 ; Serial = Serial_1 + Serial_2 + Serial_3 + Serial_4<br />
<strong>The</strong> <strong>Art</strong> <strong>of</strong> <strong>Reversing</strong> <strong>by</strong> <strong>Ap0x</strong> Page 166 <strong>of</strong> 293