Malware Analysis - Static Analysis (Part 2)

Merhaba arkadaşlar Malware Analizi serimin ikinci part’ına hoşgeldiniz.

Bu part içerisinde bir Malware‘nin Statik analizinin nasıl yapacağını anlatacağım.

İleride ki part içerisinde Dinamik analizini anlatacağım.

Bu ikisini ayrı ayrı partlara bölmemin sebebi ikisininde tam olarak derinliklerine ineceğiz. Bu yüzden ikisini ayrı ayrı paylaşma gereği duydum.

Önceki part içerisinden Win 7 ve REMnux‘u kurduğunuzu aynı zamanda Network ve Snapshot ayarlarını gerçekleştirdiğinizi varsayıp devam ediyorum.

Bu yazımızda Sanal Makine kullanmayacağız. Çünkü Malware‘yi çalıştırmadan inceleyeceğiz. Yalnız ileride Dynamic Analysis yazımda artık bir kaç Malware çalıştırmaya başladığımızda Sanal Makine kullanacağımız için gerekli olacaktır.

Şimdi yavaştan yazımıza geçelim ve bir Malware‘nin Statik analizinin nasıl yapacağını anlatalım.

What The F!!K is packing and obfuscating ?

Bir Malware‘nin Statik analizini gerçekleştirmeye başlayacağımızda bakmamız gereken ilk noktalardan biri Pack ve Obfuscate terimleridir.

Hemen bu terimlere daha önce denk gelmeyen arkadaşlar için basitçe anlatayım.

Packing Nedir ?

  1. Dosya sıkıştırma denilebilir basit bir şekilde.

  2. Sıkıştırılan dosya kendi içinde aynı zamanda bu sıkıştırmayı çözmek için bir kod bulundurur.

  3. Genellikle packlenmiş yani sıkıştırılmış dosyalar bu packing’i kendi içinde çözmek için anahtarlar kullanır.

  4. Bir Zararlı Yazılım‘ı Pack‘lemenin asıl amacı Ana Kod‘u Sıkıştırdıktan sonra bu Zararlı Yazılım çalıştığında Sıkıştırılmış kodu Memory yani Hafıza içerisinde çözmektir.

  5. Bir Malware‘nin analizini engellemek için ve kafa karıştırmak için çokça kullanılan bir yöntemdir.

Bir Packing‘in Routine‘ini yani Rutin‘ini gösteren googleden bulduğum görsel :

Obfuscating Nedir ?

  1. İnsanların anlaması için zorlaştırma işlemi denilebilir basit bir şekilde.

  2. Bir kodu ne kadar daha az okuna bilir kılarsanız anlaşılmasıda zorlaşır buda bir Malware‘nin anlaşılmasını zorlaştıran bir yöntemdir.

  3. Örneğin elimizdeki isim değişkeni kod içerisinde vtkej12ns şeklinde göründüğünde bu değişkenin isim alanını tuttuğun anlamak zorlaşır ve buda Obfuscated bir değişkendir.

Örnek bir Obfuscate edilmiş kod :

Yukarıda bulunan resimdeki basit bir HTML ve Javascript kodunun ne kadar karmaşıklaştırıldığı anlaşılabilir durumda.

How to unpack and deobfuscate

Öncelikle aşşağıdakileri anlamakta zorluk çekebilecek arkadaşlarımız için bazı terimlerin türkçe karşılığını yazayım :

Portable Executable

Packer

Unpacker

PE Sections

Detecting packing and unpacking it

Detecting packing

Pack edilmiş bir Malware‘yi Unpack etmek yani çözmek ise bazen işin en kolay kısmı olabilirken en zor kısmıda olabilir.

Öncelikle pack edilmiş bir Malware‘nin hangi pack yazılımını kullandığını bulmamız gerek.

Fakat bunu gerçekleştirebilecek Yazılım‘ları göstermeye geçmeden önce önemli bir not eklemek istiyorum. Hangi pack bulma yazılımını kullanırsanız kullanın bu yazılımlar sadece bilinen Packer‘ların isimlerini tutuyor.

Dolayısı ile bulunamayan bir Packing işlemini anlamak için Portable Executable yani Çalıştırılabilir Dosya‘mızın PE Section‘larına bakmamız gereklidir.

Pack edilmiş bir Malware‘nin hangi Pack yazılımını kullandığını bulmak için bazı araçlar :

  1. RDG Packer Detector

  2. PEiD

Bu verdiğimiz toollardan eğer Malware‘nin Packer adını çıkarabilirseniz bu Packer‘in bir Unpacker‘ini bulmaya aramaya başlayabilirsiniz.

Eğer Packer adını verdiyse ve bu Packer için herhangi bir Unpacker bulunmuyorsa kendi ellerinizle işi bitirmeye kendinizi yavaştan hazırlamaya başlayın.

Packer‘in adını bulamadıysanız şayet Portable Executable içerisinde yani Malware‘miz içerisinde bir Packing işleminin gerçekleştiğini anlamak için PE Section‘larına bakmanız yeterli olacaktır.

Yukarıdaki fotorafta örnek bir Portable Executable‘nin UPX Packer ile Pack‘lendiğini görebiliriz.

Genellik ile normal bir PE‘nin içerdiği Section‘lar dışında Section‘lar içeren PE‘ler Packing işlemine tabir tutulduğunu ortaya dökmemiz için bir yoldur.

Ayrıca sadece Packing işlemi değil aynı zamanda bu Section‘lar içerisinden Zararlı Yazılım‘ın kendi içerisinden farklı bir yazılım çıkarttığı gibi değişik türde durumlara şahit olabilirsiniz.

Unpacking

Dosyanın yani Malware‘nin bir Packing işlemi içerdiğini anladıktan sonra kendi elimizle Unpack etmek için herhangi bir Debugger aracılığı ile Malware‘yi izleyip kendini Memory İçerisinde Unpack ettikten sonra Unpack edilmiş Kodu dışarıya bir .exe olarak aktarabiliriz.

Bir arkadaşımız Amber Packer adında bir Packing yazılımı geliştirdi. Yukarıda bahsettiğimiz toollardan neredeyse hepsi bunu bulamıyor.

Ve bulamamasına rağmen yukarıda bahsettiğim tekniği kullanıp bu Packing edilmiş dosyayı Unpack edip bunu blog yazısına döken sevdiğim bir arkadaşımın blog yazısı :

Amber unpacking

Detecting obfuscating and deobfuscating it

Detecting Obfuscating

Detecting kısmı çok basit.

Anlaşılabilir bir Kod ise şayet Obfuscated bir Kod değildir.

Anlaşılmaz bir Kod ise Obfuscated bir Kod olduğu söylenebilir.

Deobfuscating

Bir Obfuscated kodu Deobfuscate etmek için Değişkenlerin, Fonksiyonların neler yaptığını takip edip sonra yaptığı şeye göre tekrar isimlendirebilirsiniz.

Ya da internette bulunan Deobfuscation Tool‘larından yararlanabilirsiniz.

Buraya 13 tanesinin listelendiği bir forum post’unu bırakıyorum :

13 Deobfuscator Tools

Basit bir şekilde bir Malware‘nin yapılması gereken ilk iki Statik analizinden bahsettim.

Şimdi yavaştan Malware‘mizin diğer Statik analizlerini yapıp Zararlı yazılımımızı dahada yakından tanıyalım.

Linked Libraries And Functions

Bir Malware‘yi yani Zararlı Yazılım‘ı daha yakından tanımak için içerdiği Kütüphane ve Fonksiyon‘lara bakmamız yeterli olacaktır.

15 kilo dumbell’ı kanadıma çektikten sonra bu kısımı daha da derinden inceleyeceğiz.

Ve çokta zorlu olmayan setlerden sonra geldim.

Şimdi örnek bir Malware‘nin Kütüphane ve Fonksiyon‘larını listelemek için kendi yazdığım peanalyzer tool’unu kullanıp Malware‘miz neler yapıyor inceleyelim.

Tool’u indirdikten sonra :

python peanalyzer.py --file file.exe --show imports

Demeniz yeterli olacaktır.

Sonrasındaki çıktıda Kütüphaneler içerisinden Program içerisinde hangi fonksiyonların kullanıldığını listelemiş olacağız.

Bu bir Malware‘nin kullandığı fonksiyonlar değil yalnız bu Fonksiyonlar arasından ShellExecuteW, GetCurrentProcess gibi Fonksiyonlar genellik ile Malware‘ler tarafından kullanılıyor.

Burada objektif bir şekilde anlatıyorum size bunu. Artık siz kendi inceleyeceğiniz Malware‘yi daha yakından tanımak için neler yapmanız gerektiğini daha iyi anlayacaksınız.

Yani bir Zararlı Yazılım‘ın herhangi bir Internet Sayfasından dosya indirdiğini Fonksiyonlar aracılığıyla görmek mümkün.

Ve bu sayede kafanızda Zararlı Yazılım‘ın neler yaptığına dair kafamızda bir şema olacaktır.

Kütüphaneler‘in ve Fonksiyon‘ların Statik bir analiz içerisinde ne gibi büyük bir rol oynadığını bu şekilde anlayabilirsiniz.

Disassemble, Decompiling, Patching

Disassemble

Statik bir analiz içerisinde ayrıca Malware‘nin nasıl bir gidişat izlediğini görmek ve düzenlemek bize ayrıca büyük bir avantaj sağlar.

Yukarıda da kullandığımız peanalyzer tool’u yazılımları Disassemble etmemize yarıyor.

python peanalyzer.py --file file.exe --disassemble all

File.exe‘yi bir malware olarak düşünürsek şayet Assembly dilinde neler yaptığını incelememiz çok yararlı olacaktır.

Decompiling

Şayet bazı Malware‘leri Assembly değilde kendi dilinden okumak mümkün olabiliyor.

Örneğin bir C# ile yazılan Malware‘nin Kaynak Kod‘u verilmesede bazı araçlar ile o Kaynak Kod‘u almak mümkün.

Yani kısaca Compile edilip Assembly‘e çevirilen bir kodu tekrar eski haline çevirmek Decompiling oluyor.

Dahada kısaca aşşağıdaki fotorafı tersine çevirdiğinizde olan şey basit bir şekilde Decompiling.

Patching

Hex Code‘ları yani Shellcode‘ları ile oynama zamanı geldi demek bu.

Diyelim ki Zararlı Yazılım‘ı geliştiren kişi UploadFileToServer adında bir fonksiyon geliştirdi Program içerisinde.

Ve sizin bazı özel dosyalarınızı kendi Sunucu‘suna yüklüyor. Ve bu şekilde Sunucu‘dan direk bu dosyalara ulaşabiliyor.

Diyelim ki bu Fonksiyon 1 adet string alıyor parametre olarak. Ve bu parametrede yükleyeceği dosya olsun.

Ve bu parametreyide Zararlı Yazılım Geliştiricisi özel olarak secret.txt olarak atadı.

Şayet biz bunu program içerisinde Hex Code‘ları arasında değiştirip reverseshell.php adında kendi yazdığımız küçük bir Reverse Shell kodları içeren PHP dosyası ile değiştirdik.

Ve bilgisayarımızdan PORT‘u dinlemeye başladık.

Bu dosya Remote Server‘e yükleneceğinden. Zararlı Yazılım geliştiricisinin sunucusuna basit bir şekilde ulaşabileceğiz.

Ve basit bir şekilde Patching bu.

PE İçerisinden Alabileceğimiz Bilgiler

TimeDateStamp : Yazılan Program‘ın yani Zararlı Yazılım‘ın ne tarihte ve ne zamanda Compile edildiği bilgisini tutar.

Bu bilgi değiştirilebilirdir Expert Malware Developer arkadaşlarımız genellikle bunun yerine sahte bir bilgi koymayı tercih eder malum çok büyük bir yazılım ise şayet devlet baba uyumuyor.

Bunun dışında Yazılım‘ın hangi dil ile geliştirdiği,

Compiler olarak ne kullanıldığı dair tüm bilgileri içerir.

Windows‘un PE dökümantasyonu :

PE Format

Statik analiz için işimizi kolaylaştıracak kaynaklar ve birkaç tool

Genellikle kullandığım araçlar :

Güzel kaynaklar :

malwareanalysis.tools : Web sayfası içerisinden analizini yaptığınız malware için ne gerekiyorsa basit bir şekilde ulaşabilmenizi sağlayan yararlı bir sayfa.

awesome-malware-analysis : Güzel bir Cheat Sheet malware analizi için.

THE END

Umarım yazıyı okurken keyif almışsınızdır.

Sorular için twitter : 0DAYanc