Copy Link
Add to Bookmark
Report
3x05 Full Reverse (Target tElock)
[ Target: tElock 0.9x by tE! ]
pH#3 .............F.u.l.l..R.e.v.e.r.s.e............. [ #Sadrzaj ]
0x01 ................................................ [ Intro ]
0x02 ................................................ [ Tools of trade ]
0x03 ................................................ [ Unpacking 1 ]
0x04 ................................................ [ Unpacking 2 ]
0x05 ................................................ [ Outro & Greetz ]
--[ 0x01 ]----------------------------------------------[ Intro ]
Novi pH, nove teme. Idalje se bavimo reversingom (bar ja ;) a ovaj put
cemo uraditi nesto jako zanimljivo. Odradicemo odpakivanje tELocka na dva
razlicita nacina, na dve razlicite mete. Moram da priznam da ovaj tekst i
nije bio moja ideja ali cu se zahvatili deroku sto me je zamolio da mu
obajsnim kako se odpakuje tELock. I vi cete imati neke koristi od ovoga,
bar se ja tako nadam :)
Prvi deo teksta se odnosi na jednostavno odpakivanje, dok cemo u drugom
odpakovati metu i rucno popraviti importe... Zvuci li interesantno? Ok,
onda obratite paznju:
--[ 0x02 ]---------------------------------------------[ Tools of trade ]
Da bi smo "popravili" ovaj crackme, trebace nam neki "vaspitni" alati:
[+] OllyDBG v.1.10 .................................. http://www.wasm.ru
[+] OllyInisible v.x ................................ http://www.wasm.ru
[+] LordPE v.1.4 .................................... http://www.wasm.ru
[+] ImpRec v.1.6 .................................... http://www.wasm.ru
[+] PeID v0.93 ...................................... http://www.wasm.ru
i naravno mete:
[+] tElock 0.98b1 ....................................... my.target1.zip
[+] tElock 0.96 ....................................... my.target2.zip
Svi ovi alati su neophodni svakom reverseru pa predlazem da ako ih vec
nemate, podhitno ih nabavite! Bez njih se dalje citanje ovog teksta ne
isplati!
--[ 0x03 ]---------------------------------------------[ Unpacking 1 ]
Pre nego sto pocnemo sa odpakivanjem pomocu Ollya moracemo da ga
podesimo tako da stignemo do OEPa najbrze sto mozemo (bice to sa tri
klika ;). Dakle otvorite Olly i idite u meni Debugging options (ALT + O),
selektujte tab Exceptions i selektujte samo sledece checkboxove:
- Ignore memory access violations in Kernel32
- INT3 breaks
- Single-step break
- Integer devision by 0
Zasto ovo radimo? Jednostavno tELock ce nam "bacati" ove exceptione
pokusavajuci da detektuje da li je debugger aktivan. Pored ovoga je
potrebno da imate ukljucen OllyInvisible ili HideOlly plugin.
Kada ovo uradimo, mozemo da starujemo nasu metu pomocu Ollya i da
pocnemo sa odpakivanjem. Prve linije koje se nalaze na OEPu izgledaju
ovako:
00407BD6 > $^\E9 25E4FFFF JMP CrackMe1.00406000
00407BDB 00 DB 00
00407BDC 00 DB 00
00407BDD 00 DB 00
00407BDE A8 DB A8
00407BDF 02 DB 02
00407BE0 D6 DB D6
Postoji vise nacina na koje mozemo doci do samog OEPa ali mi cemo to
uraditi na najbrzi moguci nacin. Pritisnite F9 kao da pokusavate da
startujete program, ali cete umesto startovanja programa zavrsiti ovde:
004066A8 8D DB 8D
004066A9 C0 DB C0
004066AA 74 DB 74
Posto Olly nije stigao da analizira ovaj kod, pritisnite CTRL + A da bi
ste videli sta se stvarno nalazi ovde:
004066A8 ? 8DC0 LEA EAX,EAX ; Illegal use of register
004066AA 74 DB 74 ; CHAR 't'
004066AB 03 DB 03
004066AC . CD 20 INT 20
004066AE > 64:67:8F06 00>POP DWORD PTR FS:[0]
Kao sto vidite LEA EAX,EAX je ilegalna komanda i zato Olly ne zna sta da
uradi ovde. Da bi smo presli preko ove komande potrebno je da pritisnemo
SHIFT + F9 posle cega cemo doci ovde:
00406BA6 CD DB CD
00406BA7 68 DB 68 ; CHAR 'h'
00406BA8 66 DB 66 ; CHAR 'f'
00406BA9 05 DB 05
Posto je ovo access vilation greska i ovde cemo pritisnuti SHIFT + F9 da
bi smo ponovo pokusali da startujemo program, ali cemo kao i prosli put
zavrsiti na LEA EAX, EAX komandi ovde:
004076F1 ? 8DC0 LEA EAX,EAX ; Illegal use of register
004076F3 ? EB 01 JMP SHORT CrackMe1.004076F6
Ako sledeci put pritisnemo SHIFT + F9 program ce se startovati! Posto
ovo znamo (mozete to i da proverite) mozemo da postavimo jedan memoriski
break-point na glavnu sekciju kako bi smo presreli izvrsenje koda koji se
nalazi u glavnoj sekciji. Samim presretanjem cemo se naci na OEPu.
Oticemo u Memory window (ALT + M) i postavicemo Memory break-point on
access na glavnu .code sekciju. Posle pritiska na SHIFT + F9 (da bi smo
presli preko LEA EAX,EAX) komande nacicemo se ovde:
0040104C 68 DB 68 ; CHAR 'h'
0040104D 481F4000 DD CrackMe1.00401F48
00401051 E8 DB E8
00401052 EE DB EE
00401053 FF DB FF
00401054 FF DB FF
00401055 FF DB FF
00401056 00 DB 00
00401057 00 DB 00
00401058 00 DB 00
00401059 00 DB 00
0040105A 00 DB 00
0040105B 00 DB 00
0040105C 30 DB 30 ; CHAR '0'
0040105D 00 DB 00
0040105E 00004000 DD CrackMe1.00400000
00401062 00 DB 00
Da li je ovo pravi OEP? Pritisnite CTRL + A da bi ste analizirali kod i
videcete sledece:
0040104C > /68 481F4000 PUSH CrackMe1.00401F48
00401051 . |E8 EEFFFFFF CALL CrackMe1.00401044
00401056 . |0000 ADD BYTE PTR DS:[EAX],AL
00401058 . |0000 ADD BYTE PTR DS:[EAX],AL
0040105A . |0000 ADD BYTE PTR DS:[EAX],AL
I kao sto je bilo i za ocekivati adresa 0040104C je pravi OEP. Ovde
mozemo uraditi dump i popravku importa.
Dump: Otvorite LordPE i selektujte proces koji trenutno debugujete.
Selektujte CrackMe10.exe i uradite full dump desnim dugmetom.
Impoti: Ostavljajuci Olly otvoren i ne pomeracuji se sa adrese 0040104C
startujte ImpRec i u listi procesa ponovo selektujte CrackMe10.exe. Posle
ovoga potrebno je da ispunite sledece polje. U OEP polje unesite 0040104C
- 00400000 = 104C i pritisnite IAT AutoSearch i Get Imports dugme. Posto
su svi pronadjeni importi validni mozemo da popravimo predhodno dumpovan
fajl pomocu LordPEa. Pritisnite Fix dump i selektujte snimljeni fajl
posle cega ce tELock 0.98b1 biti uspesno odpakiovan!
--[ 0x04 ]---------------------------------------------[ Unpacking 2 ]
Posto smo vec konfigurisali Olly kako treba i posto smo u proslom delu
ovog teksta vec naucili kako se dolazi do OEPa, to mozemo da iskoristimo
i ovde. Otvoricemo Olly i nasu drugu metu pomocu njega. Bez neke velike
mudrosti dolazimo do OEPa na adresi 00401000 i tu cemo uraditi dump.
Sam OEP izgleda ovako:
00401000 > /68 E5314000 PUSH decryptm.004031E5
00401005 . |68 73314000 PUSH decryptm.00403173
0040100A . |68 23314000 PUSH decryptm.00403123
0040100F . |68 D3304000 PUSH decryptm.004030D3
Mozemo da pokusamo da popravimo importe pomocu ImpReca ali cemo umesto
validnih importa pronaci 5 importa koje ImpRec ne moze da prepozna. Ove
importe cemo popraviti tako sto cemo snimiti ovo drvo pomocu klika na
Save Tree dugme. Kada snimimo ovaj fajl otvoricemo ga pomocu notepada i
videcemo sledece:
Target: decryptme1.tElock0.96.exe
OEP: 00001000 IATRVA: 00002000 IATSize: 00000014
FThunk: 00002000 NbFunc: 00000005
0 00002000 ? 0000 009E0000
0 00002004 ? 0000 009E001D
0 00002008 ? 0000 009E003A
0 0000200C ? 0000 00850000
0 00002010 ? 0000 0085001D
Sada cemo traceovati kroz nasu metu pomocu Ollya. Interesuju nas svi
CALLovi ka API funkcijama. Dakle ucicemo u sledeci CALL sa F7:
00401028 . E8 23060000 CALL decryptm.00401650
I nacicemo se ovde:
00401650 $- FF25 10204000 JMP NEAR DWORD PTR DS:[402010] <- Ovde smo
00401656 $- FF25 0C204000 JMP NEAR DWORD PTR DS:[40200C]
0040165C $- FF25 04204000 JMP NEAR DWORD PTR DS:[402004]
00401662 $- FF25 00204000 JMP NEAR DWORD PTR DS:[402000]
Kao sto vidimo ovaj niz skokova je lista skokova ka API pozivima,
odnosno ka njihovoj regirekciji. Sada moramo da povezemo svaku ovu adresu
sa jednim APIjem. Ovo cemo uraditi tako sto cemo pratiti svaki ovaj JMP
skok sa F7. U prvom slucaju cemo se posle klika na F7 naci ovde:
0085001D F9 STC
0085001E 72 01 JB SHORT 00850021
00850020 0C EB OR AL,0EB
00850022 02B8 663D8000 ADD BH,BYTE PTR DS:[EAX+803D66]
00850028 FF20 JMP NEAR DWORD PTR DS:[EAX]
0085002A B8 D64AA000 MOV EAX,0A04AD6
0085002F F8 CLC
00850030 ^ 72 EB JB SHORT 0085001D
00850032 B8 46008500 MOV EAX,850046
00850037 FF20 JMP NEAR DWORD PTR DS:[EAX]
00850039 90 NOP
0085003A B8 20000000 MOV EAX,20
0085003F 0000 ADD BYTE PTR DS:[EAX],AL
00850041 0076 64 ADD BYTE PTR DS:[ESI+64],DH
00850044 D6 SALC
00850045 ^ 77 E3 JA SHORT 0085002A
00850047 A6 CMPS BYTE PTR DS:[ESI],BYTE PTR ES:[EDI]
00850048 D4 77 AAM 77
Sada nam ostaje da ispratimo ovaj kod za redirekciju sa F8. Tokom ovoga
cemo naici na sledece:
00850037 - FF20 JMP NEAR DWORD PTR DS:[EAX];user32.wsprintfA
Kada vratimo iz ovog skoka ka user32.wsprintfA APIu nacicemo se ovde:
0040102D . 83C4 20 ADD ESP,20
00401030 . 68 36324000 PUSH decryptm.00403236
00401035 . E8 28060000 CALL decryptm.00401662
Ucicemo i u sledeci CALL sa F7 i nacicemo se ovde:
00401662 $- FF25 00204000 JMP NEAR DWORD PTR DS:[402000]
Ponovnim pritiskom na F7 dolazimo opet do API redirekcije. Ovde cemo
ponoviti sve sto smo radili i prilikom pronalaska wsprintf APIa samo sto
cemo ovaj put pronaci sledece:
009E001A - FF20 JMP NEAR DWORD PTR DS:[EAX];kernel32.lstrlenA
Posle izlaska iz kernel32.dll fajla nacicemo se ovde:
0040103A . 33FF XOR EDI,EDI
0040103C > 3BC7 CMP EAX,EDI
Sada cemo traziti kroz kod sve dok ne dodjemo do nekog sledeceg CALLa ka
nekoj API funkciji. To ce se desiti ovde:
00401635 . 6A 40 PUSH 40
00401637 . 68 00304000 PUSH decryptm.00403000
0040163C . 68 36324000 PUSH decryptm.00403236
00401641 . 6A 00 PUSH 0
00401643 . E8 0E000000 CALL decryptm.00401656
Ovde cemo ponovo biti prinudjeni da udjemo u taj CALL sa F7 i docicemo
ovde:
00401656 $- FF25 0C204000 JMP NEAR DWORD PTR DS:[40200C]
Klikom na F7 i analizom koda zakljucujemo da je ovo skok ka APIu:
0085001A - FF20 JMP NEAR DWORD PTR DS:[EAX];user32.MessageBoxA
Posle izvrsenja ovog CALLa ka MessageBoxA API i naravno posle njegovog
zatvaranja i vracanja iz kernel32.dll fajla nacicemo se ovde:
00401648 . 6A 00 PUSH 0
0040164A . E8 0D000000 CALL decryptm.0040165C
Naravno i ovo je poziv ka nekom APIu. Na isti nacin kao i do sada
dolazimo do zakljucka da se radi o:
0040165C $- FF25 04204000 JMP NEAR DWORD PTR DS:[402004]
...
009E0037 - FF20 JMP NEAR DWORD PTR DS:[EAX];kernel32.ExitProcess
kernel32.ExitProcess APIu.
Sada imamo sve podatke koji su nam potrebni za rekreiranje IAT.txt
fajla. Njegova struktura je jedinstvena i potrebna je podpuna
modifikacija do sada snimljenog fajla u sledecu strukturu:
Target: decryptme1.tElock0.96.exe
OEP: 00001000 IATRVA: 00002000 IATSize: 00000014
FThunk: 00002000 NbFunc: 00000002
1 00002000 kernel32.dll 0000 lstrlenA
1 00002004 kernel32.dll 0000 ExitProcess
FThunk: 0000200C NbFunc: 00000002
1 0000200C user32.dll 0000 MessageBoxA
1 00002010 user32.dll 0000 wsprintfA
Da pojasnim. Prvi red se ispunjava tako sto za FThunk vrednost stavlja
poziv ka prvom APIu iz nekog .dll fajla. Posto smo mi odlucili da to bude
00002000 (RVA 00402000) onda taj API mora odgovarati APIju koji se dobija
skokom sa JMP NEAR DWORD PTR DS:[402000], to jest mora odgovarati
lstrlenA APIu u kernel32.dll fajlu. Ali ovo je vec sadrzaj drugog reda u
kojem postoje dve konstante. Jedan na pocetku reda i 0000 koje se odnose
na ordinalni broj importa, ali ovaj broj cemo podesiti pomocu ImpReca.
Ovo treba ponoviti za sve .dll fajlove koje nasa meta ponavlja. Vec
uradjena IAT struktura se nalazi u istoj arhivi kao i nasa meta.
Kada konacno konacno snimite ovaj fajl otvorite ga pomocu Load Tree
opcije u ImpRecu i duplim klikom na svaki od ovih importa cete konacno
poraviti sve ordinale. Kada konacno i ovo zavrsite mocete da uradite Fix
dump i da vidite da je i tELock 0.96 uspesno odpakovan.
Jednostavno, zar ne :)
--[ 0x05 ]---------------------------------------------[ Outro & Greetz ]
To bi bilo to sto se tice tELocka. Njegovo otpakivanje i nije neki
problem... Jedino sto nas moze zadrzati malo duze je ispravka importa ali
kao sto smo videli ni to nije komplikovano. Sve u svemu vi ste dobili jos
jedan lep tekst o reversingu, a Deroko je dobio odgovor na pitanje: "Kako
da otpakujem tELock?"...
Greetz:
SeekNDestroy | TSRh | EMiNENCE | CoolPHat | ELUSIVE
b4d_s3c70r | B0r0 | loco | Kostolomac | Virus Krew | Jezgra | BlackHat
--[ EOF ]----------------------------------------------[ made by Ap0x ]