STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH...

79
SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA DIPLOMSKI RAD br. 1363 STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH PROGRAMA Laura Dabelić Zagreb, srpanj 2017.

Transcript of STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH...

Page 1: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

SVEUČILIŠTE U ZAGREBU

FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA

DIPLOMSKI RAD br 1363

STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH PROGRAMA

Laura Dabelić

Zagreb srpanj 2017

i

SADRŽAJ

1 Uvod 1

2 Jednostavna statička analiza 2

21 Provjera antivirusnim programima 2

22 Pronalaženje jedinstvenog ključa 3

23 Pronalaženje znakovnih nizova 4

24 Metode obfuskacije i pakiranja 4

241 Postupak kriptiranja 5

242 Oligomorfizam i polimorfizam 6

243 Metamorfizam 6

2431 Umetanje bdquomrtvog kodaldquo 7

2432 Ponovno dodjeljivanje registara 7

2433 Promjena redoslijeda subrutina 7

2434 Zamjena instrukcija 7

2435 Integracija koda 7

244 Pakiranje 8

2441 Obilježja pakiranih programa 8

2442 Postupci raspakiravanja 10

25 Format datoteke PE 12

26 Kodne biblioteke i vrste povezivanja 13

261 Statičko povezivanje 13

262 Dinamičko povezivanje 13

263 Sučelja primjenskih programa 15

27 Primjer jednostavne statičke analize 15

3 Jednostavna dinamička analiza 19

31 Izolirano okruženje za analizu 19

311 Mamci 20

32 Vrste promjena na zaraženom operacijskom sustavu 21

321 Promjene registara 21

322 Promjene datotečnog sustava 22

323 Promjene aktivnosti procesa 22

ii

324 Promjene mrežne aktivnosti 23

33 Pokretanje dinamičkih biblioteka 23

34 Primjer jednostavne dinamičke analize 24

4 Napredna statička analiza 28

41 Alati za naprednu statičku analizu 29

411 Programi za ispravljanje pogrešaka 29

412 Programi za prevođenje na viši programski jezik 29

413 Programi za generiranje ispisa strojnog koda 30

414 Programi za rad s datotekama u heksadekadskom obliku 30

415 Programi za snimanje procesa na disk 32

416 Programi za popravljanje uvoza 32

42 Pronalaženje otisaka 32

421 Alat za stvaranje otisaka 33

43 Primjer napredne statičke analize 34

5 Napredna dinamička analiza 40

51 Izvođenje korak po korak 40

52 Postavljanje prekidnih točaka 40

521 Programske prekidne točke 41

522 Sklopovske prekidne točke 41

523 Uvjetne prekidne točke 41

53 Ručno raspakiravanje 41

54 Primjer ručnog raspakiravanja 43

55 Metode koje otežavaju analizu 48

551 Provjera zastavice NtGlobalFlag 48

552 Provjera zastavice ProcessHeap 50

553 Provjera vremenskih oznaka 50

554 Provjera zastavice BeingDebugged 51

555 Provjera tragova na operacijskom sustavu 51

556 Korištenje lokalnog prostora dretve 51

557 Otkrivanje sklopovskih prekidnih točaka 52

6 Simulator ucjenjivačkih programa 54

61 Opis simulatora 54

62 Tehničke značajke 54

63 Upute za korištenje 56

iii

7 Analiza ucjenjivačkog programa 60

71 Osnovne značajke 60

72 Provjera mutanta 62

73 Prikupljanje informacija o zaraženom sustavu 63

74 Proces kriptiranja 65

75 Uklanjanje tragova 66

76 Izrada otiska 68

8 Usporedba ucjenjivačkih programa sa simulatorom 69

81 Vrsta programskog jezika 69

82 Mogućnosti upravljanja memorijom 69

83 Mehanizam održavanja 70

84 Brisanje tragova i kopija 70

85 Upravljanje ključevima 70

9 Zaključak 71

LITERATURA 72

1

1 Uvod

Zlonamjerni programi i problemi koje oni mogu izazvati česta su pojava u

računalnom svijetu Svaki program čija je svrha nanijeti neku vrstu štete

računalnom sustavu može se smatrati zlonamjernim programom Šteta može

varirati od zanemarivih pa sve do fatalnih razmjera Posljedice su financijski

gubitci sudske tužbe gubitak reputacije tvrtke i slično

Analiza zlonamjernih programa nastoji otkriti način na koji zlonamjerni program

funkcionira tehnikama reverznog inženjerstva Svrha analize jest unaprijediti

sigurnosne mjere računalnog sustava kako bi se daljnji incidenti mogli umanjiti ili

čak potpuno izbjeći Analiza nastoji dati odgovore na pitanja kako se sustav

zarazio zlonamjernim programom koju svrhu ima određeni zlonamjerni program

koliko je ozbiljna prijetnja koju predstavlja te koje skupine korisnika su potencijalno

ugrožene

Postoje dvije vrste analize statička i dinamička Statička analiza provodi se bez

pokretanja zlonamjernog programa Pregledom koda mogu se pronaći informacije

o tome što program radi koji je njegov format koristi li neke tehnike obfuskacije ili

pakiranja te koja sučelja (engl Application Program Interface) se koriste

Napredna statička analiza obuhvaća pregled asemblerskih instrukcija te praćenje

stanja memorije registara i stoga (engl stack)

Dinamička analiza obuhvaća pokretanje zlonamjernog programa u virtualiziranoj

izoliranoj okolini i promatranje njegovog ponašanja na zaraženom sustavu

Prilikom jednostavne statičke analize moguće je vidjeti promjene koje izaziva

zlonamjerni program podatke koje šalje ukoliko postoji komunikacija sa

upravljačkim poslužiteljem (engl Command and Control Server) instalaciju

dodatnih usluga i slično Naprednu dinamičku analizu čini promatranje

zlonamjernog programa pomoću alata za pregled i ispravljanje pogrešaka u

mnemoničkom obliku (engl debugger) čime se mogu dobiti informacije o punoj

funkcionalnosti zlonamjernog programa Također se mogu uočiti karakteristične

instrukcije koje opisuju zlonamjerno ponašanje te se pomoću tih informacija može

napraviti otisak (engl signature) kojim se u budućnosti može otkriti prisutnost istog

ili sličnog zlonamjernog programa u sustavu

Novi zlonamjerni programi pojavljuju se svakodnevno Tehnike kojima nastoje

prevariti sigurnosne sustave sve su inovativnije te je stoga analiza zlonamjernih

programa područje koje se stalno razvija pruža nove izazove te zahtijeva

kreativnost i sposobnost razmišljanja bdquoizvan kutijeldquo

2

2 Jednostavna statička analiza

Prvi korak prilikom analize zlonamjernog programa jest jednostavna statička

analiza kojom se mogu dobiti osnovne informacije o zlonamjernom programu koji

se analizira poput

formata datoteke

anomalija koje upućuju na zlonamjerno ponašanje

metoda obfuskacije

jedinstvenog ključa

reputacije

Prilikom statičke analize zlonamjerni program se ne pokreće nego se nastoji dobiti

općenita bdquogrubaldquo slika o njegovom izgledu i mogućnostima Informacije prikupljene

statičkom analizom mogu se ponekad iskoristiti za izradu jednostavnih otisaka

(engl signatures) koje koriste antivirusni programi Izrada otisaka koji će biti

korišteni u statičkoj analizi antivirusnog programa moguća je samo ako

zlonamjerni program nije pakiran ili kompresiran jer su u tom slučaju dijelovi

zlonamjernog programa kriptirani te stoga neupotrebljivi za otisak

21 Provjera antivirusnim programima

Zlonamjerni program je na samom početku analize datoteka u nepoznatom

formatu bez ekstenzije o kojoj se ništa ne zna te je stoga korisno saznati kakvu

reputaciju taj zlonamjerni program ima Informacije o tome nude internetske

stranice koje nude mogućnost predaje datoteke na analizu antivirusnim

programima Virustotal Metadefender Jotti Malwr i VirScan su neke od tih

stranica Datoteka koja se analizira skenira se pomoću 60-ak antivirusnih

programa te se generira izvještaj koji sadrži broj antivirusnih programa koji su

datoteku okarakterizirali kao zlonamjernu (engl detection ratio) reputaciju

temeljenu na dojavama drugih korisnika jedinstveni ključ izračunat pomoću

nekoliko najčešće korištenih algoritama alternativna imena po kojima je datoteka

sa istim jedinstvenim ključem uočena i slično Primjer dijela jednog takvog

izvještaja vidljiv je na slici 21

Automatska analiza ima svoja ograničenja koja se očituju u pojavi lažnih pozitivnih

(engl false positive) i lažnih negativnih detekcija (engl false negative) Lažna

pozitivna detekcija odnosi se na automatsku analizu koja je neku datoteku

proglasila zlonamjernom premda ona to zapravo nije Razlozi za to mogu biti

raznoliki datoteka je bila oštećena prilikom preuzimanja s Interneta korištena je

neka neobična metoda kompresije neki sumnjivi internetski protokol i slično

3

Slika 21 ndash Dio izvještaja nakon provjere antivirusnim programima

Suprotno tome kod lažne negativne detekcije zlonamjerna datoteka bila je

okarakterizirana kao legitimna Ovaj slučaj je čest ako se radi o polimorfnom

zlonamjernom programu koji može mijenjati svoj kod u trenutku izvođenja kako bi

zaobišao heurističke provjere koje detektiraju zlonamjerno ponašanje Osim toga

zlonamjerni program može biti i potpuno nov te stoga o njemu nema podataka u

bazama antivirusnih programa Iz navedenih razloga se ovaj izvještaj treba uzeti s

rezervom i koristiti samo kao smjernica na samom početku analize

22 Pronalaženje jedinstvenog ključa

Jedinstveni ključ (engl hash) služi za jedinstveno identificiranje podataka Dobiva

se primjenom nekog od algoritama za računanje jedinstvenog ključa od kojih su

najpoznatiji MD5 (engl Message Digest) SHA1 SHA125 i SHA256 (engl Secure

Hash Algorithm) Funkcija prima niz proizvoljne duljine i vraća niz fiksne duljine a

neke od njezinih ključnih svojstava su

za istu datoteku svaki put će generirati isti jedinstveni ključ

za dvije različite datoteke nikada se neće generirati isti jedinstveni ključ

na osnovu izlaza nije moguće regenerirati ulaznu poruku

za bilo kakav ulaz može se brzo izračunati

Duljina se razlikuje ovisno o primijenjenom algoritmu a što je ona veća to je veća i

razina pouzdanosti Algoritam MD5 probijen je već odavno i stoga se više ne

smatra sigurnim U velječi 2017 otkrivena je prva javna kolizija za SHA1 tako da

se niti on u budućnosti više neće smatrati sigurnim [10]

4

Jedinstveni ključ može se iskoristiti za pronalaženje dodatnih informacija o

zlonamjernom programu kao što su na primjer službena izvješća antivirusnih

kompanija (engl whitepaper) Neki programi za arhiviranje kao što je 7-ZIP nude

mogućnost računanja jedinstvenog ključa kao što je vidljivo na slici 22

Slika 22 ndash Jedinstveni ključevi generirani pomoću programa 7-ZIP

23 Pronalaženje znakovnih nizova

Znakovni nizovi mogu sadržavati informacije o korištenim sučeljima porukama

korisniku koje program može ispisati lokacijama na disku kojima program

pristupa IP adresama ukoliko se radi o programu koji se spaja na Internet i slično

Alat Strings pokreće se iz komandne linije i pretražuje sve ASCII i UNICODE

znakovne nizove dulje od tri znaka Prilikom pretrage znakovnih nizova Strings

ignorira kontekst i formatiranje tako da može analizirati bilo koji tip datoteke i

pretražiti datoteku u cijelosti Posljedica ovog pristupa su tzv bdquolažni znakovni

nizovildquo To su nizovi od tri znaka koji ne predstavljaju ništa smisleno i zapravo su

instrukcije procesora memorijske adrese ili neki interni podaci koje koristi program

[1] Razliku između pravih i bdquolažnihldquo znakovnih nizova korisnik mora uočiti sam

Primjerice ako se CodeBlocksexe datoteka popularnog razvojnog okruženja

CodeBlocks analizira programom Strings dio ispisa koji sadrži takve znakovne

nizove vidljiv je na slici 23 i označen je crveno

24 Metode obfuskacije i pakiranja

Metode pakiranja i obfuskacije služe za otežavanje analize i izbjegavanje provjera

od strane sigurnosnih sustava Obfuskacija je postupak skrivanja pravog značenja

informacije Obfuskacijom se nastoji sakriti dijelove programskog koda Pakiranje

je podskup obfuskacije i obuhvaća metode kompresije kojima se zlonamjerni

program nastoji prikazati manjim nego što stvarno jest

5

Slika 23 ndash Dio rezultata analize programom Strings

241 Postupak kriptiranja

Prvi korak kojim se nastoji zaobići provjera antivirusnim programima jest korištenje

kriptiranja zbog toga što antivirusni programi imaju bazu otisaka (engl signatures)

koji opisuju karakteristične značajke zlonamjernog ponašanja Zlonamjerni

program sadrži dekripcijski dio koji prilikom svakog pokretanja dekriptira kod

zlonamjernog programa Prilikom svake infekcije koristi se drugačiji slučajno

generirani ključ kriptiranja tako da je kriptirani dio zlonamjernog programa svaki

put drugačiji Prvi zlonamjerni program koji je koristio postupak kriptiranja bio je

virus Cascade iz 1986 godine i radilo se o jednostavnoj XOR funkciji koja je kao

ključ koristila veličinu zaražene datoteke [2] U ono vrijeme to je bilo dovoljno jer

su antivirusni programi bili još jako nerazvijeni i koristili su samo jednostavno

uspoređivanje otisaka koje je davalo mnoge lažne detekcije XOR funkcija također

je bila pogodna autorima zlonamjernog programa jer se zbog svoje jednostavnosti

mogla koristiti i za kriptiranje i za dekriptiranje Glavni nedostatak ovog pristupa

bila je dekripcijska rutina koja je uvijek bila ista iz generacije u generaciju te je to

kasnije omogućilo lakšu detekciju kada su antivirusni programi napredovali

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 2: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

i

SADRŽAJ

1 Uvod 1

2 Jednostavna statička analiza 2

21 Provjera antivirusnim programima 2

22 Pronalaženje jedinstvenog ključa 3

23 Pronalaženje znakovnih nizova 4

24 Metode obfuskacije i pakiranja 4

241 Postupak kriptiranja 5

242 Oligomorfizam i polimorfizam 6

243 Metamorfizam 6

2431 Umetanje bdquomrtvog kodaldquo 7

2432 Ponovno dodjeljivanje registara 7

2433 Promjena redoslijeda subrutina 7

2434 Zamjena instrukcija 7

2435 Integracija koda 7

244 Pakiranje 8

2441 Obilježja pakiranih programa 8

2442 Postupci raspakiravanja 10

25 Format datoteke PE 12

26 Kodne biblioteke i vrste povezivanja 13

261 Statičko povezivanje 13

262 Dinamičko povezivanje 13

263 Sučelja primjenskih programa 15

27 Primjer jednostavne statičke analize 15

3 Jednostavna dinamička analiza 19

31 Izolirano okruženje za analizu 19

311 Mamci 20

32 Vrste promjena na zaraženom operacijskom sustavu 21

321 Promjene registara 21

322 Promjene datotečnog sustava 22

323 Promjene aktivnosti procesa 22

ii

324 Promjene mrežne aktivnosti 23

33 Pokretanje dinamičkih biblioteka 23

34 Primjer jednostavne dinamičke analize 24

4 Napredna statička analiza 28

41 Alati za naprednu statičku analizu 29

411 Programi za ispravljanje pogrešaka 29

412 Programi za prevođenje na viši programski jezik 29

413 Programi za generiranje ispisa strojnog koda 30

414 Programi za rad s datotekama u heksadekadskom obliku 30

415 Programi za snimanje procesa na disk 32

416 Programi za popravljanje uvoza 32

42 Pronalaženje otisaka 32

421 Alat za stvaranje otisaka 33

43 Primjer napredne statičke analize 34

5 Napredna dinamička analiza 40

51 Izvođenje korak po korak 40

52 Postavljanje prekidnih točaka 40

521 Programske prekidne točke 41

522 Sklopovske prekidne točke 41

523 Uvjetne prekidne točke 41

53 Ručno raspakiravanje 41

54 Primjer ručnog raspakiravanja 43

55 Metode koje otežavaju analizu 48

551 Provjera zastavice NtGlobalFlag 48

552 Provjera zastavice ProcessHeap 50

553 Provjera vremenskih oznaka 50

554 Provjera zastavice BeingDebugged 51

555 Provjera tragova na operacijskom sustavu 51

556 Korištenje lokalnog prostora dretve 51

557 Otkrivanje sklopovskih prekidnih točaka 52

6 Simulator ucjenjivačkih programa 54

61 Opis simulatora 54

62 Tehničke značajke 54

63 Upute za korištenje 56

iii

7 Analiza ucjenjivačkog programa 60

71 Osnovne značajke 60

72 Provjera mutanta 62

73 Prikupljanje informacija o zaraženom sustavu 63

74 Proces kriptiranja 65

75 Uklanjanje tragova 66

76 Izrada otiska 68

8 Usporedba ucjenjivačkih programa sa simulatorom 69

81 Vrsta programskog jezika 69

82 Mogućnosti upravljanja memorijom 69

83 Mehanizam održavanja 70

84 Brisanje tragova i kopija 70

85 Upravljanje ključevima 70

9 Zaključak 71

LITERATURA 72

1

1 Uvod

Zlonamjerni programi i problemi koje oni mogu izazvati česta su pojava u

računalnom svijetu Svaki program čija je svrha nanijeti neku vrstu štete

računalnom sustavu može se smatrati zlonamjernim programom Šteta može

varirati od zanemarivih pa sve do fatalnih razmjera Posljedice su financijski

gubitci sudske tužbe gubitak reputacije tvrtke i slično

Analiza zlonamjernih programa nastoji otkriti način na koji zlonamjerni program

funkcionira tehnikama reverznog inženjerstva Svrha analize jest unaprijediti

sigurnosne mjere računalnog sustava kako bi se daljnji incidenti mogli umanjiti ili

čak potpuno izbjeći Analiza nastoji dati odgovore na pitanja kako se sustav

zarazio zlonamjernim programom koju svrhu ima određeni zlonamjerni program

koliko je ozbiljna prijetnja koju predstavlja te koje skupine korisnika su potencijalno

ugrožene

Postoje dvije vrste analize statička i dinamička Statička analiza provodi se bez

pokretanja zlonamjernog programa Pregledom koda mogu se pronaći informacije

o tome što program radi koji je njegov format koristi li neke tehnike obfuskacije ili

pakiranja te koja sučelja (engl Application Program Interface) se koriste

Napredna statička analiza obuhvaća pregled asemblerskih instrukcija te praćenje

stanja memorije registara i stoga (engl stack)

Dinamička analiza obuhvaća pokretanje zlonamjernog programa u virtualiziranoj

izoliranoj okolini i promatranje njegovog ponašanja na zaraženom sustavu

Prilikom jednostavne statičke analize moguće je vidjeti promjene koje izaziva

zlonamjerni program podatke koje šalje ukoliko postoji komunikacija sa

upravljačkim poslužiteljem (engl Command and Control Server) instalaciju

dodatnih usluga i slično Naprednu dinamičku analizu čini promatranje

zlonamjernog programa pomoću alata za pregled i ispravljanje pogrešaka u

mnemoničkom obliku (engl debugger) čime se mogu dobiti informacije o punoj

funkcionalnosti zlonamjernog programa Također se mogu uočiti karakteristične

instrukcije koje opisuju zlonamjerno ponašanje te se pomoću tih informacija može

napraviti otisak (engl signature) kojim se u budućnosti može otkriti prisutnost istog

ili sličnog zlonamjernog programa u sustavu

Novi zlonamjerni programi pojavljuju se svakodnevno Tehnike kojima nastoje

prevariti sigurnosne sustave sve su inovativnije te je stoga analiza zlonamjernih

programa područje koje se stalno razvija pruža nove izazove te zahtijeva

kreativnost i sposobnost razmišljanja bdquoizvan kutijeldquo

2

2 Jednostavna statička analiza

Prvi korak prilikom analize zlonamjernog programa jest jednostavna statička

analiza kojom se mogu dobiti osnovne informacije o zlonamjernom programu koji

se analizira poput

formata datoteke

anomalija koje upućuju na zlonamjerno ponašanje

metoda obfuskacije

jedinstvenog ključa

reputacije

Prilikom statičke analize zlonamjerni program se ne pokreće nego se nastoji dobiti

općenita bdquogrubaldquo slika o njegovom izgledu i mogućnostima Informacije prikupljene

statičkom analizom mogu se ponekad iskoristiti za izradu jednostavnih otisaka

(engl signatures) koje koriste antivirusni programi Izrada otisaka koji će biti

korišteni u statičkoj analizi antivirusnog programa moguća je samo ako

zlonamjerni program nije pakiran ili kompresiran jer su u tom slučaju dijelovi

zlonamjernog programa kriptirani te stoga neupotrebljivi za otisak

21 Provjera antivirusnim programima

Zlonamjerni program je na samom početku analize datoteka u nepoznatom

formatu bez ekstenzije o kojoj se ništa ne zna te je stoga korisno saznati kakvu

reputaciju taj zlonamjerni program ima Informacije o tome nude internetske

stranice koje nude mogućnost predaje datoteke na analizu antivirusnim

programima Virustotal Metadefender Jotti Malwr i VirScan su neke od tih

stranica Datoteka koja se analizira skenira se pomoću 60-ak antivirusnih

programa te se generira izvještaj koji sadrži broj antivirusnih programa koji su

datoteku okarakterizirali kao zlonamjernu (engl detection ratio) reputaciju

temeljenu na dojavama drugih korisnika jedinstveni ključ izračunat pomoću

nekoliko najčešće korištenih algoritama alternativna imena po kojima je datoteka

sa istim jedinstvenim ključem uočena i slično Primjer dijela jednog takvog

izvještaja vidljiv je na slici 21

Automatska analiza ima svoja ograničenja koja se očituju u pojavi lažnih pozitivnih

(engl false positive) i lažnih negativnih detekcija (engl false negative) Lažna

pozitivna detekcija odnosi se na automatsku analizu koja je neku datoteku

proglasila zlonamjernom premda ona to zapravo nije Razlozi za to mogu biti

raznoliki datoteka je bila oštećena prilikom preuzimanja s Interneta korištena je

neka neobična metoda kompresije neki sumnjivi internetski protokol i slično

3

Slika 21 ndash Dio izvještaja nakon provjere antivirusnim programima

Suprotno tome kod lažne negativne detekcije zlonamjerna datoteka bila je

okarakterizirana kao legitimna Ovaj slučaj je čest ako se radi o polimorfnom

zlonamjernom programu koji može mijenjati svoj kod u trenutku izvođenja kako bi

zaobišao heurističke provjere koje detektiraju zlonamjerno ponašanje Osim toga

zlonamjerni program može biti i potpuno nov te stoga o njemu nema podataka u

bazama antivirusnih programa Iz navedenih razloga se ovaj izvještaj treba uzeti s

rezervom i koristiti samo kao smjernica na samom početku analize

22 Pronalaženje jedinstvenog ključa

Jedinstveni ključ (engl hash) služi za jedinstveno identificiranje podataka Dobiva

se primjenom nekog od algoritama za računanje jedinstvenog ključa od kojih su

najpoznatiji MD5 (engl Message Digest) SHA1 SHA125 i SHA256 (engl Secure

Hash Algorithm) Funkcija prima niz proizvoljne duljine i vraća niz fiksne duljine a

neke od njezinih ključnih svojstava su

za istu datoteku svaki put će generirati isti jedinstveni ključ

za dvije različite datoteke nikada se neće generirati isti jedinstveni ključ

na osnovu izlaza nije moguće regenerirati ulaznu poruku

za bilo kakav ulaz može se brzo izračunati

Duljina se razlikuje ovisno o primijenjenom algoritmu a što je ona veća to je veća i

razina pouzdanosti Algoritam MD5 probijen je već odavno i stoga se više ne

smatra sigurnim U velječi 2017 otkrivena je prva javna kolizija za SHA1 tako da

se niti on u budućnosti više neće smatrati sigurnim [10]

4

Jedinstveni ključ može se iskoristiti za pronalaženje dodatnih informacija o

zlonamjernom programu kao što su na primjer službena izvješća antivirusnih

kompanija (engl whitepaper) Neki programi za arhiviranje kao što je 7-ZIP nude

mogućnost računanja jedinstvenog ključa kao što je vidljivo na slici 22

Slika 22 ndash Jedinstveni ključevi generirani pomoću programa 7-ZIP

23 Pronalaženje znakovnih nizova

Znakovni nizovi mogu sadržavati informacije o korištenim sučeljima porukama

korisniku koje program može ispisati lokacijama na disku kojima program

pristupa IP adresama ukoliko se radi o programu koji se spaja na Internet i slično

Alat Strings pokreće se iz komandne linije i pretražuje sve ASCII i UNICODE

znakovne nizove dulje od tri znaka Prilikom pretrage znakovnih nizova Strings

ignorira kontekst i formatiranje tako da može analizirati bilo koji tip datoteke i

pretražiti datoteku u cijelosti Posljedica ovog pristupa su tzv bdquolažni znakovni

nizovildquo To su nizovi od tri znaka koji ne predstavljaju ništa smisleno i zapravo su

instrukcije procesora memorijske adrese ili neki interni podaci koje koristi program

[1] Razliku između pravih i bdquolažnihldquo znakovnih nizova korisnik mora uočiti sam

Primjerice ako se CodeBlocksexe datoteka popularnog razvojnog okruženja

CodeBlocks analizira programom Strings dio ispisa koji sadrži takve znakovne

nizove vidljiv je na slici 23 i označen je crveno

24 Metode obfuskacije i pakiranja

Metode pakiranja i obfuskacije služe za otežavanje analize i izbjegavanje provjera

od strane sigurnosnih sustava Obfuskacija je postupak skrivanja pravog značenja

informacije Obfuskacijom se nastoji sakriti dijelove programskog koda Pakiranje

je podskup obfuskacije i obuhvaća metode kompresije kojima se zlonamjerni

program nastoji prikazati manjim nego što stvarno jest

5

Slika 23 ndash Dio rezultata analize programom Strings

241 Postupak kriptiranja

Prvi korak kojim se nastoji zaobići provjera antivirusnim programima jest korištenje

kriptiranja zbog toga što antivirusni programi imaju bazu otisaka (engl signatures)

koji opisuju karakteristične značajke zlonamjernog ponašanja Zlonamjerni

program sadrži dekripcijski dio koji prilikom svakog pokretanja dekriptira kod

zlonamjernog programa Prilikom svake infekcije koristi se drugačiji slučajno

generirani ključ kriptiranja tako da je kriptirani dio zlonamjernog programa svaki

put drugačiji Prvi zlonamjerni program koji je koristio postupak kriptiranja bio je

virus Cascade iz 1986 godine i radilo se o jednostavnoj XOR funkciji koja je kao

ključ koristila veličinu zaražene datoteke [2] U ono vrijeme to je bilo dovoljno jer

su antivirusni programi bili još jako nerazvijeni i koristili su samo jednostavno

uspoređivanje otisaka koje je davalo mnoge lažne detekcije XOR funkcija također

je bila pogodna autorima zlonamjernog programa jer se zbog svoje jednostavnosti

mogla koristiti i za kriptiranje i za dekriptiranje Glavni nedostatak ovog pristupa

bila je dekripcijska rutina koja je uvijek bila ista iz generacije u generaciju te je to

kasnije omogućilo lakšu detekciju kada su antivirusni programi napredovali

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 3: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

ii

324 Promjene mrežne aktivnosti 23

33 Pokretanje dinamičkih biblioteka 23

34 Primjer jednostavne dinamičke analize 24

4 Napredna statička analiza 28

41 Alati za naprednu statičku analizu 29

411 Programi za ispravljanje pogrešaka 29

412 Programi za prevođenje na viši programski jezik 29

413 Programi za generiranje ispisa strojnog koda 30

414 Programi za rad s datotekama u heksadekadskom obliku 30

415 Programi za snimanje procesa na disk 32

416 Programi za popravljanje uvoza 32

42 Pronalaženje otisaka 32

421 Alat za stvaranje otisaka 33

43 Primjer napredne statičke analize 34

5 Napredna dinamička analiza 40

51 Izvođenje korak po korak 40

52 Postavljanje prekidnih točaka 40

521 Programske prekidne točke 41

522 Sklopovske prekidne točke 41

523 Uvjetne prekidne točke 41

53 Ručno raspakiravanje 41

54 Primjer ručnog raspakiravanja 43

55 Metode koje otežavaju analizu 48

551 Provjera zastavice NtGlobalFlag 48

552 Provjera zastavice ProcessHeap 50

553 Provjera vremenskih oznaka 50

554 Provjera zastavice BeingDebugged 51

555 Provjera tragova na operacijskom sustavu 51

556 Korištenje lokalnog prostora dretve 51

557 Otkrivanje sklopovskih prekidnih točaka 52

6 Simulator ucjenjivačkih programa 54

61 Opis simulatora 54

62 Tehničke značajke 54

63 Upute za korištenje 56

iii

7 Analiza ucjenjivačkog programa 60

71 Osnovne značajke 60

72 Provjera mutanta 62

73 Prikupljanje informacija o zaraženom sustavu 63

74 Proces kriptiranja 65

75 Uklanjanje tragova 66

76 Izrada otiska 68

8 Usporedba ucjenjivačkih programa sa simulatorom 69

81 Vrsta programskog jezika 69

82 Mogućnosti upravljanja memorijom 69

83 Mehanizam održavanja 70

84 Brisanje tragova i kopija 70

85 Upravljanje ključevima 70

9 Zaključak 71

LITERATURA 72

1

1 Uvod

Zlonamjerni programi i problemi koje oni mogu izazvati česta su pojava u

računalnom svijetu Svaki program čija je svrha nanijeti neku vrstu štete

računalnom sustavu može se smatrati zlonamjernim programom Šteta može

varirati od zanemarivih pa sve do fatalnih razmjera Posljedice su financijski

gubitci sudske tužbe gubitak reputacije tvrtke i slično

Analiza zlonamjernih programa nastoji otkriti način na koji zlonamjerni program

funkcionira tehnikama reverznog inženjerstva Svrha analize jest unaprijediti

sigurnosne mjere računalnog sustava kako bi se daljnji incidenti mogli umanjiti ili

čak potpuno izbjeći Analiza nastoji dati odgovore na pitanja kako se sustav

zarazio zlonamjernim programom koju svrhu ima određeni zlonamjerni program

koliko je ozbiljna prijetnja koju predstavlja te koje skupine korisnika su potencijalno

ugrožene

Postoje dvije vrste analize statička i dinamička Statička analiza provodi se bez

pokretanja zlonamjernog programa Pregledom koda mogu se pronaći informacije

o tome što program radi koji je njegov format koristi li neke tehnike obfuskacije ili

pakiranja te koja sučelja (engl Application Program Interface) se koriste

Napredna statička analiza obuhvaća pregled asemblerskih instrukcija te praćenje

stanja memorije registara i stoga (engl stack)

Dinamička analiza obuhvaća pokretanje zlonamjernog programa u virtualiziranoj

izoliranoj okolini i promatranje njegovog ponašanja na zaraženom sustavu

Prilikom jednostavne statičke analize moguće je vidjeti promjene koje izaziva

zlonamjerni program podatke koje šalje ukoliko postoji komunikacija sa

upravljačkim poslužiteljem (engl Command and Control Server) instalaciju

dodatnih usluga i slično Naprednu dinamičku analizu čini promatranje

zlonamjernog programa pomoću alata za pregled i ispravljanje pogrešaka u

mnemoničkom obliku (engl debugger) čime se mogu dobiti informacije o punoj

funkcionalnosti zlonamjernog programa Također se mogu uočiti karakteristične

instrukcije koje opisuju zlonamjerno ponašanje te se pomoću tih informacija može

napraviti otisak (engl signature) kojim se u budućnosti može otkriti prisutnost istog

ili sličnog zlonamjernog programa u sustavu

Novi zlonamjerni programi pojavljuju se svakodnevno Tehnike kojima nastoje

prevariti sigurnosne sustave sve su inovativnije te je stoga analiza zlonamjernih

programa područje koje se stalno razvija pruža nove izazove te zahtijeva

kreativnost i sposobnost razmišljanja bdquoizvan kutijeldquo

2

2 Jednostavna statička analiza

Prvi korak prilikom analize zlonamjernog programa jest jednostavna statička

analiza kojom se mogu dobiti osnovne informacije o zlonamjernom programu koji

se analizira poput

formata datoteke

anomalija koje upućuju na zlonamjerno ponašanje

metoda obfuskacije

jedinstvenog ključa

reputacije

Prilikom statičke analize zlonamjerni program se ne pokreće nego se nastoji dobiti

općenita bdquogrubaldquo slika o njegovom izgledu i mogućnostima Informacije prikupljene

statičkom analizom mogu se ponekad iskoristiti za izradu jednostavnih otisaka

(engl signatures) koje koriste antivirusni programi Izrada otisaka koji će biti

korišteni u statičkoj analizi antivirusnog programa moguća je samo ako

zlonamjerni program nije pakiran ili kompresiran jer su u tom slučaju dijelovi

zlonamjernog programa kriptirani te stoga neupotrebljivi za otisak

21 Provjera antivirusnim programima

Zlonamjerni program je na samom početku analize datoteka u nepoznatom

formatu bez ekstenzije o kojoj se ništa ne zna te je stoga korisno saznati kakvu

reputaciju taj zlonamjerni program ima Informacije o tome nude internetske

stranice koje nude mogućnost predaje datoteke na analizu antivirusnim

programima Virustotal Metadefender Jotti Malwr i VirScan su neke od tih

stranica Datoteka koja se analizira skenira se pomoću 60-ak antivirusnih

programa te se generira izvještaj koji sadrži broj antivirusnih programa koji su

datoteku okarakterizirali kao zlonamjernu (engl detection ratio) reputaciju

temeljenu na dojavama drugih korisnika jedinstveni ključ izračunat pomoću

nekoliko najčešće korištenih algoritama alternativna imena po kojima je datoteka

sa istim jedinstvenim ključem uočena i slično Primjer dijela jednog takvog

izvještaja vidljiv je na slici 21

Automatska analiza ima svoja ograničenja koja se očituju u pojavi lažnih pozitivnih

(engl false positive) i lažnih negativnih detekcija (engl false negative) Lažna

pozitivna detekcija odnosi se na automatsku analizu koja je neku datoteku

proglasila zlonamjernom premda ona to zapravo nije Razlozi za to mogu biti

raznoliki datoteka je bila oštećena prilikom preuzimanja s Interneta korištena je

neka neobična metoda kompresije neki sumnjivi internetski protokol i slično

3

Slika 21 ndash Dio izvještaja nakon provjere antivirusnim programima

Suprotno tome kod lažne negativne detekcije zlonamjerna datoteka bila je

okarakterizirana kao legitimna Ovaj slučaj je čest ako se radi o polimorfnom

zlonamjernom programu koji može mijenjati svoj kod u trenutku izvođenja kako bi

zaobišao heurističke provjere koje detektiraju zlonamjerno ponašanje Osim toga

zlonamjerni program može biti i potpuno nov te stoga o njemu nema podataka u

bazama antivirusnih programa Iz navedenih razloga se ovaj izvještaj treba uzeti s

rezervom i koristiti samo kao smjernica na samom početku analize

22 Pronalaženje jedinstvenog ključa

Jedinstveni ključ (engl hash) služi za jedinstveno identificiranje podataka Dobiva

se primjenom nekog od algoritama za računanje jedinstvenog ključa od kojih su

najpoznatiji MD5 (engl Message Digest) SHA1 SHA125 i SHA256 (engl Secure

Hash Algorithm) Funkcija prima niz proizvoljne duljine i vraća niz fiksne duljine a

neke od njezinih ključnih svojstava su

za istu datoteku svaki put će generirati isti jedinstveni ključ

za dvije različite datoteke nikada se neće generirati isti jedinstveni ključ

na osnovu izlaza nije moguće regenerirati ulaznu poruku

za bilo kakav ulaz može se brzo izračunati

Duljina se razlikuje ovisno o primijenjenom algoritmu a što je ona veća to je veća i

razina pouzdanosti Algoritam MD5 probijen je već odavno i stoga se više ne

smatra sigurnim U velječi 2017 otkrivena je prva javna kolizija za SHA1 tako da

se niti on u budućnosti više neće smatrati sigurnim [10]

4

Jedinstveni ključ može se iskoristiti za pronalaženje dodatnih informacija o

zlonamjernom programu kao što su na primjer službena izvješća antivirusnih

kompanija (engl whitepaper) Neki programi za arhiviranje kao što je 7-ZIP nude

mogućnost računanja jedinstvenog ključa kao što je vidljivo na slici 22

Slika 22 ndash Jedinstveni ključevi generirani pomoću programa 7-ZIP

23 Pronalaženje znakovnih nizova

Znakovni nizovi mogu sadržavati informacije o korištenim sučeljima porukama

korisniku koje program može ispisati lokacijama na disku kojima program

pristupa IP adresama ukoliko se radi o programu koji se spaja na Internet i slično

Alat Strings pokreće se iz komandne linije i pretražuje sve ASCII i UNICODE

znakovne nizove dulje od tri znaka Prilikom pretrage znakovnih nizova Strings

ignorira kontekst i formatiranje tako da može analizirati bilo koji tip datoteke i

pretražiti datoteku u cijelosti Posljedica ovog pristupa su tzv bdquolažni znakovni

nizovildquo To su nizovi od tri znaka koji ne predstavljaju ništa smisleno i zapravo su

instrukcije procesora memorijske adrese ili neki interni podaci koje koristi program

[1] Razliku između pravih i bdquolažnihldquo znakovnih nizova korisnik mora uočiti sam

Primjerice ako se CodeBlocksexe datoteka popularnog razvojnog okruženja

CodeBlocks analizira programom Strings dio ispisa koji sadrži takve znakovne

nizove vidljiv je na slici 23 i označen je crveno

24 Metode obfuskacije i pakiranja

Metode pakiranja i obfuskacije služe za otežavanje analize i izbjegavanje provjera

od strane sigurnosnih sustava Obfuskacija je postupak skrivanja pravog značenja

informacije Obfuskacijom se nastoji sakriti dijelove programskog koda Pakiranje

je podskup obfuskacije i obuhvaća metode kompresije kojima se zlonamjerni

program nastoji prikazati manjim nego što stvarno jest

5

Slika 23 ndash Dio rezultata analize programom Strings

241 Postupak kriptiranja

Prvi korak kojim se nastoji zaobići provjera antivirusnim programima jest korištenje

kriptiranja zbog toga što antivirusni programi imaju bazu otisaka (engl signatures)

koji opisuju karakteristične značajke zlonamjernog ponašanja Zlonamjerni

program sadrži dekripcijski dio koji prilikom svakog pokretanja dekriptira kod

zlonamjernog programa Prilikom svake infekcije koristi se drugačiji slučajno

generirani ključ kriptiranja tako da je kriptirani dio zlonamjernog programa svaki

put drugačiji Prvi zlonamjerni program koji je koristio postupak kriptiranja bio je

virus Cascade iz 1986 godine i radilo se o jednostavnoj XOR funkciji koja je kao

ključ koristila veličinu zaražene datoteke [2] U ono vrijeme to je bilo dovoljno jer

su antivirusni programi bili još jako nerazvijeni i koristili su samo jednostavno

uspoređivanje otisaka koje je davalo mnoge lažne detekcije XOR funkcija također

je bila pogodna autorima zlonamjernog programa jer se zbog svoje jednostavnosti

mogla koristiti i za kriptiranje i za dekriptiranje Glavni nedostatak ovog pristupa

bila je dekripcijska rutina koja je uvijek bila ista iz generacije u generaciju te je to

kasnije omogućilo lakšu detekciju kada su antivirusni programi napredovali

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 4: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

iii

7 Analiza ucjenjivačkog programa 60

71 Osnovne značajke 60

72 Provjera mutanta 62

73 Prikupljanje informacija o zaraženom sustavu 63

74 Proces kriptiranja 65

75 Uklanjanje tragova 66

76 Izrada otiska 68

8 Usporedba ucjenjivačkih programa sa simulatorom 69

81 Vrsta programskog jezika 69

82 Mogućnosti upravljanja memorijom 69

83 Mehanizam održavanja 70

84 Brisanje tragova i kopija 70

85 Upravljanje ključevima 70

9 Zaključak 71

LITERATURA 72

1

1 Uvod

Zlonamjerni programi i problemi koje oni mogu izazvati česta su pojava u

računalnom svijetu Svaki program čija je svrha nanijeti neku vrstu štete

računalnom sustavu može se smatrati zlonamjernim programom Šteta može

varirati od zanemarivih pa sve do fatalnih razmjera Posljedice su financijski

gubitci sudske tužbe gubitak reputacije tvrtke i slično

Analiza zlonamjernih programa nastoji otkriti način na koji zlonamjerni program

funkcionira tehnikama reverznog inženjerstva Svrha analize jest unaprijediti

sigurnosne mjere računalnog sustava kako bi se daljnji incidenti mogli umanjiti ili

čak potpuno izbjeći Analiza nastoji dati odgovore na pitanja kako se sustav

zarazio zlonamjernim programom koju svrhu ima određeni zlonamjerni program

koliko je ozbiljna prijetnja koju predstavlja te koje skupine korisnika su potencijalno

ugrožene

Postoje dvije vrste analize statička i dinamička Statička analiza provodi se bez

pokretanja zlonamjernog programa Pregledom koda mogu se pronaći informacije

o tome što program radi koji je njegov format koristi li neke tehnike obfuskacije ili

pakiranja te koja sučelja (engl Application Program Interface) se koriste

Napredna statička analiza obuhvaća pregled asemblerskih instrukcija te praćenje

stanja memorije registara i stoga (engl stack)

Dinamička analiza obuhvaća pokretanje zlonamjernog programa u virtualiziranoj

izoliranoj okolini i promatranje njegovog ponašanja na zaraženom sustavu

Prilikom jednostavne statičke analize moguće je vidjeti promjene koje izaziva

zlonamjerni program podatke koje šalje ukoliko postoji komunikacija sa

upravljačkim poslužiteljem (engl Command and Control Server) instalaciju

dodatnih usluga i slično Naprednu dinamičku analizu čini promatranje

zlonamjernog programa pomoću alata za pregled i ispravljanje pogrešaka u

mnemoničkom obliku (engl debugger) čime se mogu dobiti informacije o punoj

funkcionalnosti zlonamjernog programa Također se mogu uočiti karakteristične

instrukcije koje opisuju zlonamjerno ponašanje te se pomoću tih informacija može

napraviti otisak (engl signature) kojim se u budućnosti može otkriti prisutnost istog

ili sličnog zlonamjernog programa u sustavu

Novi zlonamjerni programi pojavljuju se svakodnevno Tehnike kojima nastoje

prevariti sigurnosne sustave sve su inovativnije te je stoga analiza zlonamjernih

programa područje koje se stalno razvija pruža nove izazove te zahtijeva

kreativnost i sposobnost razmišljanja bdquoizvan kutijeldquo

2

2 Jednostavna statička analiza

Prvi korak prilikom analize zlonamjernog programa jest jednostavna statička

analiza kojom se mogu dobiti osnovne informacije o zlonamjernom programu koji

se analizira poput

formata datoteke

anomalija koje upućuju na zlonamjerno ponašanje

metoda obfuskacije

jedinstvenog ključa

reputacije

Prilikom statičke analize zlonamjerni program se ne pokreće nego se nastoji dobiti

općenita bdquogrubaldquo slika o njegovom izgledu i mogućnostima Informacije prikupljene

statičkom analizom mogu se ponekad iskoristiti za izradu jednostavnih otisaka

(engl signatures) koje koriste antivirusni programi Izrada otisaka koji će biti

korišteni u statičkoj analizi antivirusnog programa moguća je samo ako

zlonamjerni program nije pakiran ili kompresiran jer su u tom slučaju dijelovi

zlonamjernog programa kriptirani te stoga neupotrebljivi za otisak

21 Provjera antivirusnim programima

Zlonamjerni program je na samom početku analize datoteka u nepoznatom

formatu bez ekstenzije o kojoj se ništa ne zna te je stoga korisno saznati kakvu

reputaciju taj zlonamjerni program ima Informacije o tome nude internetske

stranice koje nude mogućnost predaje datoteke na analizu antivirusnim

programima Virustotal Metadefender Jotti Malwr i VirScan su neke od tih

stranica Datoteka koja se analizira skenira se pomoću 60-ak antivirusnih

programa te se generira izvještaj koji sadrži broj antivirusnih programa koji su

datoteku okarakterizirali kao zlonamjernu (engl detection ratio) reputaciju

temeljenu na dojavama drugih korisnika jedinstveni ključ izračunat pomoću

nekoliko najčešće korištenih algoritama alternativna imena po kojima je datoteka

sa istim jedinstvenim ključem uočena i slično Primjer dijela jednog takvog

izvještaja vidljiv je na slici 21

Automatska analiza ima svoja ograničenja koja se očituju u pojavi lažnih pozitivnih

(engl false positive) i lažnih negativnih detekcija (engl false negative) Lažna

pozitivna detekcija odnosi se na automatsku analizu koja je neku datoteku

proglasila zlonamjernom premda ona to zapravo nije Razlozi za to mogu biti

raznoliki datoteka je bila oštećena prilikom preuzimanja s Interneta korištena je

neka neobična metoda kompresije neki sumnjivi internetski protokol i slično

3

Slika 21 ndash Dio izvještaja nakon provjere antivirusnim programima

Suprotno tome kod lažne negativne detekcije zlonamjerna datoteka bila je

okarakterizirana kao legitimna Ovaj slučaj je čest ako se radi o polimorfnom

zlonamjernom programu koji može mijenjati svoj kod u trenutku izvođenja kako bi

zaobišao heurističke provjere koje detektiraju zlonamjerno ponašanje Osim toga

zlonamjerni program može biti i potpuno nov te stoga o njemu nema podataka u

bazama antivirusnih programa Iz navedenih razloga se ovaj izvještaj treba uzeti s

rezervom i koristiti samo kao smjernica na samom početku analize

22 Pronalaženje jedinstvenog ključa

Jedinstveni ključ (engl hash) služi za jedinstveno identificiranje podataka Dobiva

se primjenom nekog od algoritama za računanje jedinstvenog ključa od kojih su

najpoznatiji MD5 (engl Message Digest) SHA1 SHA125 i SHA256 (engl Secure

Hash Algorithm) Funkcija prima niz proizvoljne duljine i vraća niz fiksne duljine a

neke od njezinih ključnih svojstava su

za istu datoteku svaki put će generirati isti jedinstveni ključ

za dvije različite datoteke nikada se neće generirati isti jedinstveni ključ

na osnovu izlaza nije moguće regenerirati ulaznu poruku

za bilo kakav ulaz može se brzo izračunati

Duljina se razlikuje ovisno o primijenjenom algoritmu a što je ona veća to je veća i

razina pouzdanosti Algoritam MD5 probijen je već odavno i stoga se više ne

smatra sigurnim U velječi 2017 otkrivena je prva javna kolizija za SHA1 tako da

se niti on u budućnosti više neće smatrati sigurnim [10]

4

Jedinstveni ključ može se iskoristiti za pronalaženje dodatnih informacija o

zlonamjernom programu kao što su na primjer službena izvješća antivirusnih

kompanija (engl whitepaper) Neki programi za arhiviranje kao što je 7-ZIP nude

mogućnost računanja jedinstvenog ključa kao što je vidljivo na slici 22

Slika 22 ndash Jedinstveni ključevi generirani pomoću programa 7-ZIP

23 Pronalaženje znakovnih nizova

Znakovni nizovi mogu sadržavati informacije o korištenim sučeljima porukama

korisniku koje program može ispisati lokacijama na disku kojima program

pristupa IP adresama ukoliko se radi o programu koji se spaja na Internet i slično

Alat Strings pokreće se iz komandne linije i pretražuje sve ASCII i UNICODE

znakovne nizove dulje od tri znaka Prilikom pretrage znakovnih nizova Strings

ignorira kontekst i formatiranje tako da može analizirati bilo koji tip datoteke i

pretražiti datoteku u cijelosti Posljedica ovog pristupa su tzv bdquolažni znakovni

nizovildquo To su nizovi od tri znaka koji ne predstavljaju ništa smisleno i zapravo su

instrukcije procesora memorijske adrese ili neki interni podaci koje koristi program

[1] Razliku između pravih i bdquolažnihldquo znakovnih nizova korisnik mora uočiti sam

Primjerice ako se CodeBlocksexe datoteka popularnog razvojnog okruženja

CodeBlocks analizira programom Strings dio ispisa koji sadrži takve znakovne

nizove vidljiv je na slici 23 i označen je crveno

24 Metode obfuskacije i pakiranja

Metode pakiranja i obfuskacije služe za otežavanje analize i izbjegavanje provjera

od strane sigurnosnih sustava Obfuskacija je postupak skrivanja pravog značenja

informacije Obfuskacijom se nastoji sakriti dijelove programskog koda Pakiranje

je podskup obfuskacije i obuhvaća metode kompresije kojima se zlonamjerni

program nastoji prikazati manjim nego što stvarno jest

5

Slika 23 ndash Dio rezultata analize programom Strings

241 Postupak kriptiranja

Prvi korak kojim se nastoji zaobići provjera antivirusnim programima jest korištenje

kriptiranja zbog toga što antivirusni programi imaju bazu otisaka (engl signatures)

koji opisuju karakteristične značajke zlonamjernog ponašanja Zlonamjerni

program sadrži dekripcijski dio koji prilikom svakog pokretanja dekriptira kod

zlonamjernog programa Prilikom svake infekcije koristi se drugačiji slučajno

generirani ključ kriptiranja tako da je kriptirani dio zlonamjernog programa svaki

put drugačiji Prvi zlonamjerni program koji je koristio postupak kriptiranja bio je

virus Cascade iz 1986 godine i radilo se o jednostavnoj XOR funkciji koja je kao

ključ koristila veličinu zaražene datoteke [2] U ono vrijeme to je bilo dovoljno jer

su antivirusni programi bili još jako nerazvijeni i koristili su samo jednostavno

uspoređivanje otisaka koje je davalo mnoge lažne detekcije XOR funkcija također

je bila pogodna autorima zlonamjernog programa jer se zbog svoje jednostavnosti

mogla koristiti i za kriptiranje i za dekriptiranje Glavni nedostatak ovog pristupa

bila je dekripcijska rutina koja je uvijek bila ista iz generacije u generaciju te je to

kasnije omogućilo lakšu detekciju kada su antivirusni programi napredovali

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 5: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

1

1 Uvod

Zlonamjerni programi i problemi koje oni mogu izazvati česta su pojava u

računalnom svijetu Svaki program čija je svrha nanijeti neku vrstu štete

računalnom sustavu može se smatrati zlonamjernim programom Šteta može

varirati od zanemarivih pa sve do fatalnih razmjera Posljedice su financijski

gubitci sudske tužbe gubitak reputacije tvrtke i slično

Analiza zlonamjernih programa nastoji otkriti način na koji zlonamjerni program

funkcionira tehnikama reverznog inženjerstva Svrha analize jest unaprijediti

sigurnosne mjere računalnog sustava kako bi se daljnji incidenti mogli umanjiti ili

čak potpuno izbjeći Analiza nastoji dati odgovore na pitanja kako se sustav

zarazio zlonamjernim programom koju svrhu ima određeni zlonamjerni program

koliko je ozbiljna prijetnja koju predstavlja te koje skupine korisnika su potencijalno

ugrožene

Postoje dvije vrste analize statička i dinamička Statička analiza provodi se bez

pokretanja zlonamjernog programa Pregledom koda mogu se pronaći informacije

o tome što program radi koji je njegov format koristi li neke tehnike obfuskacije ili

pakiranja te koja sučelja (engl Application Program Interface) se koriste

Napredna statička analiza obuhvaća pregled asemblerskih instrukcija te praćenje

stanja memorije registara i stoga (engl stack)

Dinamička analiza obuhvaća pokretanje zlonamjernog programa u virtualiziranoj

izoliranoj okolini i promatranje njegovog ponašanja na zaraženom sustavu

Prilikom jednostavne statičke analize moguće je vidjeti promjene koje izaziva

zlonamjerni program podatke koje šalje ukoliko postoji komunikacija sa

upravljačkim poslužiteljem (engl Command and Control Server) instalaciju

dodatnih usluga i slično Naprednu dinamičku analizu čini promatranje

zlonamjernog programa pomoću alata za pregled i ispravljanje pogrešaka u

mnemoničkom obliku (engl debugger) čime se mogu dobiti informacije o punoj

funkcionalnosti zlonamjernog programa Također se mogu uočiti karakteristične

instrukcije koje opisuju zlonamjerno ponašanje te se pomoću tih informacija može

napraviti otisak (engl signature) kojim se u budućnosti može otkriti prisutnost istog

ili sličnog zlonamjernog programa u sustavu

Novi zlonamjerni programi pojavljuju se svakodnevno Tehnike kojima nastoje

prevariti sigurnosne sustave sve su inovativnije te je stoga analiza zlonamjernih

programa područje koje se stalno razvija pruža nove izazove te zahtijeva

kreativnost i sposobnost razmišljanja bdquoizvan kutijeldquo

2

2 Jednostavna statička analiza

Prvi korak prilikom analize zlonamjernog programa jest jednostavna statička

analiza kojom se mogu dobiti osnovne informacije o zlonamjernom programu koji

se analizira poput

formata datoteke

anomalija koje upućuju na zlonamjerno ponašanje

metoda obfuskacije

jedinstvenog ključa

reputacije

Prilikom statičke analize zlonamjerni program se ne pokreće nego se nastoji dobiti

općenita bdquogrubaldquo slika o njegovom izgledu i mogućnostima Informacije prikupljene

statičkom analizom mogu se ponekad iskoristiti za izradu jednostavnih otisaka

(engl signatures) koje koriste antivirusni programi Izrada otisaka koji će biti

korišteni u statičkoj analizi antivirusnog programa moguća je samo ako

zlonamjerni program nije pakiran ili kompresiran jer su u tom slučaju dijelovi

zlonamjernog programa kriptirani te stoga neupotrebljivi za otisak

21 Provjera antivirusnim programima

Zlonamjerni program je na samom početku analize datoteka u nepoznatom

formatu bez ekstenzije o kojoj se ništa ne zna te je stoga korisno saznati kakvu

reputaciju taj zlonamjerni program ima Informacije o tome nude internetske

stranice koje nude mogućnost predaje datoteke na analizu antivirusnim

programima Virustotal Metadefender Jotti Malwr i VirScan su neke od tih

stranica Datoteka koja se analizira skenira se pomoću 60-ak antivirusnih

programa te se generira izvještaj koji sadrži broj antivirusnih programa koji su

datoteku okarakterizirali kao zlonamjernu (engl detection ratio) reputaciju

temeljenu na dojavama drugih korisnika jedinstveni ključ izračunat pomoću

nekoliko najčešće korištenih algoritama alternativna imena po kojima je datoteka

sa istim jedinstvenim ključem uočena i slično Primjer dijela jednog takvog

izvještaja vidljiv je na slici 21

Automatska analiza ima svoja ograničenja koja se očituju u pojavi lažnih pozitivnih

(engl false positive) i lažnih negativnih detekcija (engl false negative) Lažna

pozitivna detekcija odnosi se na automatsku analizu koja je neku datoteku

proglasila zlonamjernom premda ona to zapravo nije Razlozi za to mogu biti

raznoliki datoteka je bila oštećena prilikom preuzimanja s Interneta korištena je

neka neobična metoda kompresije neki sumnjivi internetski protokol i slično

3

Slika 21 ndash Dio izvještaja nakon provjere antivirusnim programima

Suprotno tome kod lažne negativne detekcije zlonamjerna datoteka bila je

okarakterizirana kao legitimna Ovaj slučaj je čest ako se radi o polimorfnom

zlonamjernom programu koji može mijenjati svoj kod u trenutku izvođenja kako bi

zaobišao heurističke provjere koje detektiraju zlonamjerno ponašanje Osim toga

zlonamjerni program može biti i potpuno nov te stoga o njemu nema podataka u

bazama antivirusnih programa Iz navedenih razloga se ovaj izvještaj treba uzeti s

rezervom i koristiti samo kao smjernica na samom početku analize

22 Pronalaženje jedinstvenog ključa

Jedinstveni ključ (engl hash) služi za jedinstveno identificiranje podataka Dobiva

se primjenom nekog od algoritama za računanje jedinstvenog ključa od kojih su

najpoznatiji MD5 (engl Message Digest) SHA1 SHA125 i SHA256 (engl Secure

Hash Algorithm) Funkcija prima niz proizvoljne duljine i vraća niz fiksne duljine a

neke od njezinih ključnih svojstava su

za istu datoteku svaki put će generirati isti jedinstveni ključ

za dvije različite datoteke nikada se neće generirati isti jedinstveni ključ

na osnovu izlaza nije moguće regenerirati ulaznu poruku

za bilo kakav ulaz može se brzo izračunati

Duljina se razlikuje ovisno o primijenjenom algoritmu a što je ona veća to je veća i

razina pouzdanosti Algoritam MD5 probijen je već odavno i stoga se više ne

smatra sigurnim U velječi 2017 otkrivena je prva javna kolizija za SHA1 tako da

se niti on u budućnosti više neće smatrati sigurnim [10]

4

Jedinstveni ključ može se iskoristiti za pronalaženje dodatnih informacija o

zlonamjernom programu kao što su na primjer službena izvješća antivirusnih

kompanija (engl whitepaper) Neki programi za arhiviranje kao što je 7-ZIP nude

mogućnost računanja jedinstvenog ključa kao što je vidljivo na slici 22

Slika 22 ndash Jedinstveni ključevi generirani pomoću programa 7-ZIP

23 Pronalaženje znakovnih nizova

Znakovni nizovi mogu sadržavati informacije o korištenim sučeljima porukama

korisniku koje program može ispisati lokacijama na disku kojima program

pristupa IP adresama ukoliko se radi o programu koji se spaja na Internet i slično

Alat Strings pokreće se iz komandne linije i pretražuje sve ASCII i UNICODE

znakovne nizove dulje od tri znaka Prilikom pretrage znakovnih nizova Strings

ignorira kontekst i formatiranje tako da može analizirati bilo koji tip datoteke i

pretražiti datoteku u cijelosti Posljedica ovog pristupa su tzv bdquolažni znakovni

nizovildquo To su nizovi od tri znaka koji ne predstavljaju ništa smisleno i zapravo su

instrukcije procesora memorijske adrese ili neki interni podaci koje koristi program

[1] Razliku između pravih i bdquolažnihldquo znakovnih nizova korisnik mora uočiti sam

Primjerice ako se CodeBlocksexe datoteka popularnog razvojnog okruženja

CodeBlocks analizira programom Strings dio ispisa koji sadrži takve znakovne

nizove vidljiv je na slici 23 i označen je crveno

24 Metode obfuskacije i pakiranja

Metode pakiranja i obfuskacije služe za otežavanje analize i izbjegavanje provjera

od strane sigurnosnih sustava Obfuskacija je postupak skrivanja pravog značenja

informacije Obfuskacijom se nastoji sakriti dijelove programskog koda Pakiranje

je podskup obfuskacije i obuhvaća metode kompresije kojima se zlonamjerni

program nastoji prikazati manjim nego što stvarno jest

5

Slika 23 ndash Dio rezultata analize programom Strings

241 Postupak kriptiranja

Prvi korak kojim se nastoji zaobići provjera antivirusnim programima jest korištenje

kriptiranja zbog toga što antivirusni programi imaju bazu otisaka (engl signatures)

koji opisuju karakteristične značajke zlonamjernog ponašanja Zlonamjerni

program sadrži dekripcijski dio koji prilikom svakog pokretanja dekriptira kod

zlonamjernog programa Prilikom svake infekcije koristi se drugačiji slučajno

generirani ključ kriptiranja tako da je kriptirani dio zlonamjernog programa svaki

put drugačiji Prvi zlonamjerni program koji je koristio postupak kriptiranja bio je

virus Cascade iz 1986 godine i radilo se o jednostavnoj XOR funkciji koja je kao

ključ koristila veličinu zaražene datoteke [2] U ono vrijeme to je bilo dovoljno jer

su antivirusni programi bili još jako nerazvijeni i koristili su samo jednostavno

uspoređivanje otisaka koje je davalo mnoge lažne detekcije XOR funkcija također

je bila pogodna autorima zlonamjernog programa jer se zbog svoje jednostavnosti

mogla koristiti i za kriptiranje i za dekriptiranje Glavni nedostatak ovog pristupa

bila je dekripcijska rutina koja je uvijek bila ista iz generacije u generaciju te je to

kasnije omogućilo lakšu detekciju kada su antivirusni programi napredovali

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 6: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

2

2 Jednostavna statička analiza

Prvi korak prilikom analize zlonamjernog programa jest jednostavna statička

analiza kojom se mogu dobiti osnovne informacije o zlonamjernom programu koji

se analizira poput

formata datoteke

anomalija koje upućuju na zlonamjerno ponašanje

metoda obfuskacije

jedinstvenog ključa

reputacije

Prilikom statičke analize zlonamjerni program se ne pokreće nego se nastoji dobiti

općenita bdquogrubaldquo slika o njegovom izgledu i mogućnostima Informacije prikupljene

statičkom analizom mogu se ponekad iskoristiti za izradu jednostavnih otisaka

(engl signatures) koje koriste antivirusni programi Izrada otisaka koji će biti

korišteni u statičkoj analizi antivirusnog programa moguća je samo ako

zlonamjerni program nije pakiran ili kompresiran jer su u tom slučaju dijelovi

zlonamjernog programa kriptirani te stoga neupotrebljivi za otisak

21 Provjera antivirusnim programima

Zlonamjerni program je na samom početku analize datoteka u nepoznatom

formatu bez ekstenzije o kojoj se ništa ne zna te je stoga korisno saznati kakvu

reputaciju taj zlonamjerni program ima Informacije o tome nude internetske

stranice koje nude mogućnost predaje datoteke na analizu antivirusnim

programima Virustotal Metadefender Jotti Malwr i VirScan su neke od tih

stranica Datoteka koja se analizira skenira se pomoću 60-ak antivirusnih

programa te se generira izvještaj koji sadrži broj antivirusnih programa koji su

datoteku okarakterizirali kao zlonamjernu (engl detection ratio) reputaciju

temeljenu na dojavama drugih korisnika jedinstveni ključ izračunat pomoću

nekoliko najčešće korištenih algoritama alternativna imena po kojima je datoteka

sa istim jedinstvenim ključem uočena i slično Primjer dijela jednog takvog

izvještaja vidljiv je na slici 21

Automatska analiza ima svoja ograničenja koja se očituju u pojavi lažnih pozitivnih

(engl false positive) i lažnih negativnih detekcija (engl false negative) Lažna

pozitivna detekcija odnosi se na automatsku analizu koja je neku datoteku

proglasila zlonamjernom premda ona to zapravo nije Razlozi za to mogu biti

raznoliki datoteka je bila oštećena prilikom preuzimanja s Interneta korištena je

neka neobična metoda kompresije neki sumnjivi internetski protokol i slično

3

Slika 21 ndash Dio izvještaja nakon provjere antivirusnim programima

Suprotno tome kod lažne negativne detekcije zlonamjerna datoteka bila je

okarakterizirana kao legitimna Ovaj slučaj je čest ako se radi o polimorfnom

zlonamjernom programu koji može mijenjati svoj kod u trenutku izvođenja kako bi

zaobišao heurističke provjere koje detektiraju zlonamjerno ponašanje Osim toga

zlonamjerni program može biti i potpuno nov te stoga o njemu nema podataka u

bazama antivirusnih programa Iz navedenih razloga se ovaj izvještaj treba uzeti s

rezervom i koristiti samo kao smjernica na samom početku analize

22 Pronalaženje jedinstvenog ključa

Jedinstveni ključ (engl hash) služi za jedinstveno identificiranje podataka Dobiva

se primjenom nekog od algoritama za računanje jedinstvenog ključa od kojih su

najpoznatiji MD5 (engl Message Digest) SHA1 SHA125 i SHA256 (engl Secure

Hash Algorithm) Funkcija prima niz proizvoljne duljine i vraća niz fiksne duljine a

neke od njezinih ključnih svojstava su

za istu datoteku svaki put će generirati isti jedinstveni ključ

za dvije različite datoteke nikada se neće generirati isti jedinstveni ključ

na osnovu izlaza nije moguće regenerirati ulaznu poruku

za bilo kakav ulaz može se brzo izračunati

Duljina se razlikuje ovisno o primijenjenom algoritmu a što je ona veća to je veća i

razina pouzdanosti Algoritam MD5 probijen je već odavno i stoga se više ne

smatra sigurnim U velječi 2017 otkrivena je prva javna kolizija za SHA1 tako da

se niti on u budućnosti više neće smatrati sigurnim [10]

4

Jedinstveni ključ može se iskoristiti za pronalaženje dodatnih informacija o

zlonamjernom programu kao što su na primjer službena izvješća antivirusnih

kompanija (engl whitepaper) Neki programi za arhiviranje kao što je 7-ZIP nude

mogućnost računanja jedinstvenog ključa kao što je vidljivo na slici 22

Slika 22 ndash Jedinstveni ključevi generirani pomoću programa 7-ZIP

23 Pronalaženje znakovnih nizova

Znakovni nizovi mogu sadržavati informacije o korištenim sučeljima porukama

korisniku koje program može ispisati lokacijama na disku kojima program

pristupa IP adresama ukoliko se radi o programu koji se spaja na Internet i slično

Alat Strings pokreće se iz komandne linije i pretražuje sve ASCII i UNICODE

znakovne nizove dulje od tri znaka Prilikom pretrage znakovnih nizova Strings

ignorira kontekst i formatiranje tako da može analizirati bilo koji tip datoteke i

pretražiti datoteku u cijelosti Posljedica ovog pristupa su tzv bdquolažni znakovni

nizovildquo To su nizovi od tri znaka koji ne predstavljaju ništa smisleno i zapravo su

instrukcije procesora memorijske adrese ili neki interni podaci koje koristi program

[1] Razliku između pravih i bdquolažnihldquo znakovnih nizova korisnik mora uočiti sam

Primjerice ako se CodeBlocksexe datoteka popularnog razvojnog okruženja

CodeBlocks analizira programom Strings dio ispisa koji sadrži takve znakovne

nizove vidljiv je na slici 23 i označen je crveno

24 Metode obfuskacije i pakiranja

Metode pakiranja i obfuskacije služe za otežavanje analize i izbjegavanje provjera

od strane sigurnosnih sustava Obfuskacija je postupak skrivanja pravog značenja

informacije Obfuskacijom se nastoji sakriti dijelove programskog koda Pakiranje

je podskup obfuskacije i obuhvaća metode kompresije kojima se zlonamjerni

program nastoji prikazati manjim nego što stvarno jest

5

Slika 23 ndash Dio rezultata analize programom Strings

241 Postupak kriptiranja

Prvi korak kojim se nastoji zaobići provjera antivirusnim programima jest korištenje

kriptiranja zbog toga što antivirusni programi imaju bazu otisaka (engl signatures)

koji opisuju karakteristične značajke zlonamjernog ponašanja Zlonamjerni

program sadrži dekripcijski dio koji prilikom svakog pokretanja dekriptira kod

zlonamjernog programa Prilikom svake infekcije koristi se drugačiji slučajno

generirani ključ kriptiranja tako da je kriptirani dio zlonamjernog programa svaki

put drugačiji Prvi zlonamjerni program koji je koristio postupak kriptiranja bio je

virus Cascade iz 1986 godine i radilo se o jednostavnoj XOR funkciji koja je kao

ključ koristila veličinu zaražene datoteke [2] U ono vrijeme to je bilo dovoljno jer

su antivirusni programi bili još jako nerazvijeni i koristili su samo jednostavno

uspoređivanje otisaka koje je davalo mnoge lažne detekcije XOR funkcija također

je bila pogodna autorima zlonamjernog programa jer se zbog svoje jednostavnosti

mogla koristiti i za kriptiranje i za dekriptiranje Glavni nedostatak ovog pristupa

bila je dekripcijska rutina koja je uvijek bila ista iz generacije u generaciju te je to

kasnije omogućilo lakšu detekciju kada su antivirusni programi napredovali

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 7: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

3

Slika 21 ndash Dio izvještaja nakon provjere antivirusnim programima

Suprotno tome kod lažne negativne detekcije zlonamjerna datoteka bila je

okarakterizirana kao legitimna Ovaj slučaj je čest ako se radi o polimorfnom

zlonamjernom programu koji može mijenjati svoj kod u trenutku izvođenja kako bi

zaobišao heurističke provjere koje detektiraju zlonamjerno ponašanje Osim toga

zlonamjerni program može biti i potpuno nov te stoga o njemu nema podataka u

bazama antivirusnih programa Iz navedenih razloga se ovaj izvještaj treba uzeti s

rezervom i koristiti samo kao smjernica na samom početku analize

22 Pronalaženje jedinstvenog ključa

Jedinstveni ključ (engl hash) služi za jedinstveno identificiranje podataka Dobiva

se primjenom nekog od algoritama za računanje jedinstvenog ključa od kojih su

najpoznatiji MD5 (engl Message Digest) SHA1 SHA125 i SHA256 (engl Secure

Hash Algorithm) Funkcija prima niz proizvoljne duljine i vraća niz fiksne duljine a

neke od njezinih ključnih svojstava su

za istu datoteku svaki put će generirati isti jedinstveni ključ

za dvije različite datoteke nikada se neće generirati isti jedinstveni ključ

na osnovu izlaza nije moguće regenerirati ulaznu poruku

za bilo kakav ulaz može se brzo izračunati

Duljina se razlikuje ovisno o primijenjenom algoritmu a što je ona veća to je veća i

razina pouzdanosti Algoritam MD5 probijen je već odavno i stoga se više ne

smatra sigurnim U velječi 2017 otkrivena je prva javna kolizija za SHA1 tako da

se niti on u budućnosti više neće smatrati sigurnim [10]

4

Jedinstveni ključ može se iskoristiti za pronalaženje dodatnih informacija o

zlonamjernom programu kao što su na primjer službena izvješća antivirusnih

kompanija (engl whitepaper) Neki programi za arhiviranje kao što je 7-ZIP nude

mogućnost računanja jedinstvenog ključa kao što je vidljivo na slici 22

Slika 22 ndash Jedinstveni ključevi generirani pomoću programa 7-ZIP

23 Pronalaženje znakovnih nizova

Znakovni nizovi mogu sadržavati informacije o korištenim sučeljima porukama

korisniku koje program može ispisati lokacijama na disku kojima program

pristupa IP adresama ukoliko se radi o programu koji se spaja na Internet i slično

Alat Strings pokreće se iz komandne linije i pretražuje sve ASCII i UNICODE

znakovne nizove dulje od tri znaka Prilikom pretrage znakovnih nizova Strings

ignorira kontekst i formatiranje tako da može analizirati bilo koji tip datoteke i

pretražiti datoteku u cijelosti Posljedica ovog pristupa su tzv bdquolažni znakovni

nizovildquo To su nizovi od tri znaka koji ne predstavljaju ništa smisleno i zapravo su

instrukcije procesora memorijske adrese ili neki interni podaci koje koristi program

[1] Razliku između pravih i bdquolažnihldquo znakovnih nizova korisnik mora uočiti sam

Primjerice ako se CodeBlocksexe datoteka popularnog razvojnog okruženja

CodeBlocks analizira programom Strings dio ispisa koji sadrži takve znakovne

nizove vidljiv je na slici 23 i označen je crveno

24 Metode obfuskacije i pakiranja

Metode pakiranja i obfuskacije služe za otežavanje analize i izbjegavanje provjera

od strane sigurnosnih sustava Obfuskacija je postupak skrivanja pravog značenja

informacije Obfuskacijom se nastoji sakriti dijelove programskog koda Pakiranje

je podskup obfuskacije i obuhvaća metode kompresije kojima se zlonamjerni

program nastoji prikazati manjim nego što stvarno jest

5

Slika 23 ndash Dio rezultata analize programom Strings

241 Postupak kriptiranja

Prvi korak kojim se nastoji zaobići provjera antivirusnim programima jest korištenje

kriptiranja zbog toga što antivirusni programi imaju bazu otisaka (engl signatures)

koji opisuju karakteristične značajke zlonamjernog ponašanja Zlonamjerni

program sadrži dekripcijski dio koji prilikom svakog pokretanja dekriptira kod

zlonamjernog programa Prilikom svake infekcije koristi se drugačiji slučajno

generirani ključ kriptiranja tako da je kriptirani dio zlonamjernog programa svaki

put drugačiji Prvi zlonamjerni program koji je koristio postupak kriptiranja bio je

virus Cascade iz 1986 godine i radilo se o jednostavnoj XOR funkciji koja je kao

ključ koristila veličinu zaražene datoteke [2] U ono vrijeme to je bilo dovoljno jer

su antivirusni programi bili još jako nerazvijeni i koristili su samo jednostavno

uspoređivanje otisaka koje je davalo mnoge lažne detekcije XOR funkcija također

je bila pogodna autorima zlonamjernog programa jer se zbog svoje jednostavnosti

mogla koristiti i za kriptiranje i za dekriptiranje Glavni nedostatak ovog pristupa

bila je dekripcijska rutina koja je uvijek bila ista iz generacije u generaciju te je to

kasnije omogućilo lakšu detekciju kada su antivirusni programi napredovali

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 8: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

4

Jedinstveni ključ može se iskoristiti za pronalaženje dodatnih informacija o

zlonamjernom programu kao što su na primjer službena izvješća antivirusnih

kompanija (engl whitepaper) Neki programi za arhiviranje kao što je 7-ZIP nude

mogućnost računanja jedinstvenog ključa kao što je vidljivo na slici 22

Slika 22 ndash Jedinstveni ključevi generirani pomoću programa 7-ZIP

23 Pronalaženje znakovnih nizova

Znakovni nizovi mogu sadržavati informacije o korištenim sučeljima porukama

korisniku koje program može ispisati lokacijama na disku kojima program

pristupa IP adresama ukoliko se radi o programu koji se spaja na Internet i slično

Alat Strings pokreće se iz komandne linije i pretražuje sve ASCII i UNICODE

znakovne nizove dulje od tri znaka Prilikom pretrage znakovnih nizova Strings

ignorira kontekst i formatiranje tako da može analizirati bilo koji tip datoteke i

pretražiti datoteku u cijelosti Posljedica ovog pristupa su tzv bdquolažni znakovni

nizovildquo To su nizovi od tri znaka koji ne predstavljaju ništa smisleno i zapravo su

instrukcije procesora memorijske adrese ili neki interni podaci koje koristi program

[1] Razliku između pravih i bdquolažnihldquo znakovnih nizova korisnik mora uočiti sam

Primjerice ako se CodeBlocksexe datoteka popularnog razvojnog okruženja

CodeBlocks analizira programom Strings dio ispisa koji sadrži takve znakovne

nizove vidljiv je na slici 23 i označen je crveno

24 Metode obfuskacije i pakiranja

Metode pakiranja i obfuskacije služe za otežavanje analize i izbjegavanje provjera

od strane sigurnosnih sustava Obfuskacija je postupak skrivanja pravog značenja

informacije Obfuskacijom se nastoji sakriti dijelove programskog koda Pakiranje

je podskup obfuskacije i obuhvaća metode kompresije kojima se zlonamjerni

program nastoji prikazati manjim nego što stvarno jest

5

Slika 23 ndash Dio rezultata analize programom Strings

241 Postupak kriptiranja

Prvi korak kojim se nastoji zaobići provjera antivirusnim programima jest korištenje

kriptiranja zbog toga što antivirusni programi imaju bazu otisaka (engl signatures)

koji opisuju karakteristične značajke zlonamjernog ponašanja Zlonamjerni

program sadrži dekripcijski dio koji prilikom svakog pokretanja dekriptira kod

zlonamjernog programa Prilikom svake infekcije koristi se drugačiji slučajno

generirani ključ kriptiranja tako da je kriptirani dio zlonamjernog programa svaki

put drugačiji Prvi zlonamjerni program koji je koristio postupak kriptiranja bio je

virus Cascade iz 1986 godine i radilo se o jednostavnoj XOR funkciji koja je kao

ključ koristila veličinu zaražene datoteke [2] U ono vrijeme to je bilo dovoljno jer

su antivirusni programi bili još jako nerazvijeni i koristili su samo jednostavno

uspoređivanje otisaka koje je davalo mnoge lažne detekcije XOR funkcija također

je bila pogodna autorima zlonamjernog programa jer se zbog svoje jednostavnosti

mogla koristiti i za kriptiranje i za dekriptiranje Glavni nedostatak ovog pristupa

bila je dekripcijska rutina koja je uvijek bila ista iz generacije u generaciju te je to

kasnije omogućilo lakšu detekciju kada su antivirusni programi napredovali

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 9: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

5

Slika 23 ndash Dio rezultata analize programom Strings

241 Postupak kriptiranja

Prvi korak kojim se nastoji zaobići provjera antivirusnim programima jest korištenje

kriptiranja zbog toga što antivirusni programi imaju bazu otisaka (engl signatures)

koji opisuju karakteristične značajke zlonamjernog ponašanja Zlonamjerni

program sadrži dekripcijski dio koji prilikom svakog pokretanja dekriptira kod

zlonamjernog programa Prilikom svake infekcije koristi se drugačiji slučajno

generirani ključ kriptiranja tako da je kriptirani dio zlonamjernog programa svaki

put drugačiji Prvi zlonamjerni program koji je koristio postupak kriptiranja bio je

virus Cascade iz 1986 godine i radilo se o jednostavnoj XOR funkciji koja je kao

ključ koristila veličinu zaražene datoteke [2] U ono vrijeme to je bilo dovoljno jer

su antivirusni programi bili još jako nerazvijeni i koristili su samo jednostavno

uspoređivanje otisaka koje je davalo mnoge lažne detekcije XOR funkcija također

je bila pogodna autorima zlonamjernog programa jer se zbog svoje jednostavnosti

mogla koristiti i za kriptiranje i za dekriptiranje Glavni nedostatak ovog pristupa

bila je dekripcijska rutina koja je uvijek bila ista iz generacije u generaciju te je to

kasnije omogućilo lakšu detekciju kada su antivirusni programi napredovali

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 10: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

6

242 Oligomofrizam i polimorfizam

Oligomorfizam je postojanje neke informacije u više oblika Rješava problem iste

dekripcijske rutine predstavljen u prethodnom odjeljku Dekripcijska rutina mutira iz

generacije u generaciju Zlonamjerni program sadrži stotine različitih dekripcijskih

rutina od kojih nasumično odabire jednu prilikom svake nove infekcije Unatoč

većoj kompleksnosti još uvijek je bilo moguće napraviti otiske za svaku od

dekripcijskih rutina Dekripcijske rutine potom su se počele stvarati dinamički čime

je problem stvaranja otisaka otišao još korak dalje i time se dolazi do polimorfizma

[2] Polimorfizam također opisuje informaciju u više oblika Razlika između

oligomorfnih i polimorfnih zlonamjernih programa je u tome što oligomorfni

zlonamjerni programi imaju više unaprijed definiranih oblika Dekripcijska rutina

sada se mogla radikalno mijenjati od infekcije do infekcije i ukoliko je dobro

implementirana od generacije do generacije te je zato bilo teško pronaći ikakvu

konzistentnost Početkom 90-ih pojavio se i prvi alat za postizanje polimorfizma

pod nazivom DAME (engl Dark Avenger Mutation Engine) kojeg je stvorio autor

zlonamjernog programa Dark Avenger [2] Alat je omogućavao pretvaranje koda

zlonamjernog programa u polimorfni kod a ulazni parametri koje je primao bili su

segment koda zlonamjernog programa

pokazivač na dio koda koji treba kriptirati

duljina infekcije virusa (engl infection length)

baza dekripcijske rutine

adresa polazišne točke (engl entry point) zaraženog sustava

lokacija kriptiranog koda

veličina dekripcijske rutine

polje bajtova neiskorištenih registara [11]

Antivirusni sustavi više nisu mogli koristiti metodu otisaka kako bi se borili protiv

ove tehnike te je stoga razvijena metoda emulacije prilikom koje se zlonamjerni

program izvodi u izoliranoj okolini (engl sandbox) bez ikakve štete za zaraženi

sustav [2] Nakon što se u izoliranoj okolini izvede dekripcijska rutina i kod

zlonamjernog programa bude učitan u memoriju moguće je primijeniti tehnike

detekcije korištenjem otisaka

Odgovor zlonamjernih programa na izvođenje u izoliranoj okolini bio je

implementacija novih metoda zaštite (engl armoring) Neke od najčešćih su

korištenje bdquobeskrajnih petljildquo korištenje operacija s decimalnim brojevima te

korištenje manje poznatih procesorskih tehnika [2]

243 Metamorfizam

Još jedan korak dalje jest korištenje metamorfizma koji objedinjuje prethodno

opisane metode obfuskacije kako bi se zlonamjerni program mijenjao izgledom u

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 11: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

7

svakoj novoj generaciji zadržavajući istu funkcionalnost [3] Metamorfizam je

stvaranje više inačica istog koda koje su logički jednake Zlonamjerni program

može samog sebe bdquoreprogramiratildquo Neke od najčešće korištenih metoda

obfuskacije karakteristične za polimorfne i metamorfne zlonamjerne programe

opisane su u narednim odjeljcima

2431 Umetanje bdquomrtvogldquo koda

Ova tehnika sastoji se od dodavanja nepotrebnih instrukcija koje ne služe ničemu i

nemaju nikakvog utjecaja na ostatak koda zlonamjernog programa niti na njegovo

ponašanje Primjerice može se ubacivati NOP instrukcija na nasumičnim mjestima

u kodu Protiv ove tehnike antivirusni programi bore se uklanjanjem nepotrebnih

instrukcija prije početka analize

2432 Ponovno dodjeljivanje registara

Karakteristika ove tehnike je zamjena korištenih registara iz generacije u

generaciju dok programski kod i ponašanje zlonamjernog programa ostaju

nepromijenjeni

2433 Promjena redoslijeda subrutina

Ova metoda obfuskacije mijenja redosljed subrutina na slučajan način Ovisno o

tome koliko ima subrutina toliko se inačica koda sa različitim kombinacijama

subrutina može generirati Ako je broj subrutina jednak n tada je broj kombinacija

jednak n

2434 Zamjena instrukcija

Ova metoda zamjenjuje pojedine instrukcije instrukcijama koje su logički jednake

Binarni kod izgleda drugačije ali obavlja iste zadaće Primjerice instrukcija XOR

može se zamijeniti instrukcijom SUB dok se instrukcija MOV može zamijeniti

instrukcijom PUSH ili POP

2435 Integracija koda

U ovom slučaju kod zlonamjernog programa integrira se s kodom zaraženog

programa Zaraženi program prvo prolazi postupak prevođenja na viši programski

jezik (engl decompilation) Zaraženi program se tim postupkom razdvaja u manje

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 12: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

8

smislene objekte te se kod zlonamjernog programa umeće između njih Ovako

promijenjeni kod ponovno prolazi proces prevođenja te tako nastaje nova

generacija zlonamjernog programa Od svih metoda obfuskacije ova spada u one

koje je najteže otkriti

244 Pakiranje

Pakirani programi podskup su obfusciranih programa Zlonamjerni program

podvrgava se postupku kompresije što otežava statičku analizu jer se program

mora prvo raspakirati Uz to se mogu implementirati i neke dodatne metode za

otežavanje analize kao što su metode protiv

virtualnih strojeva (engl anti-virtual machine)

ispravljanja pogrešaka prilikom izvođenja (engl anti-debugging)

prevođenja strojnog koda na viši programski jezik (engl anti-disassembly)

Još jedna svrha pakiranja jest i smanjivanje veličine programa Neki legitimni

programi također koriste pakiranje upravo iz ovog razloga Prije pojave brze

internetske veze manji programi lakše su se prenosili preko mreže i zauzimali su

manje diskovnog prostora

2441 Obilježja pakiranih programa

Najbolji pokazatelj pakiranja jest mala količina znakovnih nizova Programi koji

nisu pakirani obično sadrže mnogo znakovnih nizova dok ih se kod pakiranih

može naći svega nekoliko od čega će ih velik dio biti bdquolažnihldquo Sljedeći pokazatelj je

mala količina uvezenih funkcija (engl imported functions) Među malobrojnim

funkcijama koje se mogu naći u pakiranom programu često će biti LoadLibrary i

GetProcAddress jer će one biti korištene za kasnije učitavanje dodatnih funkcija

kad se program bude raspakiravao [1]

Alatima za pregledavanja formata PE datoteke kao što je PEview mogu se uočiti

imena sekcija koja su drugačija od standardnih Primjerice ako je program pakiran

poznatim programom za pakiranje UPX (engl Universal Packer for eXecutables)

tada će sekcije PE datoteke imati imena poput UPX0 UPX1 UPX2 i slično

Ukoliko je korišten neki drugi program za pakiranje imena pojedinih sekcija

pakiranog programa bit će drugačija Daljnjim proučavanjem formata PE datoteke

moguće je uočiti još neke anomalije kao što je abnormalna veličina pojedinih

sekcija Sekcije će u tom slučaju imati virtualnu veličinu različitu od nule dok će za

veličinu bdquosirovihldquo podataka pisati nula [1]

Povećana razina entropije još je jedan pokazatelj pakiranja Podaci koji su

kriptirani ili kompresirani više nalikuju slučajnim podacima te stoga imaju veću

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 13: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

9

razinu entropije Alatom PEiD može se odrediti razina entropije za cijeli program i

za njegove pojedine sekcije (s obzirom da su ponekad samo određene sekcije

pakirane) Ukoliko se radi o nekom poznatom programu za pakiranje kao što je

UPX PEiD može odrediti i kojim programom za pakiranje je program pakiran

Pregled poznatijih i češće korištenih programa za pakiranje vidljiv je u tablici 21

Prilikom pokretanja pakiranog programa pokreće se mali program omotač (engl

wrapper program) koji obavlja dekompresiju i pokretanje pakiranog dijela

programa [1] Shema pakiranja prikazana je na slici 24

Slika 24 ndash Shema pakiranja

Tablica 21 ndash Često korišteni programi za pakiranje

UPX

Jedan od najpoznatijih i najčešće korištenih programa za pakiranje ne

samo od strane zlonamjernih nego i od strane legitimnih programa Nije

teško raspakirati programe pakirane njime jer je dizajniran s ciljem

postizanja veće brzine i jednostavnosti a ne sigurnosti Programe koji su

pakirani njime moguće je njime isto tako i raspakirati ali samo u

slučajevima kada je korištena izvorna inačica progama UPX a ne

modificirana

ASPack

Usredotočen je na sigurnost te koristi kod koji se sam mijenja (engl self-

modifying code) što otežava postavljanje prekidnih točaka prilikom

analize Preporuča se korištenje sklopovskih prekidnih točaka (engl

hardware breakpoints) na stogovske adrese

PECompact

Bio je korišten u komercijalne svrhe ali se prestao proizvoditi Besplatnu

inačicu još uvijek koriste autori zlonamjernih programa Raspakiravanje

je otežano iznimkama koje se koriste kao metoda protiv programa za

ispravljanje pogrešaka te obfuskacijom Posjeduje radni okvir koji

omogućava uključivanje dodataka čime se proces pakiranja dodatno

komplicira

Petite

Posjeduje neke sličnosti sa programom ASPack Koristi mehanizme

protiv programa za ispravljanje pogrešaka kao što su iznimke nakon

svakog koraka izvođenja (engl single-step exceptions) te se također

preporuča korištenje sklopovskih prekidnih točaka U izvornoj tablici

uvezenih funkcija zadržava se po jedna funkcija iz svake kodne

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 14: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

10

biblioteke pa se prema tome mogu odrediti sve korištene dinamičke

biblioteke i bez raspakiravanja

Themida

Sadrži složene mehanizme za otežavanje analize poput detekcije

virtualnih strojeva programa za ispravljanje pogrešaka te nekih alata za

dinamičku analizu kao što je Process Monitor Također ima opciju

korištenja jezgrenog načina rada operacijskog sustava Iznimka kod

ovog programa za pakiranje jest što se izvodi cijelo vrijeme dok se izvodi

i izvorni kod programa za razliku od ostalih programa za pakiranje čije

izvođenje završava kad se dovrši proces raspakiravanja

2442 Postupci raspakiravanja

Programe koji nisu pakirani u memoriju učitava operacijski sustav Pakirani

programi imaju spojni modul za raspakiravanje (engl unpacking stub) kojega

učitava operacijski sustav i koji nakon toga učitava pakirani program [1] Polazišna

točka (engl entry point) zbog toga pokazuje na spojni modul umjesto na početak

text sekcije kako je prikazano na slici 25 Spojni modul raspakiravanje provodi u

tri koraka

izvorni kod programa raspakirava se u memoriju

popravlja se tablica uvezenih funkcija

izvođenje programa prenosi se na izvornu polazišnu točku (engl Original

Entry Point OEP)

Slika 25 ndash Polazišna točka kod pakiranih programa

Spojni modul alocira dijelove memorije u koje će se raspakirati pojedine sekcije

programa [1] Kod za svaku sekciju raspakirava se zasebno i kopira u alocirani

prostor Metode raspakiravanja razlikuju se između različitih programa za

pakiranje i informacije o njima također su sadržane u spojnom modulu

Potrebno je pohraniti informacije o uključenim funkcijama (engl import

information) kako bi se zadržala izvorna funkcionalnost programa Prilikom

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 15: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

11

raspakiravanja potrebno je rekonstruirati tablicu uključenih funkcija (engl import

table)

Najčešći pristup je u spojni modul uključiti samo funkcije LoadLibrary i

GetProcAddress Nakon raspakiravanja izvornog koda u memoriju čita se

izvorna tablica uvezenih funkcija Za svaku biblioteku poziva se funkcija

LoadLibrary kako bi se dinamičke biblioteke (engl Dynamic Linked Library

DLL) učitale u memoriju i potom se dohvaća adresa svake funkcije pomoću

GetProcAddress [1]

Drugi mogući pristup je zadržati tablicu uvezenih funkcija u izvornom obliku te

prepustiti učitavanje dinamičkih biblioteka operacijskom sustavu Ovaj pristup je

jednostavniji s obzirom da spojni modul ne mora razrješavati uključivanje funkcija

ali je lakši za otkriti jer će se sve funkcije moći otkriti statičkom analizom

Treći pristup sličan je prethodnom ali sadrži nešto veću razinu prikrivanja Iz

svake dinamičke biblioteke u tablici uvezenih funkcija zadržava se samo jedna

funkcija Statička analiza još uvijek može otkriti koje su to funkcije Ovaj pristup

jednostavniji je za implementirati nego pristup gdje se uključuju samo

LoadLibrary i GetProcAddress ali spojni modul još uvijek mora razrješavati

velik dio uvezenih funkcija

Četvrti i posljednji pristup jest ne uključiti apsolutno nikakve funkcije pa čak ni

LoadLibrary i GetProcAddress Spojni modul ih mora uključiti sam ili pronaći

potrebne funkcije iz drugih dinamičkih biblioteka Prednost ovog pristupa jest

otkrivanje jako malog broja informacija dok je glavni nedostatak složenost koju

spojni modul mora posjedovati ukoliko se ovaj pristup želi primjenjivati

Nakon što spojni modul raspakira izvorni kod zlonamjernog programa u memoriju

potrebno je premjestiti polazišnu točku programa na njezino izvorno mjesto (engl

tail jump) kao što prikazuje slika 26 Za tu svrhu često se koristi instrukcija JUMP

pa od toga dolazi engleski naziv Upotreba JUMP instrukcije u ovom postupku je

toliko česta da se ponekad pokušava prikriti korištenjem instrukcija CALL ili RET

Slika 26 ndash Premještanje polazišne točke na njeno izvorno mjesto

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 16: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

12

Automatsko raspakiravanje obavlja postupak suprotan pakiranju Program se

dekriptira dekompresira i vraća u izvorno stanje Program dobiven na ovaj način

nikada neće izgledati potpuno isto kao prije pakiranja jer će ponekad još uvijek biti

vidljivi nazivi sekcija koje je imao pakirani program Također spojni modul još

uvijek će biti prisutan samo što sada više neće imati nikakav utjecaj na rad

programa Postupak automatskog raspakiravanja razlikuje se ovisno o programu

za pakiranje i neće ga se moći primijeniti ukoliko se radi o programu za pakiranje

pisanom isključivo za određeni zlonamjerni program (engl custom packers) ili ako

je korišten program za pakiranje s metodama za otežavanje analize

Ukoliko se automatsko raspakiravanje pokaže neizvedivim postupak

raspakiravanja potrebno je obaviti ručno Za to su potrebna znanja napredne

statičke analize koja obuhvaćaju korištenje programa za ispravljanje pogrešaka te

će stoga postupak ručnog raspakiravanja biti opisan u narednim poglavljima

25 Format datoteke PE

Windows programi koji sadrže ekstenziju exe (engl executable) imaju format PE

Zaglavlje datoteke PE sadrži sljedeće informacije

informacije o programskom kodu

tip aplikacije

funkcije biblioteka koje program koristi

potreban prostor na disku

informacije o svakoj korištenoj biblioteci i svakoj korištenoj funkciji

Najčešći dijelovi datoteke PE vidljivi su u tablici 22

Tablica 22 ndash Dijelovi datoteke u formatu PE

text Sadrži izvodivi kod programa i na njega pokazuje polazišna točka

programa (engl entry point)

rdata Sadrži informacije o uvezenim (engl import) i izvezenim (engl export)

funkcijama Slovo bdquorldquo označava da su ovi podaci namijenjeni samo za

čitanje

data Globalni podaci kojima je moguće pristupiti iz bilo kojeg dijela programa

idata Informacije o uvezenim funkcijama

edata Informacije o izvezenim funkcijama

pdata Informacije za upravljanje iznimkama Postoji samo kod 64-bitnih

programa

rsrc Resursi koji su potrebni programu koji se izvodi

reloc Informacije za premještanje datoteka iz biblioteka

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 17: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća

13

Kako je već navedeno u prethodnom poglavlju pregledom sekcija PE datoteke i

njihovog rasporeda može se uočiti ako je program pakiran Prema podatku o

virtualnoj veličini podataka (engl virtual size) može se vidjeti gdje će se alocirati

memorijski prostor u koji će se smjestiti text segment i raspakirati zlonamjerni

program [1] Daljnji pregled sekcija daje informacije o ikonama korištenim

izbornicima u različitim dijaloškim prozorima znakovnim nizovima informacije o

inačici programa i imenu izdavača programa Posljednja sekcija često zna

sadržavati certifikacijsku tablicu ukoliko program sadrži certifikat Neke od sekcija

mogu sadržavati ugrađene programe ili pogonske programe (engl driver) koji se

raspakiravaju prije pokretanja programa Ti dijelovi mogu se izdvojiti i zasebno

analizirati

26 Kodne biblioteke i vrste povezivanja

Kodne biblioteke (engl code libraries) sadrže funkcije koje se koriste prilikom

uvoza i izvoza i koristi ih velik dio programa Uključivanje u glavni program obavlja

se postupkom povezivanja (engl linking) te se tako funkcionalnost koju sadrži

funkcija iz određene kodne biblioteke ne mora uvijek iznova implementirati

Povezivanje može biti statičko (engl static linking) i dinamičko (engl dynamic

linking)

261 Statičko povezivanje

Statičko povezivanje je pristup koji češće koriste zlonamjerni programi nego

legitimni [1] Ovo je slučaj kod programa pisanih za operacijski sustav Windows

dok se kod programa pisanih za operacijske sustave UNIX i Linux statičko

povezivanje ipak može susresti malo češće Kod koji se nalazi u kodnoj biblioteci

kopira se u kod programa koji se mora izvesti te program tim postupkom postaje

veći Ovo znatno otežava analizu jer je nemoguće razlikovati kod izvodivog

programa od koda kopiranog iz kodne biblioteke Teže je prepoznati koje su sve

funkcije bile korištene Pakirani programi koriste ovu vrstu povezivanja jer se

povezivanje s kodnim bibliotekama obavlja samo kada je određena funkcija

potrebna Najčešće korištene funkcije su LoadLibrary GetProcAddress

LdrGetProcAddress i LdrLoadDll Zajedničko svojstvo ovih funkcija jest da

omogućavaju programu pristup bilo kojoj funkciji u bilo kojoj kodnoj biblioteci

operacijskog sustava

262 Dinamičko povezivanje

Najčešće korištena vrsta povezivanja jest dinamičko povezivanje Prilikom

učitavanja operacijski sustav traži kodne biblioteke koje su mu potrebne Funkcija

14

iz određene kodne biblioteke izvodi se unutar kodne biblioteke prilikom njenog

poziva a poziv se može obaviti prilikom učitavanja programa ili prilikom pokretanja

programa Kodne biblioteke koje su uključene u program na ovaj način nazivaju se

dinamičke biblioteke (engl Dynamic Link Library) Informacije o kodnim

bibliotekama koje će program koristiti nalaze se u zaglavlju datoteke PE Pregled

često korištenih dinamičkih biblioteka nalazi se u tablici 23

Tablica 23 ndash Često korištene kodne biblioteke

Advapi32dll Sadrži napredne elemente aplikacijskog programskog sučelja te

omogućava pristup jezgrenim komponentama kao što su registry i

Service Manager Authuidll Korisničko sučelje za autentifikaciju

Comctl32dll Poziva funkcije iz User32dll i Gdi32dll Služi za implementaciju

standardnih elemenata Windows korisničkog sučelja kao što su

dijaloški prozori statusne trake itd Comdlg32dll Služi za upravljanje dijaloškim prozorima

Crypt32dll Sadrži kriptografske funkcije

Kernel32dll Vrlo često korištena dinamička biblioteka koji sadrži funkcije za

manipulaciju memorijom podacima i računalnim resursima Gdi32dll Sadrži elemente za prikazivanje grafike

Ntdlldll

Ova dinamička biblioteka je sučelje prema jezgri operacijskog sustava

Izvodivi programi je nikada ne uključuju izravno nego neizravno preko

Kernel32dll Često je koriste zlonamjerni programi jer može

poslužiti za skrivanje funkcionalnosti ili manipuliranje procesima User32dll Sadrži elemente korisničkog sučelja kao što su gumbi statusne trake i

komponente za komunikaciju sa korisnikom Ole32dll Sadrži funckcije za povezivanje objekata

Rprcrt4dll Koristi se za povezivanje na Internet i mrežnu komunikaciju

Shell32dll Sadrži funkcije koje se koriste prilikom otvaranja datoteka i web

stranica Shlwapidll Sadrži funkcije za internetske adrese unos u registre i postavke boja

Shscrapdll

Ne koristi se više u operacijskim sustavima od Windows Vista nadalje

jer su je često koristili zlonamjerni programi Implementirala je podršku

za shs datoteke koje su mogle sadržavati izvodivi kod zlonamjernog

programa WSock32dll Dinamička biblioteka odgovorna za spajanje na mrežu i funkcionalnosti

vezane uz mrežu Ws2_32dll Ima istu funkcionalnost kao i WSock32dll

Wininetdll Sadrži napredne mrežne funkcije koje implementiraju protokole kao što

su HTTP FTP i NTP

15

263 Sučelja primjenskih programa

Sučelje programa (engl Application Programming Interface API) je niz funkcija

koje služe programima za komunikaciju sa operacijskim sustavom Za programe

koji rade na operacijskom sustavu Windows koristi se skup funkcija pod nazivom

Win32 API [9] Poznavanje ovih funkcija vrlo je važno za reverznog inženjera jer

unatoč korištenju sučelja više razine (engl high-level interface) njihova uporaba se

svodi na korištenje Win32 API Sučelja više razine su primjerice MFC (engl

Microsoft Foundation Classes) i NET razvojni okvir Glavni razlog njihove uporabe

jest njihovo lakše korištenje koje je puno bliže programeru (engl programmer-

friendly)

Jezgra Win32 API sadrži otprilike 2000 sučelja koja su podijeljena u tri kategorije

Jezgrena sučelja (engl Kernel API) ndash implementirana su dinamičkoj

biblioteci KERNEL32DLL i sadržavaju sve usluge koje nisu vezane uz

grafičko sučelje Usluge koje spadaju u ovu kategoriju su upravljanje

memorijom upravljanje objektima upravljanje procesima i dretvama unos i

ispis datoteke itd Jezgrena sučelja koriste se za rad sa jezgrenim

objektima kao što su datoteke i sinkronizacijski objekti

Grafička sučelja (engl GDI API) ndash implementirana su u dinamičkoj

biblioteci GDI32DLL i koriste se za implementaciju grafičkih elemenata

niže razine kao što su linija pravokutnik bitna mapa i slično

Korisnička sučelja (engl USER API) ndash implementirana su u dinamičkoj

biblioteci USER32DLL i koriste se za implementaciju grafičkih elemenata

više razine kao što su upravljanje prozorima izbornicima kontrolama

grafičkog sučelja i slično Svi grafički objekti crtaju se pomoću ovih sučelja

koja se oslanjaju na grafička sučelja opisana u prethodnom odlomku

27 Primjer jednostavne statičke analize

Za demonstraciju jednostavne statičke analize korišten je pojednostavljeni primjer

pakiranog zlonamjernog programa Lab01-02exe koji je dio praktičnih

laboratorijskih vježbi uz knjigu bdquoPractical Malware Analysisldquo [1]

Prilikom skeniranja programom PEiD može se vidjeti da je zlonamjerni program

pakiran programom za pakiranje UPX Rezultat skeniranja prikazan je na slici 27

Može se vidjeti inačica programa UPX nekoliko načina skeniranja te iznos

entropije Korišten je tako zvani bdquodubokildquo način skeniranja programa PEiD (engl

deep mode) kojim se mogu otkriti neke modificirane inačice programa za

pakiranje

16

Slika 27 ndash Rezultat skeniranja programom PEiD

Osim imena programa za pakiranje vidljiv je i visok iznos entropije Učitavanjem

programa u alat PEview mogu se vidjeti imena sekcija datoteke PE karakteristična

za ovaj program za pakiranje ndash UPX0 UPX1 i UPX2 Sekcije datoteke PE vidljive

su na slici 28

Slika 28 ndash Sekcije datoteke PE

Pregledom pojedinačnih sekcija mogu se uočiti anomalije između virtualne veličine

i veličine bdquosirovihldquo podataka koje su jako brojevno različite Nepravilnost se najbolje

vidi za sekciju UPX0 za koju je virtualna veličina navedena kao 4000 a veličina

bdquosirovihldquo podataka je navodno nula kao što se vidi na slici 29 Ovo je još jedan

pokazatelj pakiranja

17

Slika 29 ndash Nepodudarnosti u veličinama koje ukazuju na pakiranje

Programi pakirani osnovnom nemodificiranom inačicom programa za pakiranje

UPX mogu se njime i raspakirati Zlonamjerni program je tako uspješno raspakiran

što pokazuje slika 210 U komandnoj liniji UPX ispisuje još neke korisne

informacije kao što su veličina datoteke prije i poslije raspakiravanja te stupanj

kompresije

Slika 210 ndash Raspakiravanje pomoću UPX

Sada se već sigurno zna da je program pakiran i očekuje se da pregledom

znakovnih nizova pakiranog programa neće biti dostupno previše informacija

Pretpostavka se pokazala točnom jer pakirani program ima samo nekoliko

znakovnih nizova koji bi mogli biti od koristi Raspakiravanjem postaju vidljive neke

zanimljive funkcije

CreateServiceA ndash Zlonamjerni program stvara neku uslugu Znakovni

nizovi povezani sa ovom funkcijom su MalService i Malservice

InternetOpenA InternetOpenURL ndash zlonamjerni program se spaja na

Internet Daljnja potvrda toga jest i konkretan URL koji se može naći pri

samom dnu ispisa httpmalwareanalysisbookcom

Jednostavnom statičkom analizom utvrđeno je da je ovaj zlonamjerni program

spada u obitelj zlonamjernih programa koji se spajaju na Internet i moguće

18

komuniciraju sa upravljačkim poslužiteljem (engl Command and Control server)

Može se nagađati da se radi o trojanskom konju (engl trojan horse) špijunskom

programu (engl spyware) ili programu koji se izvodi u pozadini bez znanja

korisnika (engl backdoor)

Slika 211 ndash Znakovni nizovi prije i nakon raspakiravanja

Analiza nije mogla ići previše u bdquodubinuldquo jer to prelazi ograničenja jednostavne

statičke analize Da je program bio pakiran nekim specifičnim programom za

pakiranje čak bi i ova razina analize bila nemoguća Jednostavna statička analiza

stoga služi samo za dobivanje osnovnog uvida u zlonamjerni program i za

dobivanje smjernica koje će poslužiti za detaljniju naprednu statičku i dinamičku

analizu

19

3 Jednostavna dinamička analiza

Dinamička analiza obuhvaća pokretanje zlonamjernog programa promatranje

njegovog ponašanja te promatranje promjena koje to ponašanje ostavlja na

zaraženom sustavu Nastupa nakon što su statičkom analizom iscrpljene sve

dostupne opcije [1] Statička analiza postavlja pretpostavke o mogućnostima

zlonamjernog programa dok dinamička analiza pokazuje koje će od tih

pretpostavki biti ostvarene Sve funkcije uočene statičkom analizom ne moraju se

nužno izvesti s obzirom da ponašanje zlonamjernog programa jednim dijelom ovisi

i o okolini u kojoj se izvodi

31 Izolirano okruženje za analizu

Preporučljivo je provoditi dinamičku analizu nakon što su se prikupile osnovne

informacije o zlonamjernom programu jer dinamička analiza može ugroziti mrežu i

operacijski sustav ukoliko se ne provodi pažljivo Zbog toga se dinamička analiza

provodi u izoliranom okruženju pomoću programa za virtualizaciju Virtualni stroj

predstavlja simulaciju operacijskog sustava unutar operacijskog sustava Moguće

je umrežavati više virtualnih strojeva u virtualnu mrežu od kojih neki predstavljaju

računala klijente koji će biti zaraženi zlonamjernim programom dok drugi simuliraju

rad poslužitelja i lažiraju mrežu tako da zlonamjerni program ima dojam da je

spojen na Internet Cijeli sustav izoliran je od vanjske mreže tako da se infekcija

ne može proširiti izvan kontroliranog okruženja Navedeni sustav virtualnih

strojeva koji predstavljaju izolirano sigurno okruženje za provođenje dinamičke

analize naziva se virtualni laboratorij

Osim virtualnih laboratorija koje svatko može postaviti sam postoje i internetske

usluge koje nude automatiziranu dinamičku analizu zlonamjernih programa u

izoliranom okruženju (engl sandbox) Neke od tih internetskih usluga su

Cuckoo

Sandboxie

Anubis

VxStream

Shema virtualne mreže jedne od gore navedenih usluga dana je na slici 31

Automatska dinamička analiza ima nekoliko ozbiljnih nedostataka Zlonamjerni

program se pokreće bez ikakvih ulaznih argumenata te se zbog toga ponekad ne

mogu dobiti zadovoljavajući ili čak nikakvi rezultati (ukoliko zlonamjerni program

obavezno očekuje neke ulazne argumente) Ukoliko zlonamjerni program ima

određeno vrijeme čekanja i neko vrijeme bdquospavaldquo prije početka izvođenja

automatizirani sustav može doživjeti istek vremena predviđenog za analizu (engl

timeout) te tako neće vratiti nikakve rezultate

20

Slika 31 ndash Shema izolirane virtualne mreže

Neki zlonamjerni programi imaju ugrađene mehanizme protiv virtualizacije (engl

anti-virtual machine) te pomoću njih mogu detektirati izvođenje u virtualnoj okolini

te se ponašati drugačije ili se uopće ne pokretati Neki od najčešće korištenih alata

za virtualizaciju su VMware player i VirtualBox Zlonamjerni program može

skenirati sustav u potrazi za dokazima prisutnosti tih programa kao što su

karakteristični procesi koje VMware player i VirtualBox koriste ili karakteristični

registarski ključevi

311 Mamci

Izolirane skupine virtualnih strojeva koriste se i za mamce (engl honeypots) koje

služe hvatanju novih zlonamjernih programa i za analizu zlonamjernog mrežnog

prometa Mamac se sastoji od računala ili podataka koji izgledaju kao da su dio

korisnikove mreže ali su zapravo promatrani i izolirani Predstavljaju informacije

koje bi napadačima mogle biti zanimljive Mamci koji služe za otkrivanje programa

koji šalju neželjenu elektroničku poštu (engl spambot) mogu biti prerušeni kao

otvoreni poslužitelji (engl open proxy) ili otvoreni SMTP poslužitelji elektroničke

pošte (engl open mail relay) kojima bilo tko može pristupiti Mogu otkriti IP adresu

napadača ili adrese elektroničke pošte koje se koriste kao mete za testne poruke

kojima se nastoji otkriti otvorene SMTP poslužitelje

Prema načinu korištenja mamci se mogu podijeliti na dvije skupine

Produkcijki (engl Production honeypots) - Jednostavni su za korištenje

hvataju samo ograničen promet i koriste ih velike tvrtke

21

Istraživački (engl Research honeypots) - Koriste se za prikupljanje informacija

o namjerama i taktikama zajednice autora zlonamjernih programa (engl blackhat

community) Kompleksniji su i teže ih je održavati pa ih stoga koriste vojne i

vladine organizacije

Izgled mamca vidljiv je na slici 32

Slika 32 ndash Shema mamca

32 Vrste promjena na zaraženom operacijskom sustavu

Nakon što se zlonamjerni program pokrene i izvede moguće je uočiti promjene

koje je izazvao na operacijskom sustavu Alatom Regshot moguće je snimiti stanje

prije i nakon zaraze te usporediti broj promjena i njihovu vrstu Promjene se mogu

razvrstati u četiri skupine od kojih će svaka biti opisana u narednim

podpoglavljima promjene registara datotečnog sustava aktivnosti procesa i

aktivnosti mreže

321 Promjene registara

Radi se o dodavanju brisanju ili izmjeni određenih registarskih ključeva Neke

registarske ključeve zlonamjerni programi često koriste kao što je na primjer

HKLMSoftwareMicrosoftWindowsCurrentVersionRun koji

omogućava pokretanje zlonamjernog programa sa svakim ponovnim pokretanjem

22

operacijskog sustava (engl reboot) ili HKEY_CLASSES_ROOT koji određuje

ekstenzije datoteka koje operacijski sustav pokreće Neki zlonamjerni programi

obavljaju isključivo promjene registara i nemaju drugih datoteka (engl fileless

malware) Obično se radi o zlonamjernog skripti koja je korisniku skrivena ili

nedostupna zahvaljujući kriptiranju ili ograničenju pristupa Problem je u tome što

legitimni programi također mijenjaju neke iste registre kao i zlonamjerni programi

te se prilikom analize stvara mnogo bdquošumaldquo zbog kojeg je teško razlikovati

legitimnu aktivnost od zlonamjerne Alati koji olakšavaju pregled registara su

Autoruns (koji je dio poznatog Sysinternals paketa koji sadrži i Process Explorer i

Process Monitor) te skripta Silent Runnersvbs Oba alata omogućavaju pregled

svih aplikacija koje se pokreću automatski sa operacijskim sustavom te filtriranje

onih aplikacija koje nisu digitalno potpisane od strane izdavača Pregledom

registara može se otkriti mehanizam kojim se zlonamjerni program zadržava na

operacijskom sustavu (engl persistence mechanism) zlonamjerni unosi u

registrima koji uzrokuju često bdquorušenjeldquo operacijskog sustava u obliku tzv bdquoplavog

zaslonaldquo (engl blue-screen error) i slično

322 Promjene datotečnog sustava

Pregledom datotečnog sustava mogu se uočiti datoteke te kazala koja je

zlonamjerni program stvorio obrisao ili modificirao Također su moguće i promjene

metapodataka kako bi se otežala statička analiza i prikazale lažne informacije

Promjene metapodataka uključuju promjenu vremena stvaranja datoteke vremena

zadnje promjene datoteke ili promjena proizvođača programa (ovo posljednje

koristi se kako bi se zlonamjerni program predstavio kao legitimni program nekog

poznatog proizvođača) Moguće su i izmjene dozvola za čitanje pisanje i izmjenu

određenih datoteka Na ovaj način zlonamjerni program može onemogućiti

korisniku uklanjanje sa operacijskog sustava Virusi datoteka dodaju svoj kod u

izvodivu datoteku Neki od njih dodaju svoj kod na početak izvodive datoteke

(engl prependers) neki na kraj izvodive datoteke (engl appenders) a neki ga

umeću u prazna mjesta u izvodivoj datoteci (engl space-fillers)

323 Promjene aktivnosti procesa

Neki zlonamjerni programi stvaraju procese jednakog naziva kao i legitimni procesi

koje koristi operacijski sustav Pregledom hijerarhije procesa prikazane stablom

procesa (engl process tree) moguće je uočiti proces zlonamjernog programa sa

lažnim nazivom koji je više u hijerarhiji nego što bi legitimni proces istog naziva

trebao biti Metoda kojom se zlonamjerni programi koriste kako bi se predstavili

kao legitimni naziva se metoda zamjene procesa (engl process replacement) U

tom slučaju zlonamjerni program prepiše kod svoje izvodive datoteke preko koda

izvornog korisnog procesa Posljedica toga jest različita slika procesa (engl

23

process image) na disku i u memoriji te se stoga ta metoda korištenjem alata

Process Explorer može vrlo lako otkriti Zlonamjerni programi koji imaju ugrađen

mehanizam zadržavanja na operacijskom sustavu mogu imati nekoliko pomoćnih

procesa koji ga bdquočuvajuldquo (engl watchdogs) i koji će ga uvijek vratiti ako ga korisnik

ručno prekine

324 Promjene mrežne aktivnosti

Analizom mrežne aktivnosti i mrežnog prometa moguće je uočiti vrata na kojima

sluša zlonamjerni program na koje adrese se pokušavao spojiti podatke koje je

pokušavao poslati i slično Primjeri zlonamjerne mrežne aktivnosti uključuju

slanje prikupljenih podataka o korisniku na upravljački poslužitelj

komunikacija s upravljačkim poslužiteljem u svrhu dobivanja uputa

razmjena kriptografskih ključeva (ukoliko se radi o ucjenjivačkom progamu)

preusmjeravanje korisnikovog preglednika na neželjene stranice

slanje neželjene elektroničke pošte (engl spam)

spajanje na stranice sa zlonamjernim programima i skidanje dodatnih

zlonamjernih programa na korisnikovo računalo

33 Pokretanje dinamičkih biblioteka

Operacijski sustav ne zna automatski pokretati dinamičke biblioteke te ih je stoga

potrebno pokrenuti ručno Za pokretanje funkcija iz dinamičkih biblioteka služi

program rundll32exe Dinamičke bibilioteke pokreću se iz komandne linije na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll Argumenti

Argumenti se nazivaju argumentima za izvoz (engl export arguments) i

podrazumijevaju ime funkcije ili broj funkcije (engl ordinal) iz tablice izvezenih

funkcija (engl export table) Taj broj može se saznati pregledom tablice izvezenih

funkcija nekim od alata za statičku analizu kao što su PEview ili PE Explorer ili

alatom Dependency Walker Pokretanje navođenjem broja funkcije izvodi se na

sljedeći način

Cgt run32dllexe imeDinamičkeBibliotekedll ordinal

Dinamičku biblioteku moguće je otvoriti nekim od alata za izmjenu datoteke PE te

joj pomoću njega izmijeniti PE zaglavlje [1] Nakon te izmjene dinamička

biblioteka može se pokretati isto kao i svaki drugi izvodivi program Potrebno je

izbrisati zastavicu IMAGE_FILE_DLL koja se u zaglavlju datoteke PE nalazi na

adresi 2000 Sada će se prilikom sljedećeg pokušaja pokretanja pokrenuti metoda

24

DLLMain Ovaj pristup može izazvati neočekivano ponašanje ili čak bdquorušenjeldquo

zlonamjernog programa stoga nije uvijek učinkovit no ako se uspije izvesti glavni

dio zlonamjernog koda (engl payload) tada to može biti dovoljno Vrijednosti

zaglavlja datoteke PE koje treba izmijeniti prikazuje slika 33

Slika 33 ndash Vrijednosti zaglavlja datoteke PE koje treba izmijeniti

Zlonamjerne dinamičke biblioteke ponekad se moraju instalirati kao usluge te se

tada u komandnoj liniji mora navesti i ime usluge koja se instalira U sljedećem

retku potrebno je navesti naredbu net start koja omogućava pokretanje usluge

na operacijskom sustavu Windows

Cgt run32dllexe imeDinamičkeBibliotekedll InstallService ImeUsluge

Cgt net start ImeUsluge

Analizom funkcija koje sadrži dinamička biblioteka ponekad se može naići samo

na funkciju ServiceMain dok funkcija Install ili InstallService uopće

nema U tom slučaju usluga će se morati instalirati ručno

Dinamičke biblioteke koje su pakirane mogu se bdquoučitatildquo u memoriju pomoću

regsvr32exe Pokušaj pokretanja na ovaj način izazvat će pogrešku ali dinamička

biblioteka će biti raspakirana i učitana u memoriju sve dok korisnik ne zatvori

dijaloški prozor sa dojavom o pogrešci Sadržaj procesa regsvr32 može se

spremiti na disk te dalje analizirati

Još jedan način pokretanja zlonamjernih dinamičkih biblioteka jest injekcija u neki

drugi već pokrenuti proces kao što je primjerice explorerexe Moguće je koristiti

jednostavnu Python skriptu dll_injectpy preuzetu iz knjige bdquoGray Hat Pythonldquo

34 Primjer jednostavne dinamičke analize

U ovom primjeru analiziran je trojanski konj pod nazivom PonyTrojan koji se širi

putem neželjene elektroničke pošte kao privitak u obliku izvodive datoteke ili

zlonamjernog dokumenta

25

Zlonamjerni dokument nastoji zavarati korisnika ekstenzijom scr koja se obično

koristi za čuvare zaslona (engl screen saver) ali se pokreće kao normalna

izvodiva datoteka Također koristi ikonu programa Adobe Reader kako bi se

predstavio kao legitimna aplikacija

Statička analiza nije mogla puno pomoći jer program za pakiranje nije bio niti

jedan od poznatijih a znakovni nizovi nisu odavali ništa konkretno Nakon

pokretanja zlonamjerni program čeka nekoliko sekundi prije nego počne sa

ikakvom aktivnošću Process Explorer bilježi stvaranje prvo jednog procesa koji se

nakon nekoliko sekundi ubija te se isti postupak ponavlja još dva puta Alatom

Process Monitor može se vidjeti mnogo događaja LoadImage koji potvrđuju da se

za to vrijeme odvija raspakiravanje i zapisivanje u memoriju Događaj je prikazan

na slici 34

Slika 34 ndash Proces zlonamjernog programa se učitava u memoriju

Treći proces također je aktivan samo kratko vrijeme no to je dovoljno da se uoče

razlike u znakovnim nizovima na disku i u memoriji kako prikazuje slika 35 Ovo je

dokaz da je zlonamjerni program koristio tehniku zamjene procesa U memoriji se

vidi popis lozinki koje zlonamjerni program koristi prilikom napada grubom silom

(engl brute force)

26

Slika 35 ndash Metoda zamjene procesa

Među znakovnim nizovima u memoriji mogu se vidjeti i internetske adrese na koje

će se zlonamjerni program pokušati spojiti Neke od tih internetskih adresa

uhvaćene su i alatom ApateDNS i na slici 36 vidljivo je da im je zlonamjerni

program pokušao pristupiti

Slika 36 ndash Adrese kojima pristupa zlonamjerni program

Alatom Process Monitor uočeno je i skeniranje vrata (engl port scanning) kao što

prikazuje slika 37 Sučelje na kojemu se ispituje je lokalno (engl localhost) jer je

alat ApateDNS konfiguriran da simulira poslužitelja na IP adresi 127001

Slika 37 ndash Skeniranje vrata

Daljnji dokaz zlonamjerne mrežne aktivnosti zabilježen je stvaranjem registarskih

ključeva HKLMSystemCurrentControlSetServicesTcpipParameters što je

vidljivo na slici 38

Slika 38 ndash Registarski ključevi koje je zlonamjerni program stvorio

Analizom promjena na datotečnom sustavu uočen je pristup skripti koja se

pokreće iz komandne linije (engl batch script) i čije ime je slučajni niz brojeva

Dalo bi se zaključiti da je ta skripta odgovorna za brisanje izvorne datoteke

zlonamjernog programa nakon što se izvrši zlonamjerni kod Zlonamjerni program

služi samo za učitavanje zlonamjernog koda u memoriju (engl loader) te

dohvaćanje koda trojanskog konja sa neke od pronađenih internetskih adresa

27

Na temelju prikupljenih informacija može se sigurno zaključiti da se radi o

zlonamjernom programu koji služi skidanju trojanskog konja na zaraženo računalo

te krađi osobnih podataka korisnika Zlonamjerni program koristeći popis lozinki i

pristup grubom silom pokušava dobiti neautorizirani pristup funkcijama na

zaraženom računalu te komunicira sa skupom internetskih domena

Ova analiza dala je samo osnovni uvid u ponašanje zlonamjernog programa Neke

instrukcije možda nikada nisu bile izvedene jer je na sustavu nedostajala neka

komponenta koja je zlonamjernom programu bila neophodna za njihovo izvođenje

Puna funkcionalnost zlonamjernog programa može se saznati tek primjenom

tehnika napredne statičke i dinamičke analize

28

4 Napredna statička analiza

Napredna statička analiza provodi se korištenjem programa koji daju uvid u kod

niže razine Korištenje tih vrsta programa zahtijeva poznavanje asemblera (engl

assembly) te stoga napredne metode analize zlonamjernih programa imaju strmiju

krivulju učenja od osnovnih metoda analize

Većina zlonamjernih programa pisana je u programskom jeziku C koji je vrlo

bdquoblizuldquo jezicima niže razine jer ne postoji međukorak prevođenja u skup instrukcija

koje kasnije izvodi interpreter (engl bytecode) Struktura programskih jezika

vidljiva je na slici 41 Zbog toga se analiza zlonamjernih programa pisanih u

programskom jeziku C svodi na obradu alatima za naprednu statičku analizu koji

omogućavaju uvid u niz instrukcija u asembleru

Slika 41 ndash Struktura programskih jezika

Mikrokod (engl microcode) je kod koji se izvršava na točno određenom sklopovlju

i predstavlja interpreter između sklopovlja i arhitekture računala Koriste ga

procesori za prevođenje instrukcija podataka o stanju automata (engl state

machine data) i sličnih ulaznih podataka u nizove operacija na razini sklopovlja

Strojni jezik (engl machine code) implementiran je instrukcijama mikrokoda koje

sklopovlju omogućavaju izvođenje koda Također ovisi o arhitekturi računala ali

nema toliko velikih razlika jer će mnogi procesori proizvedeni u isto vrijeme ili od

istog proizvođača koristiti isti strojni jezik Stvara se prilikom prevođenja jezika više

razine

29

Jezici niže razine (engl low-level languages) predstavljaju prvu razinu

programskih jezika koja je ljudima čitljiva Najčešće korišteni jezik niže razine je

asembler Kada jezik više razine nije dostupan asembler je jedini ljudima čitljiv

jezik koji se može generirati iz strojnog koda

Jezici više razine (engl high-level languages) sadrže veću razinu apstrakcije te

su stoga lakši za korištenje

SkritpniInterpreterski jezici (engl scriptinginterpreter languages) predstavljaju

najvišu razinu apstrakcije Programski kod se ne prevodi u strojni kod nego u

međukod (engl bytecode) kojega kasnije izvodi interpreter

41 Alati za naprednu statičku analizu

U narednim podpoglavljima opisan je skup alata koji se koriste za ovu vrstu

analize a prilikom jednostavne analize se najčešće ne primjenjuju

411 Programi za ispravljanje pogrešaka

Prvu skupinu čine programi za ispravljanje pogrešaka u mnemoničkom obliku

(engl debugger) Ti programi omogućavaju detaljno praćenje ponašanja

programa Program se promatra tijekom njegovog izvođenja Dva najvažnija

svojstva programa za ispravljanje pogrešaka su postavljanje prekidnih točaka

(engl breakpoint) i mogućnost praćenja (engl tracing) instrukcija koda Kad

program dosegne prekidnu točku izvođenje se zaustavlja i moguće je vidjeti

trenutno stanje izvođenja te stanja pojedinih varijabli stoga i memorije Ovim

postupkom dobiva se uvid u stvarni tok programa koji bi se inače izveo prebrzo

Praćenje instrukcija koda obuhvaća zaustavljanje programa nakon svake

obavljene instrukcije čime je omogućeno prolaženje kroz kod korak po korak

prateći promjene koje se pritom događaju

412 Programi za prevođenje na viši programski jezik

Korak više od programa za ispravljanje pogrešaka u mnemoničkom obliku su

programi koji obavljaju proces prevođenja na viši programski jezik (engl

decompilers) Uzimaju binarnu datoteku u obliku za izvođenje i iz nje grade izvorni

jezik visoke razine (engl high level source code) [9] Proces prevođenja odvija se

u suprotnom smjeru čime se dolazi do izvornog koda programa Primjena ovih

programa izražena je kod jezika koji posjeduju virtualni stroj kao što su Java C ili

Visual Basic jer u ovom slučaju izvorni kod zadržava veliku razinu čitljivosti

30

413 Programi za generiranje ispisa strojnog koda

Treću skupinu čine programi koji uzimaju izvorni kod programa u binarnom obliku i

generiraju tekstualne datoteke koje sadrže instrukcije programa pisane u strojnom

jeziku Strojni jezik je tekstualno mapiranje objektnog koda Različite razine

apstrakcije koda i razlike u izgledu između pojedinih razina vidljive su na slici 42

Slika 42 ndash Različite razine apstrakcije koda

414 Programi za rad s datotekama u heksadekadskom obliku

Programima za rad s datotekama u heksadekadskom obliku (engl hex editor)

moguće je vidjeti točan izgled datoteke na disku u njezinom bdquosirovomldquo obliku te

omogućavaju fizičko mijenjanje datoteka To ih razlikuje od prethodno opisanih

programa koji mijenjaju kod u memoriji Ovim programima može se odrediti tip

programa ukoliko se dobije zlonamjerni program čija ekstenzija je nepoznata

Informacije o tome sadrži zaglavlje datoteke (engl header) Te informacije

nazivaju se potpis datoteke (engl file signature) i sastoje se od kratkog niza

bajtova na samom početku datoteke koji se još naziva i bdquomagični brojldquo (engl magic

number) Popis potpisa za najpoznatije formate datoteka vidljiv je u tablici 31

Tablica 31 ndash Potpisi najpoznatijih formata datoteka

exe MZ 4D 5A Izvodivi programi za Windows

zip

jar

odt

docx

PK

50 4B

03 04

Format arhive i svi tipovi koji se

baziraju na njemu

31

pptx

xlsx

apk

89 50

4E 47

0D 0A

1A 0A

class CA FE

BA BE

pdf PDF 25 50

44 46

Dokument u formatu PDF

mp3 yumlucirc

FF FB

Zvučni zapis u formatu mp3

bmp BM

42 4D

Slika u formatu bmp

doc

xls

ppt

msg

D0 CF 11

E0 A1 B1

1A E1

Dokumenti nastali starijom inačicom

paketa Microsoft Office

37 7A BC

AF 27 1C

Arhiva nastala programom 7ZIP

MSCF 4D 53

43 46

Cabinet datoteka

XML

swf

ltXML

3c 3f

78 6d

6c 20

Datoteka u formatu XML

cab

swf

7z

swf

7zfrac14macr

PNG

png

Slika u formatu png

Datoteka nastala prevođenjem

programskog jezika Java Ecircthornordmfrac34

MSCF

swf

bmp

swf

BM

swf

42 4D

swf

mp3

swf

FF FB

swf

32

415 Programi za snimanje procesa na disk

Programima koji stanje aktivnog procesa spremaju na disk (engl process dump)

stanje aktivnog procesa koji se promatra može se sačuvati za lakšu analizu i

daljnju obradu Koriste se prilikom ručnog raspakiravanja kada je proces

zlonamjernog programa pakiran nekim modificiranim programom za pakiranje

416 Programi za popravljanje uvoza

Prilikom ručnog raspakiravanja potrebno je popraviti adrese jer zapis u memoriji

nije isti kao i zapis na disku te se u tu svrhu koriste programi za popravljanje uvoza

(engl import reconstructor) Također se koriste i za popravljanje pogrešnih ili

nedefiniranih poziva funkcijama programskih sučelja

42 Pronalaženje otisaka

Otisak (engl signature) jest algoritam ili sažetak koji jedinstveno identificira

određeni zlonamjerni program Promatranjem instrukcija zlonamjernog programa

uočavaju se karakteristični dijelovi koda koji prikazuju uzorke zlonamjernog

ponašanja te se njihove vrijednosti izdvajaju u uvjet na temelju kojega će se

provjeravati podudarnost zlonamjernog programa sa zadanim otiskom

Neki otisci napravljeni su s namjerom detektiranja velikog broja zlonamjernih

programa sa istim obrascima ponašanja Te detekcije nazivaju se generičkim

detekcijama (engl generic detections) Na temelju generičkih detekcija moguće je

otkriti novi zlonamjerni program koji pripada već poznatoj obitelji zlonamjernig

programa (engl malware family) a sadrži neke od poznatih i dokumentiranih

obrazaca zlonamjernog ponašanja vezanih uz tu obitelj Neki primjeri detekcija su

W32Trojan3SIH

VirToolWin32Injector

AdwareBrowseFoxWin32153498

JSLockyPgen

JSTrojanDownloaderNemucodNC BackdoorWin32DarkKometaaco

swf

swf

CWS

EWS

43 57

53 46

57 53

Format koji koristi program

Adobe Flash Player

33

Podaci koji su navedeni u detekciji najčešće su platforma kojoj je zlonamjerni

program namijenjen tip zlonamjernog programa ime obitelji te neke dodatne

oznake koje interno koriste određeni proizvođači zlonamjernih programa

Novi zlonamjerni programi otkrivaju se svakodnevno te se baze otisaka

antivirusnih programa redovno osvježavaju novim otiscima za zlonamjerne

programe koji prije nisu bili detektirani Kupci nove otiske dobivaju putem

ažuriranja (engl updates) i jako je važno da se ažuriranje antivirusnog programa

obavlja redovito

421 Alat za stvaranje otisaka

Jedan od alata za stvaranje otisaka je YARA [5] Omogućava identifikaciju

zlonamjernih programa baziranu na uzorcima znakovnih nizova ili binarnih

podataka Svaki izraz naziva se pravilom (engl YARA rule) koje ima sljedeću

strukturu

rule RuleName

strings

$test_string1 = bdquotestni znakovni nizldquo

$test_string2 = E1 D2 C3 B4

$test_string3 = A1 A2 B3

$test_string4 = B1 C1 [2-3] D7

conditions

$test_string1 and $test_string2

Identifikator pravila je RuleName dok su strings znakovni nizovi koji tvore uvjet

(engl condition) kojim će se provjeravati YARA pravilo

Identifikatori moraju poštivati iste konvencije kao i deklaracija varijabli u

programskom jeziku C ndash Mogu sadržavati bilo koji alfanumerički znak i znak bdquo_ldquo ali

prvi znak ne smije biti znamenka Razlikuju velika i mala slova ne smiju biti dulji

od 128 znakova i naziv identifikatora ne smije biti ključna riječ (engl keyword)

Znakovni nizovi mogu biti u obliku ASCII znakova heksadekadskih vrijednosti

skokova te u posebnom obliku koji pretpostavlja da su neki dijelovi niza nepoznati

(engl wildcard) U gornjem općenitom primjeru znakovi predstavljaju

heksadekadsku vrijednost na tom mjestu koja može biti proizvoljna ili nepoznata

34

dok [2-3] predstavlja bilo koju proizvoljnu sekvencu heksadekadskih vrijednosti

duljine između 2 i 3 bajta

Uvjet predstavlja izraz Booleove algebre i rezultat evaluacije tog izraza određuje

hoće li se zlonamjerni program detektirati Uvjetom se može provjeriti broj

pojavljivanja nekog znakovnog niza kao što je na primjer

$testString1gt4 and $testString2=9

Moguće je provjeravati pojavljuje li se zadani znakovni niz na određenoj

memorijskoj lokaciji pokrenutog procesa Može se navesti pomak (engl offset) od

početne memorijske lokacije procesa ili raspon memorijskih lokacija na kojima bi

se zadani znakovni niz trebao pojaviti

$testString1 at 300 or $testString2 at 700

$testString1 in (400 900)

43 Primjer napredne statičke analize

U ovom primjeru analiziran je zlonamjerni dokument u formatu RTF (engl rich text

format) koji zloupotrebljava ranjivost (engl exploit) u kontrolama ActiveX Službeni

naziv analizirane ranjivosti jest CVE-2012-0158 Naziv CVE dolazi od engleskog

Common Vulnerabilities and Exposures Nekoć je ranjivost prvo imala status

kandidata te je stoga sadržavala oznaku CAN koja bi kasnije bila promovirana u

oznaku CVE međutim danas je ta praksa označavanja napuštena Prvi broj

predstavlja godinu kada je ranjivost prvi put otkrivena dok drugi broj predstavlja

internu oznaku ranjivosti Sustav koji se bavi prikupljanjem informacija o

ranjivostima i njihovim označavanjem vodi centar za istraživanje i razvoj National

Cybersecurity FFRDC kojim upravlja američka neprofitna organizacija MITRE

Corporation

Pregledom dokumenta programom za rad s datotekama u heksadekadskom obliku

može se vidjeti zaglavlje koje nema standardni oblik za format RTF Na samom

početku dokumenta umjesto rtf piše rtt Standardni oblik zaglavlja za format RTF

je sljedeći

rtf ltcharsetgt deff ltfonttblgt ltfiletblgt ltcolortblgtltstylesheetgt

ltlisttablesgt ltrevtblgt

Zlonamjerni dokument imao je ekstenziju doc što služi za zavaravanje žrtve s

obzirom da program Microsoft Word može otvoriti dokumente u oba navedena

formata neovisno o njihovoj ekstenziji Binarni podaci koje sadrži objekt u RTF

dokumentu kriptirani su kao niz znakova u heksadekadskom obliku kao što

prikazuje slika 43

35

Slika 43 ndash Modificirano zaglavlje i kriptirani podaci

U svrhu dekriptiranja podataka u heksadekadskom obliku napisana je kratka

skripta u programskom jeziku Python koja nad nizom znakova primjenjuje funkciju

unhexlify te se tako može vidjeti izvorni oblik tih podataka Stanje nakon primjene

funkcije unhexlify na znakovnom nizu iz objekta označenog crveno na slici 43

prikazuje slika 44

Slika 44 ndash Dekriptirani podaci iz objekta

Kao što je vidljivo sa prethodne slike podaci upućuju na upotrebu ActiveX kontrole

ListViewCtrl Ranjivost koju ta kontrola sadrži jest preljev međuspremnika

stoga (engl stack buffer overflow)

Daljnjim pregledom dokumenta mogu se uočiti karakteristični znakovni nizovi

oblika bdquo9090909090909090ldquo i bdquo41414242414142424141424241414242ldquo Prvi niz

se često viđa kod programa koji iskorištavaju ranjivosti (engl shellcode) Podaci

oblika bdquo9090ldquo kad se dekriptiraju predstavljaju instrukciju NOP te se takav niz

instrukcija naziva bdquoNOP spustldquo (engl NOP sled) Adrese na stogu ponekad mogu

biti nepredvidljive te stoga autor zlonamjernog programa ugradnjom NOP spusta

omogućava zlonamjernom programu da se pomoću NOP operacija (za koje se zna

da ne čine ništa) jednostavno bdquoodskliželdquo do adrese na kojoj treba započeti svoje

izvođenje Drugi ponavljajući znakovni niz bdquo41414242ldquo predstavlja isti mehanizam

implementiran korištenjem drugih operacija ali sa istim učinkom Umjesto NOP

operacije koriste se neke druge slične operacije koje također nemaju nikakvog

36

utjecaja na izvođenje programa i služe zlonamjernom programu za pristup traženoj

adresi početka izvođenja

Slika 45 ndash NOP spust i kriptirani zlonamjerni kod

Na slici 45 prikazani su gore opisani nizovi i iza njih je crveno označen kod

zlonamjernog programa koji je ponovno prikazan u heksadekadskom obliku

Primjenom iste Python skripte dobiva se dekriptirani izgled koda koji je vidljiv na

slici 46

Slika 46 ndash Dekriptirani zlonamjerni kod

Promatranjem heksadekadskog prikaza na slici 46 ne može se razaznati ništa

međutim heksadekadske vrijednosti na slici označene crveno se mogu učitati u

program za ispravljanje pogrešaka OllyDbg Učitavanje se provodi sljedećim

nizom koraka

37

kopirati heksadekadske vrijednosti podataka

otvoriti bilo koju datoteku programom OllyDbg

u toj datoteci pronaći malo slobodnog prostora i označiti ga

odabrati opciju binary paste i zalijepiti heksadekadske vrijednosti

Nakon učitavanja mogu se vidjeti asemblerske instrukcije kao što prikazuje slika

47 Ovaj zlonamjerni kod ne može se pokretati i analizirati dinamički ali se

informacije o mogućnostima zlonamjernog koda mogu dobiti statičkom analizom

učitanih asemblerskih instrukcija Na samom početku se jasno vidi niz NOP

operacija te još jedan niz alternativnih operacija sa istom svrhom Heksadekadske

vrijednosti vidljive su u lijevom stupcu

Slika 47 ndash Prikaz instrukcija nakon učitavanja u program OllyDbg

Podaci u nastavku opisuju korake kojima se zlonamjerni kod dekriptira prije

izvođenja Poznato je da se iza NOP spusta nalaze instukcije za dekriptiranje a

odmah nakon toga sam zlonamjerni kod Grafički prikaz vidljiv je na slici 48

38

Slika 48 ndash Struktura koda koji zloupotrebljava ranjivost

Može se vidjeti XOR petlja koja je na slici 47 označena plavim okvirom Rutina za

dekriptiranje pomoću funkcije XOR i određenog ključa dekriptira glavni kod

zlonamjernog programa Tragovi dekriptiranja XOR petljom vidljivi su i u dokumentu

učitanom na samom početku analize Specifičan niz znakova ponavlja se nekoliko

puta u kratkim razmacima kako prikazuje slika 48 Taj niz posljedica je brojača

XOR petlje koja je iterirala po NULL bajtovima prilikom dekriptiranja glavnog koda

zlonamjernog programa

Slika 48 ndash Ponavljajući uzorak brojača XOR petlje

Na temelju prikupljenih informacija mogao bi se napisati otisak korištenjem alata

YARA Prvi znakovni niz predstavlja kriptiranu ActiveX kontrolu ListViewCtrl

Drugi znakovni niz predstavlja heksadekadsku vrijednost NOP spusta dok treći

39

znakovni niz predstavlja ponavljajući uzorak brojača XOR petlje Dobiveno YARA

pravilo prikazano je na slici 49

Slika 49 ndash YARA pravilo za detekciju analiziranog zlonamjernog koda

Ovim YARA pravilom moguće je otkriti sve zaražene RTF dokumente koji budu

posjedovali ranjivost sa gore opisanim ponašanjem Prilikom izrade otisaka

potrebno je gledati bdquoširuldquo sliku i pronaći što bdquoopćenitijeldquo značajke zlonamjernog

koda koje bi se mogle ponavljati u drugim zaraženim dokumentima kod kojih se

radi o iskorištavanju iste ranjivosti Dekriptirani zlonamjerni kod može iskorištavati

ranjivost na mnogo različitih načina te stoga njegova analiza prilikom izrade otiska

nije provedena u detalje

40

5 Napredna dinamička analiza

Dinamička analiza sastoji se od učitavanja zlonamjernog programa u program za

ispravljanje pogrešaka izvođenje njegovih instrukcija korak po korak te

promatranja promjena memorije stoga registara i zastavica nakon svakog koraka

[1] Korištenjem programa za ispravljanje pogrešaka moguće je pratiti vrijednosti

memorijskih lokacija i argumenata svake funkcije te mijenjati tok izvođenja

zlonamjernog programa

Programi za ispravljanje pogrešaka koji se koriste za analizu zlonamjernih

programa i općenito za reverzno inženjerstvo rade na razini asemblera (engl

assembly-level debuggers) Može ih se koristiti i kada nije dostupan izvorni kod

programa To svojstvo ih razlikuje od programa za ispravljanje pogrešaka koji rade

na razini izvornog koda (engl source-level debuggers) i koji su ugrađeni u

razvojna okruženja (engl integrated development environment IDE) te se koriste

tijekom razvoja aplikacija

51 Izvođenje korak po korak

Najjednostavniji oblik ove metode jest izvođenje instrukcija jednu po jednu (engl

single-step) Nakon što se instrukcija izvede program se ponovno zaustavlja to

jest kontrola se vraća programu za ispravljanje pogrešaka Može se analizirati

određena funkcija praćenjem poziva funkcije (engl step into) ili se određeni poziv

funkcije može preskočiti (engl step over) Posljednja funkcionalnost korisna je

naiđe li se na poziv neke funkcije iz dinamičke biblioteke čiji detalji u određenom

trenutku nisu toliko bitni za analizu Ukoliko se program nađe u području adresa

čije vrijednosti počinju brojkom 7 može se sa sigurnošću reći da se radi o funkciji

iz dinamičke biblioteke Praćenjem baš svake funkcije moguće je bdquozaplestildquo se u

detaljima Analizom se pokušava dobiti bdquošira slikaldquo o funkcionalnosti programa te

se stoga samo neke funkcije analiziraju detaljno dok se ostale preskaču

Nedostatak preskakanja jest propuštanje poziva važnih funkcija Ukoliko je

preskočena neka važna funkcija i program ne dobije povratnu vrijednost njenog

poziva daljnja analiza postaje nemoguća U tom slučaju potrebno je sve ponovno

pokrenuti i započeti analizu ispočetka

52 Postavljanje prekidnih točaka

Prekidne točke (engl breakpoints) služe zaustavljanju izvođenja programa u

određenom trenutku kako bi se moglo analizirati trenutno stanje Služe za analizu

stanja registara i memorije koja se tijekom izvođenja programa stalno mijenjaju

41

521 Programske prekidne točke

Programske prekidne točke (engl software breakpoints) najčešći su tip prekidnih

točaka te se koriste i prilikom ispravljanja pogrešaka na razini izvornog koda

Prilikom postavljanja programske prekidne točke prvi bajt instrukcije zamjenjuje

se heksadekadskom vrijednošću 0xCC Ta vrijednost predstavlja instrukciju INT 3

(engl breakpoint interrupt) Prilikom izvođenja te instrukcije operacijski sustav

generira iznimku i predaje kontrolu programu za ispravljanje pogrešaka [1]

522 Sklopovske prekidne točke

Sklopovske prekidne točke (engl hardware breakpoints) koriste posebne

sklopovske registre za tu svrhu Prilikom izvođenja prekidne točke provjerava se

na razini sklopovlja je li pokazivač na instrukciju jednak adresi prekidne točke Za

razliku od programskih prekidnih točaka ovdje nije bitno koji bajtovi se nalaze na

toj lokaciji Ovo može biti vrlo značajno kod analize polimorfnog koda Sklopovske

prekidne točke mogu se aktivirati i prilikom pristupa a ne samo kod izvođenja

Može se detektirati kada je na određenu memorijsku lokaciju pisano ili kada se s

određene memorijske lokacije nešto pročitalo Korištenje ove vrste prekidnih

točaka ograničeno je na samo četiri registra

523 Uvjetne prekidne točke

Uvjetne prekidne točke (engl conditional break points) su programske prekidne

točke koje se aktiviraju samo ako je ispunjen određeni uvjet Ovo je pogodno za

detekciju točno određenih parametara koje neka funkcija očekuje Izvođenje se

nastavlja normalno ukoliko zadani uvjet prekidne točke nije ispunjen

53 Ručno raspakiravanje

Kao što je navedeno u prethodnim poglavljima zlonamjerni programi koji nisu

pakirani niti jednim poznatim programom za pakiranje ne mogu se automatski

raspakirati Neki zlonamjerni programi imaju programe za pakiranje koji su

razvijeni isključivo za njih dok drugi koriste modificirane inačice poznatih programa

za pakiranje U oba slučaja raspakiravanje se mora obaviti ručno

Proces ručnog raspakiravanja sadrži sljedeći niz koraka

koristeći program za ispravljanje pogrešaka pokrenuti pakirani zlonamjerni

program

pronaći izvornu polazišnu točku programa i postaviti prekidnu točku

pustiti spojni modul da raspakira zlonamjerni program u memoriju

42

spremiti raspakirani kod iz memorije na disk (engl dump)

ručno popraviti zaglavlje datoteke PE i rekonstruirati tablicu uvezenih

funkcija

Izvornu polazišnu točku može se naći na više načina Najčešći je korištenje raznih

prekidnih točaka i izvođenje pojedinih dijelova korak po korak [1] Jedna od

strategija jest postaviti sklopovsku prekidnu točku koja detektira pisanje u

memoriju Tako se može znati da je spojni modul krenuo raspakiravati zlonamjerni

kod

Druga strategija jest pronalaženje skoka sa spojnog modula na izvornu polazišnu

točku Najčešće se radi o instrukciji JMP međutim neki autori zlonamjernih

programa koriste instrukciju RET kako bi otežali analizu Skok se često može

prepoznati kao posljednja važeća instrukcija iza koje slijedi niz bajtova koji čine

beskorisne instrukcije Ti bajtovi služe za ispravno poravnavanje sekcija (engl

byte aligning) Također adresa na koju skok upućuje jako je daleko od dijela koda

koji se trenutno promatra Dio koda na koji skok upućuje prije izvođenja spojnog

modula izgleda besmisleno zbog toga što je program kad se tek učita u program

za ispravljanje pogrešaka još uvijek pakiran Nakon izvođenja spojnog modula i

raspakiravanja taj isti dio koda sadrži valjane instrukcije te je stoga ovo još jedna

potvrda pronalaženja izvorne polazišne točke

Prekidna točka može se postaviti i na funkciju GetProcAddress Većina

programa za raspakiravanje koristi ovu funkciju kako bi razriješila uvezene

funkcije Detektiranjem ove funkcije može se sa sigurnošću reći da je izvođenje

zlonamjernog programa prešlo izvornu polazišnu točku i da se cijeli spojni modul

za raspakiravanje izvršio

Spojni modul mora razriješiti uvezene funkcije kako bi pokrenuo zlonamjerni

program ali ne mora rekonstruirati izvornu tablicu uvezenih funkcija Za

rekonstrukciju tablice uvezenih funkcija koristi se alat Import REConstructor

Važno je naglasiti da proces zlonamjernog programa koji se raspakirava mora

cijelo vrijeme biti aktivan dakle mora biti učitan u program za ispravljanje

pogrešaka sa prekidnom točkom postavljenom na izvornu polazišnu točku Alatom

Import REConstructor tada je moguće odabrati aktivni proces zlonamjernog

programa te je nakon toga potrebno unijeti adresu izvorne polazišne točke bez

baze (engl image base) Ovo će biti detaljnije pojašnjeno u primjeru ručnog

raspakiravanja u sljedećem podpoglavlju

Postoji specifična skupina programa za pakiranje koji su poznati pod nazivom

RunPE [12] Oni sadrže neke bitne razlike u odnosu na ostale programe za

pakiranje a to su

Pakirani zlonamjerni program ponovno pokreće samog sebe kao novi

proces i obavlja injekciju svog koda u taj proces u memoriji To je različito

od ostalih programa za pakiranje koji pišu po memoriji svog vlastitog

43

procesa Neki automatski programi za raspakiravanje zbog toga uopće

neće detektirati da je program pakiran

Kod za raspakiravanje pisan je u programskom jeziku Visual Basic 6 i

rezultat je međukod kojega izvodi interpreter što otežava analizu

Jako je jednostavno modificirati kod i stvarati nove inačice Tako se

program za raspakiravanje stalno mijenja i nikada se ne može znati koji

algoritam će biti korišten prilikom raspakiravanja Na crnom tržištu postoje

alati čija je svrha modifikacija programa za pakiranje Imena klasa i funkcija

postaju ispremiješana te se ubacuju dijelovi beskorisnog koda Na ovaj

način može se zavarati dobar dio antivirusnih programa

Unatoč raznim metodama obfuskacije i otežavanja analize svi programi za

pakiranje koji pripadaju skupini RunPE funkcioniraju na sličan način

Izvorni kod zlonamjernog programa se raspakirava dekriptira ili deobfuscira

u memoriju

Poziva se funkcija CreateProcess na kodu koji se trenutno izvodi

korištenjem zastavice CREATE_SUSPENDED Time se izvorni kod

zlonamjernog programa mapira u memoriju te je on tada spreman za

izvođenje

Poziva se funkcija WriteProcessMemory koja zapisuje zaglavlja PE i

svaku sekciju koda zlonamjernog programa na očekivanu lokaciju

Pozivaju se funkcije SetThreadContext i ResumeThread kako bi se kod

zlonamjernog programa mogao početi izvršavati

Proces raspakiravanja koji detaljno opisuje ove korake objašnjen je primjerom u

sljedećem potpoglavlju

54 Primjer ručnog raspakiravanja

U ovom primjeru prikazan je proces ručnog raspakiravanja ucjenjivačkog

programa BandarChor Program za pakiranje ima dva sloja Vanjski sloj pakiran je

specifičnim programom za pakiranje koji koristi tehnike RunPE programa za

pakiranje dok je unutarnji sloj pakiran dobro poznatim programom za pakiranje

UPX

Na samom početku analize zlonamjerni program otvoren je programom PEview

Odmah se mogu uočiti dvije neobične sekcije naziva uioki kao što je vidljivo na

slici 51 Podaci koje te sekcije sadrže očito su kriptirani te početak prve uioki

sekcije sadrži uočljiv niz znakova oblika amp)

44

Slika 51 ndash Sekcije zlonamjernog progama

Nakon učitavanja zlonamjernog programa u program za ispravljanje pogrešaka

OllyDbg postavlja se prekidna točka na funkciju CreateProcessA te se pritiskom

na funkcijsku tipku F9 zlonamjerni program pokreće Izvođenje traje nekoliko

minuta jer zlonamjerni program vjerojatno ima neki mehanizam čekanja ili

pokušava primijeniti neku tehniku za otežavanje analize Nakon dosezanja

prekidne točke na vrhu stoga može se vidjeti povratna adresa za funkciju koja je

pozvala funkciju CreateProcessA što prikazuje slika 52

Slika 52 ndash Povratna adresa funkcije koja je pozvala CreateProcessA

Desnim klikom na tu adresu odabire se opcija Follow in Disassembler te se

prikazuje dio koda odmah iza poziva funkcije CreateProcessA što je vidljivo na

slici 53

Slika 53 ndash Dio koda iza poziva CreateProcessA

45

Novi proces je stvoren i u njega će se upisati dekriptirani podaci Upisivanje

dekriptiranih podataka obavit će se pomoću funkcije WriteProcessMemory Tu

funkciju moguće je vidjeti na čak tri mjesta malo niže u kodu Postavlja se prekidna

točka na prvi poziv funkcije WriteProcessMemory (dakle na instrukciju CALL)

Pritiskom funkcijske tipke F9 ponovno se pokreće izvođenje zlonamjernog

progama te se zaustavlja na mjestu prekidne točke Na vrhu stoga sada se nalazi

pokazivač na podatke koji će biti upisani u memoriju To se vidi po vrijednosti MZP

koja označava početak izvodivog programa Desnim klikom na pokazivač na MZP

odabire se opcija Follow in Dump te se tako dolazi do podataka iz memorije Sada

je moguće kopirati binarne podatke izvodivog programa u novu binarnu datoteku

Prije toga potrebno je točno odrediti granice izvodivog programa To se obavlja

zbrajanjem pokazivača na podatke sa veličinom posljednje sekcije izvodivog

programa Nakon što je označen blok binarnih podataka iz memorije odabire se

opcija Binary Copy te se binarni podaci zalijepe u program HxD Programom HxD

sada se rezultat može snimiti kao exe datoteka pod nazivom primjerice blaexe

Time je prvi sloj raspakiran

Sada je potrebno raspakirati drugi sloj koji je pakiran programom za pakiraje UPX

Otvaranjem blaexe programom PEiD to se može i potvrditi kao što prikazuje slika

54 Kao što se vidi sa slike UPX je ispravno detektiran kao program za pakiranje

dok Delphi u zagradi znači da je spojni modul pisan u programskom jeziku Delphi

To je neki oblik objektnog Pascala vrlo popularan u Rusiji

Slika 54 ndash Drugi sloj pakiran programom za pakiranje UPX

Automatsko raspakiravanje programom UPX prikazano je u ranijim poglavljima

međutim ovdje će biti prikazan postupak ručnog raspakiravanja za UPX

Učitavanjem blaexe u OllyDbg može se vidjeti skup instrukcija karakterističan za

UPX

Na samom početku nalazi se instrukcija PUSHAD iza koje slijede NOP operacije i

gomila skokova Svrha tih skokova je otežavanje analize jer se praćenjem svakog

od njih vrlo lako izgubiti te se tako nikada ne dođe do izvorne polazišne točke

46

Slika 55 ndash Početak programa pakiranog pomoću UPX

Kako bi se ovo izbjeglo postavlja se prekidna točka na posljednji skok u nizu koji

se u ovom slučaju nalazi na adresi 4C1903 To je zadnji skok prije izvorne

polazišne točke Pritiskom F9 program dolazi do prekidne točke i staje Sada treba

maknuti prekidnu točku i ući u funkciju pritiskom funkcijske tipke F7 Ulaskom u

funkciju prva instrukcija na kojoj se blaexe trenutno nalazi je njegova izvorna

polazišna točka Proces mora biti aktivan i sada se može započeti popravljanje PE

zaglavlja i tablice uvezenih funkcija

Zaglavlje PE popravlja se programom LordPE Nakon otvaranja blaexe

programom LordPE potrebno ga je naći na popisu aktivnih procesa kao što

prikazuje slika 56

Desnim klikom odabire se opcija dump full te se sada program sa popravljenim PE

zaglavljem sprema na disk pod nazivom dumpexe

47

Slika 56 ndash Pronalaženje blaexe na popisu aktivnih procesa

Zadnji korak koji je potrebno napraviti jest rekonstrukcija tablice uvezenih funkcija

programom Import REConstructor Nakon učitavanja odabire se blaexe na popisu

aktivnih procesa te se u polje OEP upisuje adresa izvorne polazišne točke bez

baze U ovom slučaju adresa sa bazom jest 49DB40 Vrijednost bez baze koja će

biti upisana u polje OEP jest 9DB40 kako prikazuje slika 57 Klikom na gumb IAT

AutoSearch dobiva se obavijest o pronalaženju izvorne polazišne točke

Slika 57 ndash Pronalaženje izvorne polazišne točke

48

Nakon toga tablica uvezenih funkcija rekonstruira se klikom na gumb GetImports

Nakon klika na gumb GetImports u polju Imported Functions Found prikazuje se

popis uvezenih funkcija kao što prikazuje slika 58 Nakon rekonstruiranja tablice

uvezenih funkcija potrebno je još samo kliknuti na gumb Fix Dump kojim se

rekonstrukcija provodi do kraja Otvara se izbornik u kojemu je potrebno odabrati

datoteku dumpexe koja sadrži PE zaglavlje popravljeno programom LordPE u

prethodnom koraku

Slika 58 ndash Rekonstruirana tablica uvezenih funkcija

Datoteka koja je konačni rezultat svih ovih koraka sadrži ručno raspakirani

ucjenjivački program BandarChor

55 Metode koje otežavaju analizu

U ovom podpoglavlju opisane su metode koje otežavaju analizu programima za

ispravljanje pogrešaka (engl anti-debugging techniques) Opisane su samo

metode koje se najčešće koriste

551 Provjera zastavice NtGlobalFlag

Zastavica NtGlobalFlag nalazi se u bloku okoline procesa (engl Process

Environment Block PEB) Blok okoline procesa je struktura podataka koju interno

koristi operacijski sustav i sadrži globalni kontekst procesa početne parametre

49

adresu baze programa (engl image base address) te objekte koji se koriste za

međusobno isključivanje (engl mutual exclusion) procesa [8] Svi dijelovi bloka

okoline procesa nisu dokumentirani Dijelovi koji jesu dokumentirani su sljedeći

Typedef struct _PEB

BYTE Reserved1[2]

BYTE BeingDebugged

BYTE Reserved2[1]

PVOID Reserved3[2]

PPEB_LDR_DATA Ldr

PRTL_USER_PROCESS_PARAMETERS ProcessParameters

BYTE Reserved4[104]

PVOID Reserved5[52]

PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine

BYTE Reserved6[128]

PVOID Reserved7[1]

ULOND SessionId

PEB PPEB

Zastavica se nalazi na pomaku 0x68 kod 32-bitne inačice Windowsa i na pomaku

0xBC kod 64-bitne inačice Ova zastavica spada u nedokumentirane vrijednosti

bloka okoline procesa Vrijednost te zastavice obično je nula Ukoliko je vrijednost

navedenih memorijskih lokacija 0x70 tada je proces pokrenut programom za

ispravljanje pogrešaka Program za ispravljanje pogrešaka stvara gomilu na

drugačiji način te vrijednost 0x70 čine sljedeće tri postavljene zastavice

FLG_HEAP_ENABLE_TAIL_CHECK (0x10)

FLG_HEAP_ENABLE_FREE_CHECK (0x20)

FLG_HEAP_VALIDATE_PARAMETERS (0x40)

Provjerom ove tri zastavice može se potvrditi prisutnost programa za ispravljanje

pogrešaka Provjera se može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX FS[30h] adresa bloka okoline procesa

MOV AL [EAX+68h] NtGlobalFlag

AND AL 70h

CMP AL 70h

JE DebuggerDetected

Ova tehnika se može zaobići ručnim mijenjanjem navedenih zastavica ili

korištenjem dodataka (engl plug-in) za program za ispravljanje pogrešaka [1]

50

552 Provjera zastavice ProcessHeap

Zastavica ProcessHeap nalazi se u bloku okoline procesa na pomaku 0x18

Ovdje se nalaze polja čija vrijednost otkriva prisutnost programa za ispravljanje

pogrešaka prilikom stvaranja gomile (engl heap) Ta polja poznata su pod

nazivima ForceFlags na pomaku 0x10 i Flags na pomaku 0x0C Provjera se

može obaviti sljedećim odsječkom asemblerskog koda

MOV EAX LARGE FS[30h]

MOV EAX DWORD PTR [EAX+18h]

CMP DWORD PTR DS[EAX+10h] 0

JNE DebuggerDetected

Ova tehnika također se može zaobići ručnim mijenjanjem zastavice

ProcessHeap ili korištenjem dodataka za program za ispravljanje pogrešaka

553 Provjera vremenskih oznaka

Provjerom vremenskih oznaka (engl timestamp) može se utvrditi brzina izvođenja

programa Program koji se analizira izvodi se sporije Jedna inačica ove metode

može se opisati sljedećim koracima

izračuna se prva vremenska oznaka

obavi se proizvoljan broj instrukcija

izračuna se druga vremenska oznaka

dvije vremenske oznake se uspoređuju

ukoliko postoji veća razlika program se izvodi u programu za ispravljanje

pogrešaka

Vremenske oznake se također mogu računati prije i poslije obrade iznimke

Programi koji se analiziraju programima za ispravljanje pogrešaka iznimku će

obrađivati znatno dulje

Instrukcija kojom se može provesti ova provjera jest RDTSC s mnemonikom

0x0F31 Vrijednost koju vraća jest broj vremenskih jedinica od trenutka pokretanja

operacijskog sustava [1] Provjera se obavlja izvođenjem ove instrukcije dva puta i

usporedbom dobivenih vremenskih oznaka

Dvije funkcije iz Windows API koje rade na sličan način kao instrukcija RDTSC su

QueryPerformanceCounter i GetTickCount Može ih se izbjeći

postavljanjem prekidne točke iza bloka instrukcija u kojem se pozivaju ili

ubacivanjem instrukcije JUMP prije njihovog poziva kako bi se blok instrukcija u

kojem su pozvane preskočio

51

554 Provjera zastavice BeingDebugged

Zastavica BeingDebugged spada u dokumentirani dio bloka okoline procesa

kao što je vidljivo u opisu strukture bloka okoline procesa u odjeljku 551 Lokacija

bloka okoline procesa sprema se u registar EAX dok se u registar EBX sprema

vrijednost registra EAX na pomaku uvećanom za 2 koji odgovara lokaciji zastavice

BeingDebugged Nakon toga se provjerava je li vrijednost pohranjena u registru

jednaka nuli Program za ispravljanje pogrešaka je prisutan ako je vrijednost

različita od nule Provjera se može provesti sljedećim odsječkom asemblerskog

koda

MOV EAX DWORD PTR FS[30h]

MOV EBX BYTE PTR [EAX+2]

TEST EBX EBX

JZ NoDebuggerPresent

Ova tehnika može se zaobići ručnim postavljanjem zastavice BeingDebugged na

nulu ili ručnim mijenjanjem zastavice koja određuje je li vrijednost nula (engl zero

flag)

555 Provjera tragova na operacijskom sustavu

Programi za ispravljanje pogrešaka ostavljaju tragove svoje aktivnosti na

operacijskom sustavu Može se provjeriti sljedeći registarski ključ

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug

Ovaj registarski ključ sadrži naziv programa za ispravljanje pogrešaka koji se

pokreće prilikom pogreške bilo koje aplikacije na sustavu Može se tražiti nazive

mapa datoteka i izvodivih programa povezanih s programima za ispravljanje

pogrešaka ili se može koristiti poziv funkcije FindWindow sa imenom programa

za ispravljanje pogrešaka kao parametrom

Ukoliko se koriste programske prekidne točke može se tražiti vrijednost

mnemonika 0xCC koja označava vrijednost instrukcije INT 3 Ova tehnika može

se izbjeći korištenjem sklopovskih prekidnih točaka umjesto programskih

556 Korištenje lokalnog prostora dretve

Lokalni prostor dretve (engl Thread Local Storage TLS) služi za inicijalizaciju

podataka specifičnih za određenu dretvu prije njenog pokretanja [8] Inicijalizacija

se provodi korištenjem statičkog međuspremnika koji se kopira na dinamički

alociranu memoriju ili izvođenjem koda u polju povratnih poziva (engl callbacks)

kako bi se dijelovi memorije dinamički inicijalizirali Adresa povratnog poziva može

52

pokazivati izvan slike programa (engl image) na primjerice novo učitanu

dinamičku biblioteku To se može napraviti neizravno učitavanjem dinamičke

biblioteke i zapisivanjem povratne adrese u polje povratnih poziva lokalnog

prostora dretve Ovo se može iskoristiti za zaobilaženje prevencije izvođenja

podataka (engl Data Execution Prevention)

Povratni pozivi lokalnog prostora dretve izvode se prije nego što program za

ispravljanje pogrešaka preuzme kontrolu nad programom koji se izvodi Na ovaj

način povratni poziv može maknuti prekidnu točku sa polazišne točke programa

Kako bi se ovo izbjeglo potrebno je postaviti prekidnu točku na prvi bajt prvog

povratnog poziva lokalnog prostora dretve Ovime se programu za ispravljanje

pogrešaka omogućava preuzimanje kontrole nad programom prije nego se bilo

kakav kod uspio izvesti

Lokalni prostor dretve može se uočiti alatom PEview jer će u zagljavlju datoteke

PE postojati tls sekcija kao što je vidljivo na slici 59

Slika 59 ndash Sekcija tls u zagljavlju datoteke PE

557 Otkrivanje sklopovskih prekidnih točaka

Prilikom generiranja iznimke operacijski sustav stvara kontekstnu strukturu (engl

context structure) koju će proslijediti za obradu iznimki Ta struktura sadržava

vrijednosti generalnih registara kontrolnih registara i registara koji se koriste

prilikom ispravljanja pogrešaka (engl debug registers) Registri za ispravljanje

pogrešaka sadržavaju vrijednosti koje otkrivaju prisutnost programa za ispravljanje

pogrešaka ukoliko se koriste sklopovske prekidne točke Provjera se izvodi

53

izazivanjem iznimke pomoću INT 3 te nakon toga izvođenjem sljedećeg odsječka

asemblerskog koda

MOV EAX [ESP+0Ch] dohvaćanje kontekstne strukture

MOV ECX [EAX+4] registar Dr0

OR ECX [EAX+8] registar Dr1

OR ECX [EAX+0Ch] registar Dr2

OR ECX [EAX+10h] registar Dr3

JNE DebuggerPresent

54

6 Simulator ucjenjivačkih programa

U sklopu predmeta bdquoDiplomski projektldquo implementiran je simulator ucjenjivačkih

programa u programskom jeziku Java

61 Opis simulatora

Postoje dva programa od kojih jedan predstavlja klijenta (odnosno računalo

zaraženo ucjenjivačkim programom) a drugi predstavlja poslužitelja Program

nakon pokretanja korisniku prikazuje poruku u obliku kriptirane slike uz obavijest

karakterističnu za ucjenjivačke programe (engl ransom note) u kojoj se korisnika

informira o tome da su njegovi podaci (u ovom slučaju poruka koju želi vidjeti)

kriptirani i da mora tražiti odgovarajući ključ za dekriptiranje od poslužitelja ukoliko

želi dekriptirati podatke i vidjeti poruku Obavijest ima ponuđene opcije bdquodaldquo i bdquoneldquo

Korisnik ima dvije mogućnosti

Odabrati opciju bdquodaldquo nakon čega će se poslati zahtjev poslužitelju za

odgovarajućim ključem za dekriptiranje U ovom slučaju poslužitelj će

poslati ključ kojim će se poruka (slika) dekriptirati i nakon toga prikazati

korisniku

odabrati opciju bdquoneldquo nakon čega se prekida klijentski program kao i

komunikacija sa poslužiteljem

62 Tehničke značajke

Simulator se sastoji od programa klijenta koji predstavlja računalo zaraženo

ucjenjivačkim programom i programa poslužitelja Oni komuniciraju preko

priključnice (engl socket) Poslužitelj sluša na vratima (engl port) s brojem 9090

a IP adresa koja se navodi prilikom inicijalizacije priključnice jest 0000 što

označava bilo koju IP adresu na kojoj su dostupna navedena vrata

Komunikacija se sastoji od niza dogovorenih kodova između klijentskog i

poslužiteljskog programa Kodovi i njihovo značenje dani su u tablici 11

Tablica 61 ndash kodovi i njihovo značenje

1 Klijent zahtijeva poslužiteljev javni ključ

2 Klijent šalje poslužitelju simetrični ključ kriptiran poslužiteljevim javnim ključem

3 Klijent zahtijeva od poslužitelja simetrični ključ

4 Klijent želi prekinuti komunikaciju

55

Prilikom pokretanja program poslužitelja prvo generira par ključeva algoritmom

RSA ndash svoj javni i privatni ključ Kada klijent zatraži poslužiteljev javni ključ putem

odgovarajućeg koda poslužitelj mu ga šalje u obliku bdquosirovihldquo bajtova Klijent iz tih

bdquosirovihldquo bajtova koristeći ugrađenu funkciju razreda KeyFactory rekonstruira

poslužiteljev javni ključ oblik koji se može koristiti za kriptiranje

Klijent nasumično generira simetrični ključ algoritmom AES Taj ključ se zapisuje u

polje bajtova i kriptira se poslužiteljevim javnim ključem Polje bajtova koje se šalje

poslužitelju sastoji se od koda opisanog u tablici 1 (to je kod sa brojem 2) i bajtova

kriptiranog simetričnog ključa Poslužitelj kada primi to polje nakon parsiranja

dolazi do bajtova kriptiranog simetričnog ključa te ih dekriptira svojim privatnim

ključem Dekriptirani simetrični ključ potom se pohranjuje kod poslužitelja i čeka se

dok ga klijent ponovno ne zatraži Nakon što je poslužitelju poslao kriptirani

simetrični ključ klijent kriptira poruku simetričnim ključem Odmah nakon što se

kriptiranje obavilo klijent briše sve ključeve koje je u tom trenutku imao

(poslužiteljev javni ključ generirani simetrični ključ kojim je kriptirao poruku te

kriptirani simetrični ključ koji je poslao poslužitelju) Ovaj korak je vrlo važno izvesti

odmah nakon kriptiranja kako bi se otežalo otkrivanje ključeva putem reverznog

inženjeringa Ključevi moraju obavezno biti izbrisani iz memorije inače će ih biti

moguće bdquoizvućildquo praćenjem instrukcija asemblerskog koda Ključevi se nebi morali

brisati kad bi postojao neki mehanizam zaštite ključeva Neki ucjenjivački programi

štite ključeve korištenjem kriptografije eliptičnih krivulja (engl Elliptic Curve

Cryptography) te kombiniranjem nekoliko vrsta kriptorgrafskih algoritama

Kriptirana poruka koja je u obliku slike tada se mora prikazati korisniku Prilikom

kriptiranja originalna slika kriptirana je u potpunosti zajedno sa svojim zaglavljem

(engl header) Slika je u formatu BMP (engl bitmap) što je u zaglavlju označeno

heksadekadskim vrijednostim 42 4D kao što je prikazano na slici 11

Sliku nije moguće otvoriti bilo kojim programom za pregled slike niti ikako prikazati

ukoliko nema odgovarajuće zaglavlje Stoga se kod kriptirane slike pojavio

problem prikaza te iste slike korisniku To je riješeno tako da se bajtovi kriptirane

slike predaju klasi CreateImageFromBytes koja se nalazi na klijentu Funkcija

koju ta klasa sadržava vraća podatak koji je tipa BufferedImage Taj podatak se

nakon toga predaje funkciji ImageIO koja podatku tipa BufferedImage dodaje

zaglavlje tipa BMP te se tako omogućava prikaz kriptirane slike Ovaj problem

može se izbjeći kriptiranjem samo bdquosirovihldquo bajtova slike (engl raw bytes) U ovom

slučaju zaglavlje bi ostalo netaknuto te bi time gore opisani problem bio izbjegnut

Uz kriptiranu sliku korisnik dobiva i obavijest u kojoj ga se informira o tome da je

njegova poruka kriptirana snažnim RSA i AES algoritmima te da je neće moći

vidjeti ukoliko ne zatraži odgovarajući ključ za dekriptiranje od poslužitelja

Ponuđene su mu oprije bdquodaldquo i bdquoneldquo

56

Slika 61 ndash Zaglavlje slike u formatu BMP

Ukoliko je korisnik odlučio da želi vidjeti dekriptiranu poruku odabire opciju bdquodaldquo

kod obavijesti ucjenjivačkog programa Klijent tada poslužitelju šalje kod sa brojem

3 što označava da želi simetrični ključ kako bi mogao dekriptirati poruku

Poslužitelj šalje klijentu dekriptirani simetrični ključ koji je pohranio kod sebe u

prethodnom koraku Nakon što je ponovno dobio simetrični ključ klijent dekriptira

poruku i konačno je prikazuje korisniku

Kad je korisnik pročitao poruku i zatvorio prozor na kojemu je poruka prikazana

poslužitelju se šalje kod s brojem 4 koji označava prekid komunikacije s

poslužiteljem i zatvaranje priključnice

Cijeli ovaj postupak grafički je prikazan na dijagramu na slici 62

63 Upute za korištenje

Potrebna su dva terminala jedan za klijentski i jedan za poslužiteljski program

Prvo se pokreće poslužiteljski program u prvom terminalu a potom se pokreće

klijentski program u drugom terminalu

U terminalima se ispisuje tijek komunikacije između klijenta i poslužitelja Nakon

pokretanja korisniku se prikazuje kriptirana slika i obavijest ucjenjivačkog

programa koja mu nudi opciju želi li zatražiti odgovarajući ključ za dekriptiranje od

poslužitelja Ova situacija je prikazana na slici 31

57

Slika 62 - Kriptirana poruka i obavijest ucjenjivačkog programa

Ako korisnik odabere opciju bdquodaldquo prikazuje mu se dekriptirana poruka što se vidi

na slici 63

Slika 63 - Prikaz dekriptirane poruke

Tijek komunikacije u terminalu poslužiteljskog programa vidljiv je na slici 64

58

Slika 64 - Komunikacija u terminalu poslužiteljskog programa

Tijek komunikacije u terminalu klijentskog programa vidljiv je na slici 65

Slika 65 - Komunikacija u terminalu klijentskog programa

Analiza stvarnog ucjenjivačkog programa i usporedba sa ovim simulatorom bit će

opisane u sljedećim poglavljima

59

Slika 62 ndash Komunikacija između programa klijenta i programa poslužitelja

60

7 Analiza ucjenjivačkog programa

U ovom poglavlju opisana je analiza zlonamjernog programa ručno raspakiranog u

podpoglavlju 54

71 Osnovne značajke

Kao što je već spomenuto radi se o ucjenjivačkom programu BandarChor

Postupak širenja zaraze i tok izvođenja vidljivi su na slici 71

Slika 71 ndash Način rada ucjenjivačkog programa BandarChor

Zlonamjerni program na sustav dolazi porukom elektroničke pošte koja sadrži

zaraženi privitak ili alatima koji iskorištavaju ranjivosti (engl exploit kit) sa

zaraženih internetskih stranica Provjera programom PEiD potvrđuje da je

zlonamjerni program sada raspakiran te da je pisan u programskom jeziku Delphi

PEiD ima dodatak za detekciju kriptografskih algoritama pod nazivom Krypto

ANALyzer odnosno KANAL Korištenjem ovog dodatka uočena je prisutnost tri

kriptografska algoritma kako prikazuje slika 74

Slika 72 ndash Kriptografski algoritmi detektirani dodatkom KANAL

61

Rijndael je izvorno ime za kriptografski algoritam AES Vidljivo je na kojim

memorijskim adresama se koristi Iz toga se može zaključiti da će podaci biti

kriptirani kriptografskim algoritmom AES te da će se na jednoj od navedenih

memorijskih adresa ili u neposrednoj blizini nalaziti rutina za kriptiranje odnosno

dekriptiranje podataka

Programom PEview može se potvrditi da je za drugi sloj pakiranja kod ovog

zlonamjernog programa bio korišten program UPX jer su imena sekcija ostala

označena kako je već spomenuto u ranijim poglavljima Može se uočiti i dodatna

sekcija naziva mackt kako se vidi na slici 73

Slika 73 ndash Pokazatelji pakiranja programom UPX

Pregledom znakovnih nizova koje je ispisao program Strings može se uočiti da se

radi o vrsti zlonamjernog programa koja se spaja na Internet i komunicira sa

upravljačkim poslužiteljem Mogu se uočiti neke funkcije karakteristične za mrežno

programiranje u programskom jeziku Delphi Neke od tih funkcija su

EidConnClosedGracefully

EidSocketHandleError

EidPackageSizeTooBig

EidNotAllBytesSent

EidCouldNotBindSocket

EidCanNotBindPortInRange

EIdCannotSetIPVersionWhenConnected

Daljnjim pregledom na slici 74 mogu se uočiti znakovni nizovi koji opisuju

uspostavu mrežne komunikacije s poslužiteljem pregovaranje između

internetskog preglednika i poslužitelja adresa upravljačkog poslužitelja te adresa

elektroničke pošte koja će se koristiti za kontaktiranje autora zlonamjernog

programa u svrhu plaćanja bdquootkupnineldquo za kriptirane datoteke

62

Slika 74 ndash Znakovni nizovi koji opisuju mrežnu aktivnost

Može se naći i popis ekstenzija datoteka koje zlonamjerni program može kriptirati

72 Provjera mutanta

Pokretanjem zlonamjernog programa programom za ispravljanje pogrešaka

OllyDbg i analizom početnog niza instrukcija može se vidjeti provjera unaprijed

kodirane (engl hardcoded) vrijednosti koja predstavlja mutanta (engl mutant)

Mutant je malo izmijenjena inačica istog programa Ovom provjerom zlonamjerni

program provjerava je li operacijski sustav već zaražen To se može vidjeti na slici

75 Znakovni niz koji predstavlja vrijednost mutanta vidljiv je i na slici 74 Ovime

se saznalo čemu taj znakovni niz stvarno služi ndash informacija koju jednostavna

statička analiza nije mogla pružiti

001 ace bup bvd cng cryptra dco enx fdp jac jbc kbb nba pkey rzx safe sde

sgz sle sme vhd wallet wbb wbcat win 113 1cd 3gp 73b a3d abf abk accdb arj

as4 asm asvx ate avi bac bak bck bkf cdr cer cpt csv db3 dbf doc docx dwg

erf fbf fbk fbw fbx fdb gbk gho gzip iv2i jpeg jpg key keystore ldf m2v m3d

max mdb mkv mov mpeg nbd nrw nx1 odb odc odp ods odt old orf p12 pdf

pef ppsx ppt pptm pptx pst ptx pwm pz3 qic r3d rar raw rtf rwl rx2 sbs sldasm

sldprt sn1 sna spf sr2 srf srw tbl tib tis txt wab wps x3f xls xlsb xlsk xlsm xlsx

zip

63

Slika 74 ndash Provjera zaraženosti sustava pomoću mutanta

Na slici 74 vidljivo je postavljanje tri vrijednosti na stog prije poziva funkcije

OpenMutexA Kako bi se razumjelo što one znače potrebno je pogledati koje

argumente funkcija OpenMutexA mora imati prilikom svojeg poziva

HANDLE WINAPI OpenMutex(

_In_ DWORD dwDesiredAccess

_In_ BOOL bInheritHandle

_In_ LPCTSTR lpName

)

S obzirom da stog prvo pristupa vrijednosti koja je zadnja postavljena na njega

argumenti su postavljeni instrukcijom PUSH u obrnutom redosljedu

lpName predstavlja ime mutanta

bInheritHandle određuje hoće li procesi stvoreni od strane ovog

procesa naslijediti držač (engl handle)

dwDesiredAccess opisuje prava pristupa koja će mutant imati

Vrijednost 1F0001 označava MUTEX_ALL_ACCESS što znači da će mutant

imati sva prava pristupa

73 Prikupljanje informacija o zaraženom sustavu

Nakon provjere mutanta ukoliko se ispostavi da sustav nije već zaražen

zlonamjerni program počinje prikupljati informacije o zaraženom operacijskom

sustavu kao što se vidi na slici 75 Analizom pozivanih funkcija mogu se vidjeti

prikupljene vrijednosti

id predstavlja niz od 10 nasumično odabranih znamenki

pc predstavlja ime zaraženog računala

tail predstavlja ekstrenziju koju će imati kriptirane datoteke

Na kraju se može vidjeti adresa upravljačkog poslužitelja

hxxpintelligence1938[]com na koju će se spojiti zlonamjerni program u svrhu

razmjene ključeva Prikupljene vrijednosti postavljaju se na stog kao što prikazuje

slika 76 Promatranjem stoga odozdo prema gore može se vidjeti konstukcija

64

ekstenzije kriptiranih datoteka označena gore spomenutom vrijednošću tail Prvo

se konstruira vrijednost id koja sadrži 10 nasumično odabranih znamenki i

postavlja na stog zatim se postavlja ime zaraženog računala i na kraju se

postavlja adresa elektroničke pošte koju će žrtve biti upućene koristiti u svrhu

pregovaranja oko bdquootkupnineldquo za svoje kriptirane podatke

Slika 75 ndash Prikupljanje podataka o zaraženom sustavu

Na samom vrhu stoga može se vidjeti pridruživanje prikupljenih vrijednosti

oznakama id pc i tail

Slika 76 ndash Pridruživanje prikupljenih podataka oznakama

Sve prikupljene vrijednosti koristit će se kao POST zahtjev upravljačkom

poslužitelju pomoću kojeg se započinje pregovaranje u svrhu razmjene ključeva

65

Na stogu se vide svi prikupljeni podaci i adresa na upravljačkom poslužitelju gdje

su pohranjeni ključevi Stanje stoga vidljivo je na slici 77

Slika 77 ndash Sadržaj POST zahtjeva i adresa za dohvat ključeva

U vrijeme izvođenja ove analize upravljački poslužitelj je bio onemogućen te stoga

se komunikacija nije mogla uspostaviti Neuspjeli DNS zahtjev uhvaćen je

programom za analizu mrežnog prometa Wireshark i prikazan na slici 78

Slika 78 ndash Neuspjeli DNS zahtjev prema upravljačkom poslužitelju

74 Proces kriptiranja

Daljnjim pregledom koda u programu za ispravljanje pogrešaka iza bloka

instrukcija vezanih za uspostavu komunikacije sa upravljačkim poslužiteljem može

se uočiti rutina za kriptiranje Rutina je prikazana na slici 79

Slika 79 ndash Rutina za kriptiranje

U registar ECX sprema se heksadekadska konstanta 3E80 koja predstavlja broj

bajtova svake datoteke koji će se kriptirati U dekadskom sustavu to je 16000

bajtova te se iz toga može zaključiti da će zlonamjerni program kriptirati prvih

toliko bajtova svake datoteke čiju ekstenziju podržava Nakon toga se pozivaju

funkcije FileSeek i FileWrite koje obavljaju pristupanje dijelovima datoteka

koji će biti kriptirani i zapisivanje rezultata kriptiranja u datoteku

Nekoliko instrukcija iza rutine za kriptiranje može se naći poziv funkcije koja

obavlja kriptiranje algoritmom AES Funkcija je prikazana na slici 710 Unutar tog

bloka instrukcija mogu se vidjeti još dva poziva na još dvije funkcije koje također

sudjeluju u implementaciji algoritma AES i procesu kriptiranja Adresa na kojoj

počinje blok prvog poziva jest 496480 što se vidi i na slici 710 Na slici 72 u

66

prethodnom odjeljku može se vidjeti da se algoritam AES referencira na adresama

4964E1 i 497CDC čime se potvrđuje da taj dio koda zaista obavlja kriptiranje

Rutina za dekriptiranje ne postoji u ovom zlonamjernom programu Autori

zlonamjernog programa upućuju žrtve da ih kontaktiraju putem elektroničke pošte

nakon čega se žrtvi šalju informacije o plaćanju otkupnine Nakon plaćanja

otkupnine autori žrtvi šalju svoj alat kojim će dekriptirati svoje podatke Zbog ovog

načina rada zlonamjerni program obavlja samo kriptiranje

Slika 710 ndash Funkcije koje sudjeluju u kriptiranju

75 Uklanjanje tragova

Nakon kriptiranja podataka zlonamjerni program se briše Brisanje se izvodi

pomoću posebne batch skripte koja obriše zlonamjerni program a potom i samu

sebe Zlonamjerni program u toku svojeg izvođenja stvara batch skriptu koja

sadrži kod za brisanje i zove se cleenbat Skripta se stvara funkcijom

CreateProcess Instrukcije povezane s ovim procesom vidljive su na slici 711

Batch skripta uvijek ima veoma sličan oblik i slijedi sljedeći niz koraka

odredi lokaciju na disku gdje se nalazi zlonamjerni program

provjeri postoji li zlonamjerni program na toj lokaciji na disku

izbriši zlonamjerni program sa diska

nakon brisanja zlonamjernog programa izbriši i samu sebe

Na slici 711 vidi se kako zlonamjerni program nakon stvaranja batch skripte

otvara komandnu liniju (engl command prompt) kako bi se batch skripta mogla

67

pozvati i izvesti Proces komandne linije zatim koristi funkciju

SetDispositionInformationFile koja omogućava brisanje zlonamjernog

programa nakon njegovog završetka

Svrha ove metode jest otežavanje analize i brisanje tragova zlonamjerne aktivnosti

na operacijskom sustavu Pokretanje u svrhu dinamičke analize može se provesti

samo jednom međutim tragovi izvođenja mogu se vidjeti u datotekama koje

sadrže putanje do datoteka kojima je program pristupao prilikom svog pokretanja

(engl prefetch files) Te datoteke na operacijskom sustavu Windows nalaze se

najčešće u kazalu CWindowsPrefetch Analizom te datoteke vezane uz

proces komandne linije može se uočiti pristupanje batch skripti u privremenom

kazalu (engl temporary folder)

Slika 711 ndash Batch skripta za brisanje zlonamjernog programa

68

76 Izrada otiska

Informacije prikupljene u prethodnim potpoglavljima opisuju svojstva i način

ponašanja ucjenjivačkog programa Na temelju tih informacija može se napisati

otisak koji može biti ugrađen u bazu otisaka antivirusnih programa YARA pravilo

prikazano je na slici 712

Slika 712 ndash YARA pravilo za ucjenjivački program BandarChor

Prvi uzorak binarnih podataka koji se provjerava jest niz instrukcija prikazan na

slici 710 i taj niz heksadekadskih vrijednosti nazvan je

$encryption_algorithm Pristunost rutine za kriptiranje sa pozivom dviju

dodatnih funkcija prepoznatljivo je svojstvo ovog zlonamjernog programa Drugi

uzorak ima naziv $check_mutant i sadrži heksadekadske vrijednosti niza

instrukcija prikazanih na slici 74 Treći uzorak ima naziv $self_delete i sadrži

heksadekadske vrijednosti niza instrukcija koji opisuju mehanizam kojim se

zlonamjerni program briše pomoću batch skripte i koje su prikazane na slici 711

Uvjet je zadovoljen kad su sva tri uzorka pronađena

69

8 Usporedba ucjenjivačkih programa sa simulatorom

U poglavlju 6 opisan je simulator ucjenjivačkih programa koji implementira neke

općenite značajke ponašanja prisutne kod većine ucjenjivačkih programa

Simulator prvo prikazuje kriptiranu sliku i korisniku nudi bdquoucjenuldquo

Korisnik mora odabrati opciju bdquodaldquo ukoliko želi vidjeti sliku koja sadrži bdquotajnu

porukuldquo

u suprotonom program se prekida

Ucjena kod stvarnih ucjenjivačkih programa jest plaćanje određenog novčanog

iznosa u zamjenu za ključ kojim će se dekriptirati žrtvini podaci Simulator

implementira samo ovaj osnovni koncept dok pravi ucjenjivački programi sadrže

dodatna svojstva koja su opisana u narednim podpoglavljima

81 Vrsta programskog jezika

Većina zlonamjernih programa pisana je u programskom jeziku C ili C++

Simulator je pisan u programskom jeziku Java što ima neke ozbiljne nedostatke U

4 poglavlju spomenuto je da Java spada u skupinu interpreterskih jezika te stoga

postoji međukorak prevođenja u skup instrukcija koje kasnije izvodi interpreter

Jedna posljedica toga jest sporost Programski jezici C i C++ nemaju taj

međukorak te je stoga prevođenje i izvođenje programa pisanih u njima brže

Brzina je posebno važna za implementaciju kriptografskih funkcija s obzirom da su

one procesorski veoma zahtjevne Programi pisani u programskom jeziku Java

mogu se obraditi pomoću programa za prevođenje na viši programski jezik (engl

Java decompiler) te se tako može doći do izvornog koda simulatora a za

zlonamjerne programe to predstavlja velik propust jer olakšava analizu reverznim

inženjerima

82 Mogućnosti upravljanja memorijom

Prilikom pisanja programa u programskim jezicima C i C++ programer mora sam

voditi računa o raspolaganju memorijom procesima i dretvama Programer može

upravljati alociranjem dealociranjem i oslobađanjem memorije Nakon što se

obavi proces kriptiranja podataka potrebno je ukloniti tragove zlonamjerne

aktivnosti kako bi se otežala analiza Ključevi se moraju izbrisati iz memorije

odmah nakon korištenja kako ih se nebi moglo izvući iz memorije korištenjem

programa za ispravljanje pogrešaka Ovo se odnosi na ključeve koji nisu dobro

zaštićeni Programski jezik Java nema tu slobodu upravljanja memorijom nego se

koristi sakupljač smeća (engl garbage collector) koji uklanja memoriju koju ne

koristi niti jedan objekt Sakupljač smeća koristi vlastite algoritme i programer ga

70

ne može eksplicitno bdquoprisilitildquo na oslobađanje memorije Posljedica ovoga bi moglo

biti predugo zadržavanje ključeva u memoriji

83 Mehanizam održavanja

Ucjenjivački program mora izvesti proces kriptiranja u cijelosti ukoliko želi ostvariti

uvjete za uspješnu ucjenu Zbog toga se mora osigurati mehanizam održavanja

(engl persistance mechanism) koji će nastaviti proces kriptiranja ukoliko žrtva

ponovno pokrene operacijski sustav i prekine zlonamjerni program prije nego se

do kraja izvršio To se može postići dodavanjem registarskog ključa u skupinu

HKLMSoftwareMicrosoftWindowsCurrentVersionRun čime se

osigurava pokretanje zlonamjernog programa prilikom svakog ponovnog

pokretanja operacijskog sustava Simulator nema implementiran ovaj mehanizam

te bi se stoga proces kriptiranja mogao prekinuti ponovnim pokretanjem

operacijskog sustava čime bi pokušaj bdquoucjeneldquo propao

84 Brisanje tragova i kopija

Nakon kriptiranja datoteka izvorne datoteke se brišu dok na operacijskom sustavu

ostaju samo njihove kriptirane inačice Izmijenjene ili izbrisane datoteke mogu se

vratiti u prvobitno stanje pomoću sigurnosnih kopija koje sadrže prethodne inačice

datoteka (engl previous versions shadow copies) Ucjenjivački programi stoga

brišu kopije sa prethodnim inačicama datoteka naredbom vssadminexe

Delete Shadows All Quiet Na ovaj način žrtvu se prisiljava na plaćanje

otkupnine ukoliko želi dobiti ključ za dekriptiranje svojih datoteka Simulator briše

izvornu sliku samo sa diska ali ne provjerava postoje li prethodne inačice te slike

te može li se slika vratiti pomoću njih U prethodnom poglavlju opisan je i

mehanizam kojim se zlonamjerni program briše sa zaraženog operacijskog

sustava pomoću batch skripte Simulator ne posjeduje niti taj mehanizam

85 Upravljanje ključevima

Simulator kriptira samo jednu datoteku (sliku) tako da generira samo jedan

simetrični ključ Kad bi kriptirao više datoteka bilo bi potrebno generirati zasebni

simetrični ključ za svaku od njih Neki ucjenjivački programi kao što je primjerice

Sage implementiraju zaštitu ključeva pomoću algoritma eliptičnih krivulja (engl

Elliptic Curve Cryptography ECC) i time omogućavaju rad zlonamjernog programa

bez komunikacije sa upravljačkim poslužiteljem Simulator mora komunicirati sa

upravljačkim poslužiteljem te kao posljedica toga ovisi o tome je li računalo žrtve

spojeno na Internet

71

9 Zaključak

Zlonamjerni programi stalno evoluiraju te stoga metode napada postaju sve

naprednije Usporedno s time razvijaju se sve naprednije metode zaštite i

prevencije od novih napada zlonamjernih programa Područje analize

zlonamjernih programa stoga je vrlo dinamično i izazovno U ovom radu opisane

su vrste analize od jednostavnijih prema složenijima Svaka vrsta analize

popraćena je konkretnim primjerom Jednostavna statička analiza predstavljena je

analizom pojednostavljenog pakiranog zlonamjernog programa Jednostavna

dinamička analiza predstavljena je analizom zlonamjernog programa koji služi

dohvaćanju trojanskog konja Napredna statička analiza predstavljena je analizom

zlonamjernog RTF dokumenta koji zloupotrebljava ranjivost u kontrolama ActiveX

Napredna dinamička analiza predstavljena je ručnim raspakiravanjem

ucjenjivačkog programa i analizom raspakiranog ucjenjivačkog programa

korištenjem programa za ispravljanje pogrešaka u mnemoničkom obliku Prikazan

je i postupak izrade otisaka pomoću alata YARA Može se reći da je reverzno

inženjerstvo jednim dijelom inženjerska disciplina a drugim dijelom umjetnost zbog

toga što je potrebno smisliti kreativne načine zaštite od jednako kreativno

konstruiranih sigurnosnih napada U borbi protiv informatičkih prijetnji sudjeluju ne

samo reverzni inženjeri nego i korisnici koje je potrebno educirati o potencijalnim

opasnostima koje donose zlonamjerni programi te kako se od tih opasnosti mogu

zaštititi

72

LITERATURA

[1] M Sikorski i A Honig Practical Malware Analysis The Hands- On Guide To

Dissecting Malicious Software San Francisco no starch press 2012

[2] Mamci URL httpenwikipediaorgwikiHoneypot_(computing)

[3] Povijest metoda obfuskacije (1 dio) URL

httpblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_1_of

_2

[4] Povijest metoda obfuskacije (2 dio) URL

httpsblogsciscocomsecuritya_brief_history_of_malware_obfuscation_part_2_o

f_2

[5] YARA URL httpsvirustotalgithubioyara

[6] Članak o ucjenjivačkom programu BandarChor URL

httpsreaqtacom201603bandarchor-ransomware-still-active

[7] Mehanizam brisanja pomoću batch skripte URL

httpjourneyintoirblogspothr201401malware-and-self-deleting-batch-filehtml

[8] P Ferrie The bdquoUltimateldquo Anti-Debugging Reference 2011

[9] E Eilam Reversing Secrets of Reverse Engineering Indianapolis Wiley

Publishing Inc 2005

[10] SHA1 kolizija URL httpssecuritygoogleblogcom201702announcing-first-

sha1-collisionhtml

[11] DAME URL httpviruswikidotcomdark-avenger-mutation-engine

[12] Programi za pakiranje RunPE URL

httpinterestingmalwareblogspothr201007unpacking-vbinjectvbcryptrunpehtml

Statička i dinamička analiza zlonamjernih programa

Sažetak

Nove sigurnosne prijetnje pojavljuju se svakog dana i metode napada su sve

kompleksnije Potrebno je razviti nove metode zaštite i prevencije sigurnosnih

napada Važnu ulogu u tom procesu ima analiza zlonamjernih programa Opisane

su metode statičke i dinamičke analize od jednostavnijih ka složenijima Svaka

metoda analize potkrijepljena je konkretnim primjerom analize zlonamjernog

programa Naglasak u ovom radu stavljen je na analizu ucjenjivačkih programa

Prikazana je cjelokupna metoda analize ucjenjivačkog programa od ručnog

raspakiravanja preko jednostavne statičke analize pa sve do napredne statičke i

dinamičke analize korištenjem programa za ispravljanje pogrešaka Opisane su

razlike između simulatora i stvarnih ucjenjivačkih programa kao i postupak izrade

otiska pomoću alata YARA

Ključne riječi zlonamjerni program statička analiza dinamička analiza

ucjenjivački program YARA pravilo

Static and dynamic malware analysis

Abstract

New security threats emerge every day with newer and more complex methods of

attacking Development of new methods of prevention and protection is needed

Malware analysis plays an important role in that process Methods of static and

dynamic analysis are described from simple to more complex ones Every method

of analysis is followed by concrete example of malware analysis In this thesis the

emphasis has been on ransomware analysis The complete ransomware analysis

is shown from manual unpacking and simple static analysis to advanced static

and dynamic analysis with the debugger Differences between simulator and

actual ransomware are described along with making patterns using YARA tool

Keywords malware static analysis dynamic analysis ransomware YARA rule

Page 18: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 19: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 20: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 21: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 22: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 23: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 24: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 25: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 26: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 27: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 28: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 29: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 30: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 31: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 32: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 33: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 34: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 35: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 36: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 37: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 38: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 39: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 40: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 41: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 42: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 43: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 44: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 45: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 46: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 47: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 48: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 49: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 50: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 51: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 52: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 53: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 54: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 55: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 56: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 57: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 58: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 59: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 60: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 61: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 62: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 63: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 64: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 65: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 66: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 67: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 68: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 69: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 70: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 71: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 72: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 73: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 74: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 75: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 76: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća
Page 77: STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH ...sigurnost.zemris.fer.hr/ns/malware/2017_dabelic/Staticka...stanja memorije, registara i stoga (engl. stack). Dinamička analiza obuhvaća