Malware Analizi

İlk önce “Malware nedir?” sorusu ile başlayalım.

Malware, MALicious SofWARE (kötü niyetli yazılım) kelimelerinden türetilmiş bir sözcüktür. Adından da anlaşılacağı gibi kötü bir amacı hedefleyen yazılımlardır.

Virüs, Trojan(Truva Atı), Backdoor(Arka Kapı), Adware, Scareware gibi kötücül yazılımlar malware olarak adlandırılmaktadır. Dünya geneli olarak backdoor, adware ve ransomware türleri diğer türlerden daha fazla bulunmaktadır. Bu 3 malware türünün ne yaptığını isterseniz kısa bir şekilde açıklayayım.

  • Backdoor: Kötü niyetli yazılımın yüklü olduğu bilgisayarda bir arka kapı bırakarak hacker’ın o bilgisayara daha sonra erişmesini ve istediği gibi kullanmasını sağlar. Bu gibi malware ler genel olarak crack dosyalarının içine saklanır. Bu şekilde olabildiğince fazla sayıda kişiye bulaşmasına neden olur.
  • Adware: Bilgisayarınızda reklamlar görüntülemek ve arama geçmişinizi veya kişisel bilgilerinizi reklam sitelerine göndermek gibi amaçları vardır.
  • Ransomware: Son birkaç yıldır dünya gündeminde yer edinen bir malware türüdür. Kullanıcının bilgisayarındaki verileri şifreler ve şifreyi çözmek karşılığında kullanıcıdan fidye isteyen yazılımlardır.

Malware analizi de bu kötü niyetli yazılımların çeşitli araçlar ve yöntemler kullanılarak incelenmesine denir. Eğer bir malware’in analizi yapılmaz ise o malware’e karşı ne gibi önlemler alınacağı bilinemez ve böylece malware sürekli yayılmaya devam eder.

Malware analizini yapacak kişi network, cryptology, assembly, dosya yapıları ve sistemin çalışma yapısını bilmek zorundadır. Yani Malware Analizi için bu konuları öğrenmek iyi bir başlangıç olacaktır. Ayrıca malware analizi yapacak kişi ilkyardımda olduğu gibi ilk önce kendini güvence altına almalıdır. Bunun için iç ve dış ağlardan bağımsız sanal makineler aracılığı ile incelenmelidir.

Malware analizinde çeşitli araçların kullanıldığını söylemiştik. Şimdi ise bu araçlardan biraz bahsedelim.

1)Debuggers

Debuggerlar bir programın veya işletim sisteminin çalışmasını adım adım izlememize ve değiştirmemize olanak sağlayan ve programın çalışma zamanındaki register ve stack i gözetleme ve kontrol etmemizi sağlayan yazılımlardır. Genel olarak kullanılan debugger lar şunlardır:

  1. IDA Debugger
  2. Immunity Debugger
  3. OllyDbg(Yazının sonundaki örnekte bu debugger ı kullanacağız.)
  4. Windbg

2)Disassembler

Bu yazılımlar programı disassembly işleminden geçirerek programın assembly kodu şeklinde gösterilmesini sağlar. Bu şekilde programın içerisindeki stringleri, çağrılan fonksiyonları ve programın akış şeklini rahatça görebilmemize olanak sağlar.

Programın grafik şeması, renklendirme gibi sebeplerden dolayı yaygın olarak IDA Disassembler kullanılır.

3)PE Editor

İçinde önemli bilgiler barındıran Windows’un çalıştırılabilir dosya formatının(Portable Executable, PE) PE Headerlarını incelememize olanak sağlar. Bunun için LordPE, Detect It Easy, PE Studio, PeID gibi araçları kullanabiliriz.

4)Hex Editor

Hex editörlerinin hızlı kod analizi, byte değiştirmek gibi faydaları vardır. HxD gibi bir araç işimizi görecektir.

5)Ekstralar

Malware incelemek sadece assembly kodlarından ibaret değildir. Malware’in oluşturacağı network trafiğini incelemek, malware in oluşturduğu işlemlere bakmak ve malware in disk üzerinde bıraktığı dosyaları analiz etmekte gerekiyor. Bunun için aşağıdaki araçlardan yararlanılabilir.

  1. Process Monitor : Malware in oluşturduğu/değiştirdiği dosyaları/işlemleri gözlemlemek için kullanılabilir.
  2. Wireshark : Network trafiğini analiz etmek için kullanılabilir.

Çok basit bir zararlı yazılımı incelemek için bu araçlar yeterli olacaktır fakat ihtiyaca göre bu sayı artacaktır.

Şimdi ufaktan temel dosya yapısı, register ve stack yapısı hakkında biraz bilgi verelim.

Portable Executable File Format (PE Dosya Yapısı)

Bu Microsoft’un, dosyaların başka bilgisayarlarda da çalışabilmesi için geliştirdiği bir dosya yapısıdır. .exe, .dll, .drv” gibi bir çok dosya uzantısında kullanılır. Malware analizi yapacak kişinin bu dosya yapısını çok iyi bir şekilde bilmesi gerekmektedir. Şimdi dosya yapısına göz atalım.

PE dosya yapısı yukarıdaki şekildeki gibi başlıklardan ve bölümlerden oluşur. Bu kısımlar hakkında kısaca bilgi vermek gerekirse:

DOS Header(DOS Başlığı): Bu kısım uyumluluk için bulunuyor. Eğer PE dosyasını DOS sistemde çalıştırmaya kalkarsanız, program dos sisteminde çalışamaz şeklinde bir uyarı verip kapanır. DOS başlığı içerisinde bunu yapan ufak bir program bulunur.

PE Header(PE Başlığı): Bu başlık: veri ve kod bölümlerinin sayılarını, dosyanın hangi işletim sistemi için oluşturulduğu, zaman damgası, opsiyonel başlığın boyutunu ve diğer önemli bilgileri bulundurur. Malware analizi yapacak kişi bu başlığı bilmelidir. PE Studio, PE Browser gibi araçlarla incelenebilir.

Optional Header!(Opsiyonel Başlık!): Ünlem koymamın sebebi bu başlığın opsiyonel olmaması. Aksine çok önemli bilgileri barındıran bir başlıktır. Optional Header’ı PE Header’ın devamı gibi görebiliriz. Kod bölümünün boyutu, entry pointi(başlangıç adresini), kod bölümünün başladığı yeri, başlıkların boyutları gibi son derece önemli bilgileri barındırır. Malware analizi yapacak kişinin kesinlikle bu başlığı incelemesi gerekmektedir.

Section Table(Bölüm Tablosu): Section Table, bölümlerle ilgili bilgileri tutar. Bu tabloda bölümlerin Göreceli Sanal Adresleri(Relative Virtual Address) sıralanır.

Code Section(.text): Çalıştırılabilir kodların bulunduğu kısım.

Import Section: Programın ihtiyacının olduğu importların bulunduğu kısım.

Data Section(.data): İlk değer atanmış ve sabit değişkenlerin bulunduğu kısım.

PE dosya yapısına ufak bir göz atmış bulunmaktayız. Analiz yapacak kişi dosya yapılarını iyi bilmek zorundadır.

Şimdi register lardan bahsedelim.

Registers

İşlemcinin içerisinde bulunan, ufak boyutlu veri depolama alanlarıdır.

Programın çalışma zamanında bir değişkeni hard diske yazması zahmetli ve zaman gerektiren bir eylem olduğundan işlemci içerisinde bulunan bu register lara depolanır. Register ların yapısını ve bazı özel registerları inceleyelim.

Yukarıdaki fotoğrafta görüldüğü gibi genel amaçlı register lar 32bit uzunluğundadır.

  • EAX:Fonksiyon geri dönüş değerlerini tutar. Genel amaç içinde kullanılır.
  • EBX:Dizilerin adresini tutar. Genel amaç içinde kullanılır.
  • ECX:Sayaç işlemlerinde kullanılır. Genel amaç içinde kullanılır.
  • EDX:Genel amaçlı kullanılır.
  • EBP:Stack’in başlangıç adresini tutar.
  • ESP:Stack’in bitiş adresini tutar.
  • EIP:Execute edilecek bir sonraki instruction ın adresini tutar.
  • ESI:String işlemleri için kaynak indeksi tutar.
  • EDI:String işlemleri için hedef indeksi tutar.

Şimdi Stack’in ne olduğuna bakalım.

STACK

Program çalıştığı sırada geçici değişkenler, fonksiyon parametreleri, dönüş değerleri RAM’de ki bu alanda tutulur. Her thread in kendine ait bir stack alanı vardır. Bir fonksiyon oluşturulduğunda o fonksiyona ait stack alanı oluşur. Fonksiyon bitince stack alanı bellekten silinir ve yeni stack ona göre düzenlenir.

Stack, L.I.F.O(Last In Fırst Out, Son Giren İlk Çıkar) mantığıyla çalışır.

Stack’ e eleman eklendiğinde(PUSH komutu) ESP Register’ındaki değer azalır. Eleman çıkarıldığında ise ESP registerındaki değer artar.

ASSEMBLY

Assembly diline aşina olmak zorundayız. Çünkü C/C++ gibi dillerle yazılmış kodlar derlendiğinde, işlemcinin anlayabileceği 1 ler ve 0 lara dönüştürülür ve bizim bu 1 ler ve 0 ları anlayabileceğimiz seviyeye dönüştürmemiz şart. Dönüşüm yaptığımızda ancak assembly seviyesine kadar getirebiliyoruz. Bu yüzden assembly dilinin temellerini öğrenmemiz gerekiyor.

Her programlama dilinde olduğu gibi bir yazım stili var.

Yukarıdaki resimden anlatacak olursak: İlk önce komutumuz geliyor(mov), daha sonra hedef adres yada register ardından virgül ve kaynak adres yada register

Yukarıdaki kodu yazıya dökecek olursak: EAX registerına 5 değerini ata. Programlamaya çevirecek olursak :

eax = 5;
  • MOV komutu: Değer atama işlemini yapar.
  • ADD komutu: Toplama işlemi yapar.
  • SUB komutu: Çıkartma işlemi yapar.
  • MUL komutu: Çarpma işlemi yapar.
  • DIV komutu: Bölme işlemi yapar.
  • CALL komutu: Fonksiyon çağırmasını gerçekleştirir.
  • RET komutu: Fonksiyonu bitirir ve EAX registerı içerisinde değer döndürür.
  • CMP komutu: Karşılaştırma yapar.
  • JMP komutu: Direk atlama yapar.
  • JX komutu: CMP komutu sonrasında duruma göre atlama işlemi yapar.(X: A,B G,L)

Bu şekilde anlamamız biraz zor, örnek yapalım.

MalwareAnalizi

Satır satır inceleyelim kodu:

  1. Kodların çalıştığı bölüm(.text/.code)
  2. Programın ana fonksiyonu başladı.
  3. EAX registerına, 10000h(10000h = 65536) değeri atandı.
  4. EAX registerındaki değere 40000h(40000h = 262144) eklendi.
  5. EAX registerından 20000h(20000h = 131072) çıkarıldı.
  6. DumpRegs fonksiyonu çağırıldı.(Disassembler bunu kendi isimlendirmiş.)
  7. Çıkış yapıldı.
  8. Programın ana fonksiyonu sonlandı.

CMP ve JX instructionları ile ilgili daha detaylı bir açıklama yapmak gerekirse:

MalwareAnalizi

CMP komutunun karşılaştırma için kullanıldığını zaten söylemiştik. JX komutu ise bu karşılaştırma sonrasında karar vermek için kullanılıyor.

  • JE lokasyon: Eğer karşılaştırma eşit ise belirtilen lokasyona gider
  • JA lokasyon: Eğer karşılaştırma sonucu büyük ise belirtilen lokasyona gider
  • JB lokasyon: Eğer karşılaştırma sonucu küçük ise belirtilen lokasyona gider
  • JBE lokasyon: Eğer karşılaştırmanın sonucu küçük eşit ise belirtilen lokasyona gider
  • JNE lokasyon: Eğer karşılaştırma eşit değil ise belirtilen lokasyona gider

Basit bir malware incelemeden önce Packer‘ın ne olduğuna bakalım.

Packer

Packer bir programı şifreleme, sıkıştırma yada her iki algoritmayı kullanarak hem program üzerinde reversing işlemini zorlaştırmayı hemde antivirüsler tarafından yakalanmasını zorlaştırır. UPX, WinUpack, Armadillo gibi bir sürü packer mevcuttur. Bunların yanı sıra malware yazanlar kendi packerlarını yapıp bilinen unpack işlemlerinden kurtularak antivirüsleri atlatmayı başarmaktadırlar.

Son yıllarda banka ve kullanıcıların korkulu rüyası olan Cryptolocker ransomware’i kendi pack işlemini uyguladığından uzun bir süre boyunca analiz edilememiştir.

MALWARE

Elimizde Practical Malware Analiz kitabındaki Lab6-02.exe isimli bir malware var. İlk önce yapmamız gereken şey: Bu malware üzerinde packer kullanılıp kullanılmadığını ve malware in entry point adresinin ne olduğunu bulmak. Bunun için PeID aracını kullanıyoruz ve karşımıza şöyle bir ekran geliyor.

MalwareAnalizi

Gördüğünüz gibi normal bir programda linkerın ismi gözüken yerde “Nothing found *” yazısı yazıyor ve EB Section kısmında UPX1 yazıyor. Bu bize UPX packerının kullanıldığını söylüyor. Yinede biz malware in hex editördeki haline bir bakalım.

MalwareAnalizi

Hex görünümünde gördüğümüz gibi bölüm isimlerinde “UPX[bölümsayısı]” yazıyor. Artık UPX packerın kullanıldığını biliyoruz o yüzden malware in ismini “packed.exe” yapıyorum kolaylık olması için.

Şimdiki amacımız bu packing işlemini tersine çevirmek. Manuel çevirebileceğimiz gibi UPX packerı bize unpack seçeneği sunuyor. Manuel olarak çevirmek çok uzun süreceği için biz 2. seçeneği seçiyoruz. Unpack yapmak için şöyle bir komut girmek gerekiyor : “upx.exe -d packed.exe -o unpacked.exe”

MalwareAnalizi

Unpack işlemimiz başarılı. Şimdi klasörümüzde unpacked.exe isimli dosyamızın olması gerekiyor. Bu dosyayı PeID aracılığı ile açıp entrypoint adresini ve linkerı öğrenebiliriz.

MalwareAnalizi

Evet artık sonuç tatmin edici. Entrypoint adresimiz :11B0 ve gördüğümüz gibi Visual C++ 6.0 ile derlenmiş.

Bundan sonraki adımımız programımızı IDA Pro ile açıp stringlere göz gezdirerek malware imizin özelliklerini tahmin etmek olabilir. Fakat unutulmaması gereken şey bunun sadece tahmin olması. Yani stringlerde InternetOpenURL tarzı birşey görürsek bunun program tarafından kullanılmış olması gerekmez, iyice analiz etmemiz gerekiyor.

MalwareAnalizi

Yukarıdaki resimde görülen en alttaki stringler ilgi çekici. Malware imizin internete bağlanıp http://www.practicalmalwareanalysis.com”; adresi ile ilgili bir şey yaptığını tahmin edebiliriz ama bunu doğrulamak şart.

Şimdi sıra detaylı analize geldi ama bunu yaparken dikkatli olmalıyız yoksa kolaylıkla kaybolabiliriz.

PeID aracından entrypoint adresini öğrenmiştik. Analize başlama yerimiz entrypoint adresi olacak.

Entrypoint adresine gelip ufak bir göz gezdirdiğimizde 0040125F adresinde main fonksiyonumuzun çağrıldığını görüyoruz.

MalwareAnalizi

Main fonksiyonuna takip ettiğimizde 4 adet fonksiyonun çağırıldığını görüyoruz:_sub_401000, sub_401040, sub40117F, Sleep. IDA Pro Sleep fonksiyonunu kendi tanımlamış. Geri kalan 3 fonksiyonun ne yaptığını bizim tanımlamamız gerekiyor.

_sub_401000_

Ben ilk önce _sub401000 fonksiyonundan başlamak istiyorum. Bu fonksiyon hiç parametre almamış çünkü ne stack yardımı ile parametreler aktarılmış nede registerlar aracılığıyla parametre aktarılmış.

MalwareAnalizi
sub_401000

00401008 adresinde InternetGetConnectedState fonksiyonunun çağırıldığını görüyoruz. MSDN‘e(Microsoft Developer Network) göre bu fonksiyon 2 adet parametre alıyor ve internet bağlantısı olması durumunda 1 olmaması durumunda 0 döndürüyor.

0040100E adresinde bu dönüş değeri _var4 local değişkenine atanıyor ve 00401011 adresinde bu değer 0 ile karşılaştırılıyor. Eğer dönüş değeri sıfır ise (yani internet yok ise) program loc40102B adresine gidip “Error 1.1:No Internet” ekrana bastırıp geri dönüyor. Eğer dönüş değeri 1 ise ekrana “Success: Internet Connection”_ yazıp EAX registerındaki değeri 1 yapıp geri dönüyor.

Böylece sub_401000 ı analiz etmiş bulunuyoruz. Daha sonra karşılaşmamız durumunda aklımızın karışmaması için sub_401000 ı IsInternetConnection olarak yeniden adlandırıyoruz.

40113B adresinde IsInternetConnection fonksiyonundan dönen değeri _var4 local değişkenine atayıp yine 0 ile karşılaştırılıyor. Eğer 0 ise programımız sonlanıyor. Sıfır değil ise loc_401148 e gidiyor. Burada _sub401040 çağırılıyor.

Sırada sub_401040 ı incelemek var.

_sub_401040_

MalwareAnalizi
sub_401040

Burada birkaç fonksiyonun çağırıldığını görüyoruz. Bu fonksiyonların açıklamalarına _MSDN’_den bakalım.

  • InternetOpenA: WinInet fonksiyonlarının kullanılması için kullanılıyor.
  • InternetOpenUrlA: Parametre olarak verilen Url’i açar.
  • InternetCloseHandle: Bu fonksiyon tahmin edebileceğimiz gibi handle ı kapatıyor.

Şimdi analize başlayabiliriz.

InternetOpenA fonksiyonunda UserAgent Internet Explorer 7.5 olarak belirlenmiş ve dönüş değeri hInternet değişkeninde saklanmış. Daha sonra 401067 adresinde gördüğümüz gibi http://www.practicalmalwareanalysis.com/cc.htm”; url si InternetOpenUrlA fonksiyonuna parametre olarak verilmiş ve InternetOpenUrlA fonksiyonu çağırılmış. 401076 adresinde dönüş değeri(Eax registerında) hFile değişkeninde saklanmış. Dönüş değeri(hFile) sıfır olması durumunda “Error 2.1: Fail to open url” yazısı ekrana bastırılıp geri döndürülüyor. Eğer sıfırdan farklı bir değer ise programın akışı _loc40109D lokasyonuna gidiyor.

_loc40109D lokasyonunu detaylı bir şekilde incelemeyeceğim. Kısaca özetlersek hFile değişkeninde tutulan web sayfamızı okumaya çalışıyor. Eğer başarılı olursa _loc4010E5 lokasyonuna gidiyor.

_loc4010E5

Bu lokasyonda bir çok karşılaştırma işlemi yapılıyor. Bunları incelemeden önce nasıl göründüğüne bir bakalım.

MalwareAnalizi

Karşılaştırma işlemlerinde hexadecimal değerler kullanıldığı için bu şekilde görmemiz zor o yüzden bu değerleri ascii e çevirmek bize kolaylık sağlayacak.

  • 3Ch:<
  • 21h:!
  • 2Dh:-

Bu veriler html de yorum satırı yazmak için kullanılıyor. Bu kısımda aklıma malware bir html sayfasına gidip yorum satırındaki komutu alıp execute edebileceği aklıma geldi. Fakat dediğim gibi sadece bir tahmin. Bu tahmini doğrulamak için devamınıda analiz etmek gerekiyor.

_loc4010E5 karşılaştırma işlemi yapıyor analiz ettiğimize göre ve eğer bütün karşılaştırmalar true ise _loc40112C lokasyonuna gidiyor ve geri dönüş yapıyor.

_sub401040 ıda incelemiş bulunuyoruz. Kolaylık olması için “openRead” olarak adlandırdım.

Şimdi ise sırada _sub_40117F’_i incelemek var. Bunu detaylı incelemek biraz süreceği için size _sub_40117F’in “printf” fonksiyonu olduğunu belirteyim. “Success: Parsed Command is:”_ stringinden de anlayabiliriz zaten. Bu kısımda ekrana html sayfasındaki yorumlar arasına gizlenmiş komut yazdırılıyor.

Daha sonra Sleep fonksiyonuna 60000 parametresi aktarılıp, çağırılıyor. Sleep fonksiyonu milisaniye olarak parametre alıyor. Yani program burada 1 dakikalığına duruyor.

Programımızı başarı ile analiz etmiş bulunmaktayız. Programı özetlemek gerekirse; belirli bir html sayfasını açıp, yorumlar arasında gizlenmiş komutu ekrana bastırıp, 1 dakika durup kapanmak.

Analiz etmek çoğu zaman bu kadar kolay olmuyor. Bu örneğin amacı sadece nasıl analiz edebileceğimizi göstermek. Malware analizi üzerine daha fazla gitmek isterseniz size “Practical Malware Analysis” kitabını kesinlikle öneriyorum. Bu kitap sayesinde çoğu şeyi yapabilir hale gelebilirsiniz.

Bu uzun yazımı burada sonlandırıp, size keyifli analizler diliyorum.

Kaynaklar

https://msdn.microsoft.com/en-us/library/ms809762.aspx

Practical Malware Analysis

Be First to Comment

Leave a Reply to erupehonui Cancel reply

Your email address will not be published.