Copy Link
Add to Bookmark
Report

2x08 Full Reverse (Target VCT #2)

eZine's profile picture
Published in 
phearless
 · 11 months ago

                     [ Target: VCT #2 ] 

pH#2 .............F.u.l.l..R.e.v.e.r.s.e............. [ #Sadrzaj ]
0x01 ................................................ [ Intro ]
0x02 ................................................ [ Tools of trade ]
0x03 ................................................ [ Unpacking ]
0x04 ................................................ [ Fishing ]
0x05 ................................................ [ Outro & Greetz ]


--[ 0x01 ]----------------------------------------------[ Intro ]

Posto smo uspesno crackovali prvi VCT crackme vreme je da predjemo na
drugi. Kao i prvi i ovaj drugi je izuzetno lak stoga citanje ovog teksta
ne preporucujem iskusnim reverserima. Izgleda da se tim VCT potrudio i
napravio jednu veoma lepu gradacisku kombinaciju crackmea po tezini. Ovo
znaci da su prva dva namenjena pocetnicima dok su ostala tri manje ili
vise izazovna i za iskusnije reversere. Sve u svemu odlicni crackmei za
vezbanje...
Ako pogledate fajl vct.nfo videcete da je ovaj crackme veoma
jednostavan. Potrebno je pronaci tacan seriski broj koji ce kada se unese
pokazati da program registrova. Ali na zalost po pocetnike ovaj problem
je dodatno otezan cinjenicom da je program zapakovan sa FSGom. Neka vas
ova cinjenica ne plasi FSG je jedan jako jednostavan paker za
odpakivanje, ali je istovremeno odlican paker!

--[ 0x02 ]---------------------------------------------[ Tools of trade ]

Da bi smo resili ovaj crackme, trebace nam neki reverserski alati:

[+] OllyDBG v.1.10 .................................. http://www.wasm.ru
[+] LordPE Delux .................................... http://www.wasm.ru
[+] ImpRec v.1.6 .................................... http://www.wasm.ru
[+] PeID v0.93 ...................................... http://www.wasm.ru
[+] HexDecChar v.0.4a ....................... http://ap0x.headcoders.net

i naravno meta:

[+] VCT #2 .......................................... 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 ]

Pakeri kao vrsta koda koji se koriste za smanjivanje velicine i/ili
zastitu koda od reversovanja se odlikuju po cinjenici da postavljaju svoj
cesto isti po sadrzaju kod ispred koda koji ce se odpakovati. Ovaj kod je
specifican za svaki paker pa ce se odpakivanje svakog razlikovati u
detaljima ali postupak ce svugde biti isti:

[1] Pronaci OEP pakovanog koda
[2] Uraditi full dump
[3] Uraditi popravku OEPa i importa

Prva tacka sa ove liste se relativno lako nadje ako poznajete osnove PE
fajlova. Bez obzira na ovo potrebno je otvoriti nasu metu pomocu Ollya,
sto ce nam pruziti uvid u takozvani packer OEP. Ovaj OEP predstavlja prvu
linuju koda koja ce se izvrsiti, a istovremeno pripada delu koda pakera.
Nasuprot ovoga postoji i takozvani pravi OEP koji predstavlja prvu liniju
koda koja se izvrsava odmah posle izvrsenja packerovog koda. Ova druga
linija je istovetna prvoj liniju koda nepakovanog programa i stoga ona
predstavlja pravi OEP!
Dakle kada zapocnemo sa odpakivanjem, zapakovane mete, prva linija koda
pakovanog programa ce izgledati ovako:

00405000 > BB D0014000 MOV EBX,vct_crac.004001D0
00405005 BF 00104000 MOV EDI,vct_crac.00401000
0040500A BE 00404000 MOV ESI,vct_crac.00404000
0040500F 53 PUSH EBX
00405010 E8 0A000000 CALL vct_crac.0040501F
00405015 02D2 ADD DL,DL
00405017 75 05 JNZ SHORT vct_crac.0040501E
00405019 8A16 MOV DL,BYTE PTR DS:[ESI]
0040501B 46 INC ESI
0040501C 12D2 ADC DL,DL
0040501E C3 RET

Ovaj prvi deo koda mozete slobodno izvrsiti sa F8. Ovo nije tako u svim
situacijama jer u nekim slucajevima CALLovi u blizini OEPa odmah vode do
pravog OEPa. Stoga treba proveravati vecinu "sumljivih" CALLova ulaskom u
njih sa F7. Ali kod FSGa ovo nije slucaj pa se stoga slobodno moze
izvrsiti sve komande do, ukljucujuci i, RET komandu.
Trik kod pronalazenja OEPa je u tome da treba pronaci mesto gde se
konacno regenerise import tablica. Ovo mesto cete prepoznati po cinjenici
da se .dll fajlovi koji sadrze APIje koje program koji odpakujemo poziva.
To mesto je specificno po APIju LoadLibraryA koji se koristi za dinamicko
ucitavanje raznih .dll fajlova. Stoga ce se ne mnogo posle odpakivanja i
rekontruisanja import tablice packer zavrsava i predaje dalje izvrsavanje
sada odpakovan kodu! Stoga cemo potraziti LoadLibraryA API:

004050BF BB 28514000 MOV EBX,<&KERNEL32.LoadLibraryA>
004050C4 47 INC EDI
004050C5 8B37 MOV ESI,DWORD PTR DS:[EDI]
004050C7 AF SCAS DWORD PTR ES:[EDI]
004050C8 57 PUSH EDI
004050C9 FF13 CALL NEAR DWORD PTR DS:[EBX]
004050CB 95 XCHG EAX,EBP
004050CC 33C0 XOR EAX,EAX
004050CE AE SCAS BYTE PTR ES:[EDI]
004050CF ^ 75 FD JNZ SHORT vct_crac.004050CE
004050D1 FE0F DEC BYTE PTR DS:[EDI]
004050D3 ^ 74 EF JE SHORT vct_crac.004050C4
004050D5 FE0F DEC BYTE PTR DS:[EDI]
004050D7 75 06 JNZ SHORT vct_crac.004050DF
004050D9 47 INC EDI
004050DA FF37 PUSH DWORD PTR DS:[EDI]
004050DC AF SCAS DWORD PTR ES:[EDI]
004050DD EB 09 JMP SHORT vct_crac.004050E8
004050DF FE0F DEC BYTE PTR DS:[EDI]
004050E1 - 0F84 19BFFFFF JE vct_crac.00401000

Posto se kod pakera najcesce nalazi u nekom svom rasponu, a pakovani kod
u nekom svom rasponu potrebno je pronaci neki skok ili CALL koji bi vodi
do raspona gde ce se nalaziti odpakovani kod. Posto vecina pakera
zadrzaja originalne sekcije, to jest njihove tipove ovo ce nam pomoci da
pronadjemo mesto gde ce se kod odpakovati. Potrebno je samo da u Ollyu
odemo u Memory Map prozor (ALT+M) i da tamo pronadjemo .CODE sekciju.
Zasto bas .CODE? Zato sto ona u skoro svim slucajevima sadrzi odpakovani
kod! Dakle kada otvorimo Memory Map prozor videcemo sledece:

Memory map
Address Size Owner Section Contains Type Access
00400000 00001000 vct_crac PE header Imag R
00401000 00003000 vct_crac code Imag R
00404000 00001000 vct_crac Imag R
00405000 00001000 vct_crac SFX,imports Imag R

Posto stvarno postoji .CODE sekcija oticicemo u nju kako bi smo videli
sta se tamo nalazi. Posle duplog klika na sekciju code videcemo ovo:

00401000 6A 00 PUSH 0
00401002 0000 ADD BYTE PTR DS:[EAX],AL
00401004 0000 ADD BYTE PTR DS:[EAX],AL
00401006 0000 ADD BYTE PTR DS:[EAX],AL

Gomila 0x00 bajtova? Da ovo znaci da se kod jos nije totalno odpakovao.
Kao sto vidite samo prvi bajt 0x6A se odpakovao. Iskoristicemo ovo...
Sada znamo dve cinjenice:

[1] Odpakovani kod pocinje na adresi 00401000
[2] Prvi bajt je vec odpakovan i on je 0x6A

Posto ce FSG kada zavrsi odpakivanje ocigledno predati izvrsavanje
adresi 00401000 zbog cega cemo njeno izvrsavanje presresti, a ovo ce nas
postaviti na pravi OEP. Kako da presretnemo izvrsavanje adrese 00401000?
Pa postoji dosta tehnika ali ova je najjednostavnija:
Desnim klikom na adresu 00401000 u Dump prozoru izaberite Breakpoint ->
Memory, on access... Posle ovoga ostaje nam da startujemo program klikom
na F9 i sacekamo da dodjemo do adrese 00401000.
Ali program nece direktno zastati na samom OEPu. Ne par puta ce FSG
pristupiti adresama 00401000 i 00401001 pa cemo morati da pritisnemo F9
4x dok ne dodjemo do pravog OEPa na adresi 00401000, koji izgleda ovako:

00401000 . 6A 00 PUSH 0 ; /pModule = NULL
00401002 . E8 6D060000 CALL vct_crac.00401674 ; \GetModuleHandleA
00401007 . A3 0A324000 MOV DWORD PTR DS:[40320A],EAX

Sada nam ostaje da uradimo full dump pomocu LordPEa i da popravimo
importe pomocu ImpReca. Ovo cemo uraditi po koracima koje sam gore
opisao.
Korak [2] uradicemo full dump. Ovo je ujedno i najlaksi korak, potrebno
je samo upaliti LordPE i u njemu izabrati proces koji odpakujemo, u ovom
slucaju to ce biti vct_crackme2.exe i desnim klikom na njega cemo uraditi
full dump.
Korak [3] uradicemo popravku importa. Ovaj korak se moze uraditi i sa
ReVirginom i sa ImpRecom, mi cemo ga uraditi pomocu ImpReca. Posle starta
ImpReca u listi aktivnih procesa treba izabrati proces vct_crackme2.exe i
podesiti sledece parametre:
[ OEP ] = 00401000 - ImageBase (0040000) dakle OEP = 1000
Ostale podatke mozete ostaviti kako jesu posle cega je potrebno odkaciti
opciju Add new section i pritisnuti dugme IAT AutoSearch, pa GetImports i
na kraju FixDump posle cega jos samo treba izabrati nas fajl koji smo
dumpovali pomocu LordPEa.
Rezultat ovoga je odpakovan fajl! Uspeli smo!

--[ 0x04 ]---------------------------------------------[ Fishing ]

Posto smo uspesno odpakovali metu vreme je da pronadjemo tacan seriski
broj za ovaj crackme. Verujte mi na rec ovo ce biti za nijansu lakse nego
odpakivanje mete, naravno uz pomoc odlicnog alata HexDecChara. Pocecemo
tako sto cemo otvoriti odpakovanu metu sa Olly debuggerom. Na OEPu cemo
videti ovo:

00401000 . 6A 00 PUSH 0 ; /pModule = NULL
00401002 . E8 6D060000 CALL vct_crac.00401674 ; \GetModuleHandleA
00401007 . A3 0A324000 MOV DWORD PTR DS:[40320A],EAX

Posto svi crackmei sadrze poruke o tacno/netacno unesenim seriskim
brojevima pocecemo tako sto cemo pretraziti sve string reference u ovom
fajlu. Ovo cemo uraditi klikom na desno dugme -> Search for -> All
referenced strings... Posle cega cemo pri samom vrhu novo-otvorenog
prozora primetiti sledece reference:

Text strings referenced in dumped_:, item 16
Address=004015B9
Disassembly=PUSH dumped_.004031AC
Text string=ASCII "Wow, PM to me for earn 2* :D"

Text strings referenced in dumped_:, item 17
Address=004015D2
Disassembly=PUSH dumped_.004031C9
Text string=ASCII "Ha ha ha, sai be't ro^`i ;-) ! Try again."

Ove reference predstavljaju takozvane GOOD BOY/BAD BOY poruke. One se
pojavljuju u zavisnosti da li je uneti seriski broj tacan ili ne i u
njihovoj fizickoj blizini se najcesce nalazi deo koda koji se koristi za
proveru ispravnosti seriskog broja, stoga cemo duplim klikom na good boy
poruku zavrsiti na sledecem delu koda:

004015B8 |> FC CLD <- Good boy
004015B9 |. 68 AC314000 PUSH 004031AC ; /Text
004015BE |. FF35 1A324000 PUSH DWORD PTR DS:[40321A] ; |hWnd
004015C4 |. E8 87000000 CALL <JMP.&user32.SetWindowTextA>; \SetWTextA
004015C9 |. B8 00000000 MOV EAX,0
004015CE |. 5A POP EDX
004015CF |. 59 POP ECX
004015D0 |. C3 RET
004015C9 |. B8 00000000 MOV EAX,0
004015CE |. 5A POP EDX
004015CF |. 59 POP ECX
004015D0 |. C3 RET
004015D1 |> FC CLD <- Bad boy
004015D2 |. 68 C9314000 PUSH 004031C9 ; /Text
004015D7 |. FF35 1A324000 PUSH DWORD PTR DS:[40321A] ; |hWnd
004015DD |. E8 6E000000 CALL <JMP.&user32.SetWindowTextA>; \SetWTextA
004015E2 |. B8 00000000 MOV EAX,0
004015E7 |. 5A POP EDX
004015E8 |. 59 POP ECX
004015E9 \. C3 RET

Ono sto nam je bitno je da pronadjemo skokove sa kojih se dolazi do bad
boy poruke. Ovo je jako bitno jer se ova vrsta uslovnih skokova izvrsava
samo posle nekog poredjenja, a to poredjenje je najcesce poredjenje
seriskih broja, t.j. poredjenje unetog seriskog broja i tacnog seriskog
broja. Iz ovog razloga, da bi program imao sta da poredi, unose se lazni,
netacni seriski brojevi u cilju pronalaska tacnih seriskih brojeva.
Ovo je jedna cinjenica koju morate da znate, a druga takodje jako bitna
je da se veoma cesto poredjenje seriskih brojeva i poruke o tacnosti,
t.j. netacnosti unetog seriskog broja nalaze u istom CALLu. Ova cinjenica
ce nam pomoci da pronadjemo gde i kako se to racuna seriski broj. Za sada
je potrebno da izolujemo celinu u kojoj se racuna seriski broj, to jest
da sagledamo ceo ovaj CALL. Ovo cemo uraditi jednostavnim scrollom na
pocetak ove celine, to jest CALLa, koji pocinje bas ovde:

0040141C /$ 51 PUSH ECX
0040141D |. 52 PUSH EDX
0040141E |. 6A 28 PUSH 28 ; /Count = 28 (40.)
00401420 |. 68 70324000 PUSH dumped_.00403270 ; |Buffer = 00403270
00401425 |. FF35 1A324000 PUSH DWORD PTR DS:[40321A] ; |hWnd
0040142B |. E8 E4010000 CALL <JMP.&user32.GetWindowTextA>; \GetWTextA
00401430 |. A3 FE314000 MOV DWORD PTR DS:[4031FE],EAX
00401435 |. 833D FE314000>CMP DWORD PTR DS:[4031FE],20
0040143C |. 0F85 8F010000 JNZ dumped_.004015D1

Kao sto se vidi sa pocetka ovog CALLa program ce uzeti podatke iz polja
za unos pomocu API funkcije GetWindowTextA. Ovo je jako bitno da
zapazite, to jest bitnije je da vidite na kojoj ce se adresi snimiti
procitani tekst iz polja za unos. Ovaj podatak koji se prosledjuje
GetWindowTextA APIju je oznacen kao buffer i sadrzi adresu 00403270 na
kojoj ce biti snimljen sadrzaj polja za unos.
Na ovoj adresi ce se nalaziti tekst, kome ce meta dalje pristupati
pomocu reference ka njemu, to jest preko njegove adrese. Isto kao sto ceo
tekst ima adresu na kojoj se nalazi, tako i svako slovo unetog teksta ima
svoju adresu. Ustvari adresa celog teksta predstavalj adresu ka prvom
slovu unetog teksta. Stoga cemo potraziti operacije koje se odnose na
adresu 00403270. Takve operacije cemo naci ovde:

00401442 |. BB 70324000 MOV EBX,dumped_.00403270
00401447 |. 0FBE03 MOVSX EAX,BYTE PTR DS:[EBX]
0040144A |. 83F8 34 CMP EAX,34
0040144D |. 0F85 7E010000 JNZ dumped_.004015D1
00401453 |. 43 INC EBX
00401454 |. 0FBE03 MOVSX EAX,BYTE PTR DS:[EBX]
00401457 |. 83F8 44 CMP EAX,44
0040145A |. 0F85 71010000 JNZ dumped_.004015D1
00401460 |. 43 INC EBX

Kao sto vidimo prvo se sadrzaj adrese 00403270 smesta u registar EBX.
Ali pazite ne smesta se u EBX sadrzaj adrese 00403270, nego se smesta
referenca ka adresi, a sam EBX se koristi kao pointer ka tekstu. U
slucaju kada je EBX jednak 00403270 on vodi do prvog slova unetog teksta,
sto ce biti iskorisceno vec na sledecoj adresi, na kojoj ce se u EAX
smestiti hexadecimalna vrednost prvog slova unetog teksta. Primetite da
kako se EBX povecava tako se u EAX smesta drugo slovo iz imena. Ovako se
proveravaju sva slova iz unetog seriskog broja. Posto je ovaj kod jako
dugacak i prakticno predstavlja istu stvar ovde je "zalepljen" samo jedan
deo koda. Ali kako se poredi uneti seriski broj sa tacnim?
Poredjenje se radi pomocu komande CMP! Secate se da smo rekli da ce EAX
sadrzati vrednosti svih unesenih slova. E pa iz tog razloga se EAX poredi
sa raznim brojevima pomocu komande CMP. Sta su ovi brojevi? Ti brojevi
predstavljaju hexadecimalne vrednosti slova tacnog seriskog broja. Pa ce
tako prvo slovo seriskog broja iz razloga sto se EAX poredi sa 34 biti
broj 4, drugo slovo ce biti D iz razloga sto se EAX poredi sa 44, i tako
dalje... Da bi ste pronasli ceo seriski broj potrebno je da pretrazite
ceo kod do za komandama CMP EAX,*. Ovo * ce predstavljati jedno
hexdecimalno slovo seriskog broja. Pretvaranje hexadecimalnih vrednosti u
slova mozete uraditi pomocu programa HexDecChar ili preko ASCII tablice
sa adrese www.ascitable.com. Kako god da uradite pretvaranje brojeva u
slova dobicete da je tacan seriski broj: 4DEAD697C78633134D3A16C75CD6E2DB

--[ 0x05 ]---------------------------------------------[ Outro & Greetz ]

Naravno ovo je bio jos jedan newbie tekst koji bi trebalo pocetnicima da
pokaze kako se to odpakuje FSG i "peca" seriski broj. Bas ovakve lake
primere bi trebalo da resavaju svi pocetnici koji zele da se bave
reversingom. Ostanite uz pH jer sledi jos jedan izvrstan reversing tekst.


Greetz:

SeekNDestroy | TSRh | EMiNENCE | CoolPHat | ELUSIVE | [ES]
b4d_s3c70r | asphyx | B0r0 | loco | Kostolomac | Virus Krew | Jezgra

--[ EOF ]----------------------------------------------[ made by Ap0x ]

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT