STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH...
Transcript of STATIČKA I DINAMIČKA ANALIZA ZLONAMJERNIH...
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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