Author Topic: Analyza malware II  (Read 1043 times)

STMR

  • Newbie
  • *
  • Posts: 29
Analyza malware II
« on: May 14, 2010, 03:35:13 PM »
Ahoj,

velmi se omlouvam, ze to sem davam az ted, ale nejak sem se k tomu nemohl dostat. Po te, co mi to opet infikovali flashku tak jsem davam "aktualni verzi viru na flashce". Tento post navazuje na tento topic http://t4c.ic.cz/forum/index.php?topic=710.0

Jedna se o infekci Win32:MalOb-AI [Cryp], aspon podle AVASTu

Code: [Select]
hxxp://www.uloz.to/4823050/qsfsddfdfhfgerfgd.rar
Pswd:
t4c.ic.cz

Nevite nekdo, jak se postupuje pri analyze tohoto malware? Je tam hodne volani IsDebuggerPresent. Kdyz jsem nechal aby olly sam krokoval, dostal jsem na nejakou adresu 100** a tam stale dokola probihal XOR nejake vetsi casti v datovy sekci, ale nikam to nevedlo, zadny unpack.

ThX, jeste jednou pripominam ze to je malware!
« Last Edit: May 14, 2010, 03:45:30 PM by STMR »

pr0p4g4nd4

  • [SCF]
  • Senior Member
  • ****
  • Posts: 429
Re: Analyza malware II
« Reply #1 on: May 15, 2010, 07:35:40 AM »
kuknem sa ti na to, ked bude cas :P :)
Aký je rozdiel medzi mladým a starým chlapom?
Mladému behá piča po rozume, starému po byte...

Kto robí je robot, kto koktá je.. koktavý!

pr0p4g4nd4

  • [SCF]
  • Senior Member
  • ****
  • Posts: 429
Re: Analyza malware II
« Reply #2 on: May 18, 2010, 11:09:14 AM »
(virus som nedebugoval, pisem len cisto to co som vypozoroval)

virus sa attachuje na explorer.exe(OpenProcess, VirtualAllocEx a CreateRemoteThread) a taktiez sa pokusi vytvorit remote thread na system proces(mava pid 4h), ale vytvorenie remote threadu zlyha(podari sa ale alokovat nejaku pamat v procese pomocou VirtualAllocEx)(dovod zlyhania neviem, kedze som nedebugoval) - cize, nastav si bp na api OpenProcess a NtWriteVirtulaMemory - budes vidiet, kt procesy sa pokusa otvorit a ake data na dane procesy zapisuje - mozes si to hooknut tak, ze ked sa bude pokusat otovrit explorer.exe(api OpenProcess) tak zmenis pid na pid nejakeho svojho procesu(napr si zapni calc.exe) a tym padom sa remotethread vytvori na tom tvojom procese(lebo debugovat explorer.exe by bolo dost problematicke) a budes ho moct v pohodicke debugovat - na ten thread sa napojis tak, ze ked bude virus zapisovat data do tvojho procesu(pomocou api NtWriteVirtulaMemory), tak si vzdy kuknes buffer, kde su data, kt sa tam budu kopirovat(mam dojem, ze v tomto pripade sa funkcny kod zacina 55 8b) a zmenis prve  dva byty na eb fe - attachujes sa na ten proces, das sa na adresu remotethreadu, zmenis naspat eb fe byty a mozes debugovat :D

ak som si dobre vsimol, thread vytcori UDP pripojenie na port, kt sa po case zvysuje(vzdy sa ukonci spojenie a vytovri sa nove s portom +1 vacsim). no a este som si vsimol, ze thread vytvori hook na messageoch WH_KEYBOARD a WH_MOUSE.

virus svoje aktivovanie po starte zabezpeci, dvoma zapismi do registrov.

este sa na to kuknem, a poviem ti na co som dosiel :)
Aký je rozdiel medzi mladým a starým chlapom?
Mladému behá piča po rozume, starému po byte...

Kto robí je robot, kto koktá je.. koktavý!

Zodiac

  • Trial Member
  • **
  • Posts: 80
Re: Analyza malware II
« Reply #3 on: May 18, 2010, 07:42:35 PM »
(virus som nedebugoval, pisem len cisto to co som vypozoroval)

virus sa attachuje na explorer.exe(OpenProcess, VirtualAllocEx a CreateRemoteThread) a taktiez sa pokusi vytvorit remote thread na system proces(mava pid 4h), ale vytvorenie remote threadu zlyha(podari sa ale alokovat nejaku pamat v procese pomocou VirtualAllocEx)(dovod zlyhania neviem, kedze som nedebugoval) - cize, nastav si bp na api OpenProcess a NtWriteVirtulaMemory - budes vidiet, kt procesy sa pokusa otvorit a ake data na dane procesy zapisuje - mozes si to hooknut tak, ze ked sa bude pokusat otovrit explorer.exe(api OpenProcess) tak zmenis pid na pid nejakeho svojho procesu(napr si zapni calc.exe) a tym padom sa remotethread vytvori na tom tvojom procese(lebo debugovat explorer.exe by bolo dost problematicke) a budes ho moct v pohodicke debugovat - na ten thread sa napojis tak, ze ked bude virus zapisovat data do tvojho procesu(pomocou api NtWriteVirtulaMemory), tak si vzdy kuknes buffer, kde su data, kt sa tam budu kopirovat(mam dojem, ze v tomto pripade sa funkcny kod zacina 55 8b) a zmenis prve  dva byty na eb fe - attachujes sa na ten proces, das sa na adresu remotethreadu, zmenis naspat eb fe byty a mozes debugovat :D

ak som si dobre vsimol, thread vytcori UDP pripojenie na port, kt sa po case zvysuje(vzdy sa ukonci spojenie a vytovri sa nove s portom +1 vacsim). no a este som si vsimol, ze thread vytvori hook na messageoch WH_KEYBOARD a WH_MOUSE.

virus svoje aktivovanie po starte zabezpeci, dvoma zapismi do registrov.

este sa na to kuknem, a poviem ti na co som dosiel :)


ako analytik by si sa uzivil  :D :P

pr0p4g4nd4

  • [SCF]
  • Senior Member
  • ****
  • Posts: 429
Re: Analyza malware II
« Reply #4 on: May 19, 2010, 08:50:50 AM »
ako analytik by si sa uzivil  :D :P
nestraaaas, analytika by som v zivote nerobil - aj ked, peniaze by asi dokazali zmenit moje "pevne" presvedcenie :D

uf, ked si to tak teraz precitam to co som napisal, tak okrem toho, ze tam je asi milion preklepov, tak ak si zoberiem, ze STMR asi nie je zrovna skuseny v analyze, tak to co som mu napisal, by mu asi zrovna moc nepomohlo v tom, ze ako ma vlastne zacat s tou analyzou :D aj ked na moju obhajobu musim povedat, ze ked som to vcera pisal, tak som bol tesne pred stykom(akym? ;D), a uz mi nehorazne brnilo v.... ;D a do toho som musel pisat jednemu nemenovanemu sefovi nemenovaneho vajruslabu jednej nemenovanej firmy ;D

no a, zabudol som vcera dododat, ze virus sam seba skopne do "X:\RECYCLER/blablablabla" a odtial sa spusta pri starte. a este ze, vcera reku, ze to skusim po prvy krat nahodit do debuggera, na kod virusu som sa vysral, ale chcel som prekrokovat kod remotethreadu na explorer.exe, ale stala sa zrada, akosika to neslo(robil som to vo VM), tak reku , ze vytahnem mojho milacika SI(on bol moj prvy... moj prvy debugger na kt som robil! :D), tak som si spravil nove VM s win xp sp3 prof eng a ten virus tam preistotu vobec nesiel - najprv som si myslel, ze kvoli tomu, ze tam je SI, ale potom som skusal aj bez SI a nic, cize sa zda, ze najprv budem musiet zistit preco sa virus na tomto system neinfikuje, uf, a to som sa chcel vyhnut tomu aby som krokoval kod virusu :-\

no nic, ked budem mat cas, tak sa na to kuknem ;) 8)
Aký je rozdiel medzi mladým a starým chlapom?
Mladému behá piča po rozume, starému po byte...

Kto robí je robot, kto koktá je.. koktavý!

pr0p4g4nd4

  • [SCF]
  • Senior Member
  • ****
  • Posts: 429
Re: Analyza malware II
« Reply #5 on: May 20, 2010, 10:01:08 AM »
pardon, bolo to "X:\RECYCLER\blablablabla\nissan.exe(to bla su nejake random znaky-cisla)(subory sa zohduju, ide o presnu kopiu samotneho virusu)"
Aký je rozdiel medzi mladým a starým chlapom?
Mladému behá piča po rozume, starému po byte...

Kto robí je robot, kto koktá je.. koktavý!

pr0p4g4nd4

  • [SCF]
  • Senior Member
  • ****
  • Posts: 429
Re: Analyza malware II
« Reply #6 on: June 05, 2010, 07:31:05 AM »
tak som sa na to trosicku malicko pozrel a poobracal to v debuggery - na zaciatok si sprav tieto
patchy(samozrejme, ze v olly musis mat najprv otvoreny subor "dokja.exe"):

patchni api ZwSetInformationThread z(u mna vyzera tato api takto, u teba moze vyzerat inak):

Code: [Select]
mov eax,0e5
mov edx,7ffe0300
call dword ptr ds:[edx]
retn 10

na(tj dam sa na instrukciu "mov eax,0e5", stlacim medzernik v olly a napisem tam toto)(tym tuto api
znefunkcnime(tato api nam zhovaduje nasu pracu)):

Code: [Select]
retn 10
patchni api GetTickCount na(tymto si usetris vela "slepych uliciek", kt ta budu cakat v kode):

Code: [Select]
xor eax,eax
retn

patchni "BeingDebugged" byte v PEB na 00h(01h znamena, ze je aktivny debugger) - patchut to
mozes bud nejaky antiantidebug pluginom v olly(napr StrongOD - v nom moznost "HidePEB")(alebo
sa to da patchnut aj rucne, ale pre teba bude lahsie spravit to cez ten nejaky plugin)

patchni "NtGlobalFlag" byte V PEB(aj ked mam dojem, ze som niekde cital, ze "NtGlobalFlag" je
hodnota dlzky dword a nie byte, to je ale jedno, nas zaujima len byte) - potrebujes tam mat
00h, lebo 70h znamena, ze je debugger aktivny. patchnut sa to da tak, ze nieco malo kodu
assemblujes do procesu, a zistis presnu adresu "NtGlobalFlag" bytu, ale ja ti opat odporucam
pouzit nejaky plugin, kt to napatchuje za teba(opat napr StrongOD - kt v ramci tej moznosti
"HidePEB" vymaze aj tento "NtGlobalFlag" byte).


kod zaujimavy pre nas(pre teba) zacina hned po retn tej dlhej procky na EP virusu(dokja.exe),
cize skrolluje dole dole az uvidim retn(u mna adresa 0040d26c), dam tam bp, f9, f8 a som na
zaujimavej casti kodu(deju sa tam typicky virusove haluze) - takze mozes trasovat kolko len
chces, kod je dobre citatelny(bez obfuskacie a pod. veci - zameraj sa hlavne na pouzite api
funkcie, lebo pouzite api ti povedia velmi o behu kodu virusu) - hlavne o co ide, je to ze
povodny sekcie(pamat) procesu "dokja.exe" sa prepise na uplne ine PE a nakoniec sa sa prerobene
PE skoci(na jeho EP), je to adresa 0041081a - v momente ked si na EP noveho PE, tak mozes
proces zdumpovat a zistis, ze sa jedna o nejaky "Microsoft Visual C++ v8.0" app(tu je EP):

Code: [Select]
0041081A   .  E8 FD150000   CALL dokja.00411E1C
0041081F   .^ E9 78FEFFFF   JMP dokja.0041069C

no, prekrokujes(to "vsetko" co prekrokujes su len VC++ blbosti) to az na adresu 0040104b(call ebx);
vstup do callu a si tam(tento kod som presiel uz len zbezne, a dalej som to uz neskumal, ale je
pravdepodobne, ze sa to uz len dokonci a pokracuje sa v remotethreade na explorer.exe)


ovela zaujimavejsi podla mojho nazoru bude kod(remotethread), kt sa vykona na explorer.exe -
tu som ti pripravil maly navod ako kod nevytvarat a nevykonavat na explorer.exe ale na nasom
fake procese(kt mozme v pohode debugovat; debugovat proces explorer.exe je nahovno), a ako sa
attachnut na ten kod:

otvorim si exe(dokja.exe) v olly(samozrejme, ze to musi byt na neinfikovanom systeme)(a
samozrejme, ze musis mat spravene vsetky patchy, kt pisem hore) - dam hwbp
na api OpenProcess(do commandbaru napisem "he OpenProcess" a stlacim ENTER) a api
ZwWriteVirtualMemory(do commandbaru napisem "he ZwWriteVirtualMemory" a stlacim ENTER). pre lepsi
prehlad si stack window nastavime na adresu relativnu k ESP - klinem pravym tlacidlom mysi na
stack window(hocikde na stack) a dam ADDRESS/RELATIVE TO ESP. teraz v olly stlacam f9 dovtedy
pokym na stack neuvidim ako parameter api OpenProcess PID procesu explorer.exe(v mojom pripade je
to 2x, cize 2x som stlacil f9), vidim toto na stack:

Code: [Select]
ESP ==>  > 00125359  /CALL to OpenProcess from 00125357
ESP+4    > 0000047A  |Access = CREATE_THREAD|VM_OPERATION|VM_READ|VM_WRITE|DUP_HANDLE|QUERY_INFORMATION
ESP+8    > 00000000  |Inheritable = FALSE
ESP+C    > 000004C8  \ProcessId = 4C8

ako vidime, tak "ESP+C" ukazuje PID procesu, kt sa ide otvarat - u mna je 4c8h PID explorer.exe
teraz si otvorim(spustim) nejaky fake proces na kt sa remotethread vytvori - ja dam napr kalkulacku
z windows(calc.exe) - zistim si jeho PID. teraz v olly kliknem pravym tlacidlom mysi na "ESP+C"
(v stack okne samozrejme) a dam MODIFY - tam doplnim PID calc.exe, kt som si zistil(na zaver stlacim
ENTER). teraz mozem hwbp na OpenProcess zrusit(do commandbaru napisem "hd OpenProcess" a stlacim
ENTER). dobre, teraz stlacim f9 - breakli sme na api ZwWriteVirtualMemory, kt zapisuje data do
target procesu, na stack vidim toto:

Code: [Select]
ESP ==>  > 00125296  RETURN to 00125296       ;toto je len navratova adresa callu
ESP+4    > 000000BC                           ;handle procesu, do kt ideme zapisovat(handle vytorila api OpenProcess)
ESP+8    > 003F0000  ASCII "Actx "            ;adresa v procese, na kt sa ma zapisovat
ESP+C    > 0041A990  ASCII "VirtualProtect"   ;buffer, kde su data kt sa zapisu do target procesu
ESP+10   > 00000E72                           ;pocet bytov kt sa zapisu
ESP+14   > 00000000                           ;pocet bytov, kt sa uz na proces zapisali(je NULL, cize sa parameter ignoruje)

toto co vidime, su parametre api ZwWriteVirtualMemory(pre viac info si pozri api WriteProcessMemory).
zaujima nas hlavne "ESP+C", kde je buffer dat, kt sa budu zapisovat. potrebujeme najst buffer, kde sa
budu zapisovat data, resp funkcny kod(kod, kt sa bude dat exekuovat). ked chcem vidiet co je v buffery,
tak staci na "ESP+C" kliknut pravym tlacidlom mysi a dat FOLLOW IN DUMP. dobre, teraz stlacim v olly
dalsich 3x f9 - v tomto momente sa bud zapisovat kod, kt sa da exekuovat, staci ked si pozries buffer
a vidim hned byty "55 8b", co je znak toho, ze sa ide zapisovat ten kod kt nas zaujima. v tomto momente
musime buffer patchnut tak aby sme na zaciatocnej adrese remotethreadu spravili nekonecnu slucku
(eb fe). zaciatocnu adresu remotethreadu som zistil tak, ze som si pozrel parametre api
CreateRemoteThread(tato api sa vsak vola az po zapisani vsetkych dat, takze parametre api som si
musel pozriet predom). a ta zaciatocna adresa je "buffer+1bd0", cize teraz na stack vidim toto:

Code: [Select]
ESP ==>  > 00125296  RETURN to 00125296       ;toto je len navratova adresa callu
ESP+4    > 000000BC                           ;handle procesu, do kt ideme zapisovat(handle vytorila api OpenProcess)
ESP+8    > 00A30000                           ;adresa v procese, na kt sa ma zapisovat
ESP+C    > 00120914                           ;buffer, kde su data kt sa zapisu do target procesu
ESP+10   > 0000F613                           ;pocet bytov kt sa zapisu
ESP+14   > 00000000                           ;pocet bytov, kt sa uz na proces zapisali(je NULL, cize sa parameter ignoruje)

v "ESP+C" je adresa buffera - 00120914h, k nej pripocitam +1bd0h a dostanem 001224E4h - toto je miesto
kde dame "eb fe" loop("breakpoint"). v olly kliknem pravym tlacidlom mysi na DUMP WINDOW(cast okna
olly vlavo dole) a dam GO TO/EXPRESSION a tam napisem 001224E4 a stlacim ENTER. vidim toto:

Code: [Select]
001224E4  55 8B                    U‹
kliknem lavym tlacidlom mysi na byte "55", a hned zacnem pisat na klavesnici EB FE - stlacim ENTER.
teraz mozem zrusit hwbp na ZwWriteVirtualMemory(hd ZwWriteVirtualMemory) a stlacim f9 - proces by sa
mal ukoncit.

teraz na nasom calc.exe procese ukoncime main thread a nechame bezat len nas remotethread(main thread
je ten, kt zabera malo CPU usage - no a ten thread kt zabera skoro celu CPU usage je ten nas
remotethread, je to kvoli tomu, ze tam mame ten EB FE loop). teraz si otvorim nove okno olly(novu
instanciu olly)(tentokrat nemusime robit patchy, kt som popisoval uplne zaciatku tohoto minitutiku),
dam si menu FILE/ATTACH, kliknem na calc.exe proces(mozem ho identifikovat podla PID napr.) a kliknem
na tlacidlo ATTACH. teraz stlacim hned po sebe f9 a f12( tj rozbehni a hned pauza). mali by sme sa
nachadza na nasom eb fe loope:

Code: [Select]
00A31BD0  - EB FE           JMP SHORT 00A31BD0
klikem lavym tlacidlom mysi na adresu 00a31bd0(resp na ten riadok) - stlacim ctrl+e a pisem 55 8b
(to su povodne byty) a na zaver dam ENTER. no, a to je vsetko - mozes trasovat kod remotethreadu
(odporucam ti pouzivat hwbp a nie softwareove(f2)).
Aký je rozdiel medzi mladým a starým chlapom?
Mladému behá piča po rozume, starému po byte...

Kto robí je robot, kto koktá je.. koktavý!