Malware Analizi 0X02 | Basic Static Analiz
Merhaba, “Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software” kitabından aldığım notlarımı parçalar halinde paylaşmaya Basic Static Analiz ile devam ediyorum. Malware analizi 0x01 yazıma buradan ulaşıp okuyabilirsiniz. Bu bölümde konuyu;
— Antivirüs araçları kullanarak yazılımdaki kötü niyetliyi bulma
— Hash kullanarak zararlı yazılımları doğrulamak
— Dosyanın fonksiyonlarından, başlığından ve yazı tipinden bilgi toplamak
başlıkları altında ele alacağım.
Antivirüs ile Tarama
Antivirüs programları bir bakıma zararlı yazılımları engelleyebilirler fakat tam anlamıyla mükemmel çalışmazlar. Antivirüsler, veritabanlarındaki kod parçaları üzerinde tarama yaparak, malware davranışları ve desen eşleştirme ile zararlı yazılım olup olmadığını kontrol eder. Buradaki problem ise saldırgan kolaylıkla kodda değişiklik yaparak programın imzasını değiştirerek antivirüslerden kaçınabilir. Nadir görülen ve daha önce hiç benzeri bulunmayan zararlı kodlar da antivirüsten rahatça geçer çünkü veritabanına kayıtlı değillerdir.
Virustotal gibi siteler malware için çoğu antivirüs programında tarama yaparak sonuçları gösterir.
Hashing ile
Zararlı yazılımın hashini alarak bu aldığınız unique hashi online olarak taratıp zararlı olup olmadığını kontrol edebilirsiniz ve bu hashi paylaşarak zararlı olduğunu bildirebilirsiniz. WinMD5 gibi uygulamalar ile hashini alabilir ve taramasını yapabilirsiniz.
Stringler ile
Stringler ile zararlı hakkında birçok bilgi alabiliriz. Bu nedenle Stringler bizim için önemli bir rol oynar. Bir program stringi ile yazılımın ne iş yaptığını, hangi mesajları yazdırdığını, URL bağlantılarını ya da kopyalanan dosyaların yolunu öğrenebiliriz. Stringler ASCII ve Unicode formatında bulunabilir. Bu nedenle bunları da çözümlememiz gerekebilir.
ASCII ve Unicode kavramlarını biraz daha yakından inceleyelim. ASCII de her karakter için 1 byte, Unicode de her karakter için 2 byte kullanılır.
Yukarıdaki resimde BAD kelimesinin ASCII formatta yazılmış halini görmektesiniz.
Bu resimde ise aynı kelime (BAD) unicode formatta yazılmıştır.
Strings kullanarak yazılıma string taraması yapabiliriz. strings, ASCII ve Unicode stringleri içinde arama yaptığında analiz yapmadan direkt olarak 3 veya daha fazla harfli kelimeleri döndürüyor. Bazen string taraması memory adres ve CPU talimatları gibi şeyler döndürebilir. Bunların filtrelemesini kullanıcıya bırakır. Eğer string gereğinden kısa ve bir anlamı yoksa büyük ihtimalle anlamsızdır.
Yukarıdaki resimde görüldüğü gibi bir yazılımın string değerlerini görüyoruz. Birlikte analizini yaparak programın amacını öğrenelim. Bu değerleri analiz etmeye kısa ve anlamsız olanlarını elemekle başlıyoruz. Bunlar büyük ihtimalle işimize yaramayacak olanlardır. Geriye kalan satırları numaralandırıp ele alırsak, 1 ve 2 numaralı stringler yüksek ihtimalle windows fonksiyonlarıdır. Bu kanıya birleşik şekilde bulunan iki kelimenin baş harflerinin büyük olmasından varıyoruz. Bu windows fonksiyonları da işimize yaramayacağından eliyoruz.
3. seçeneğe bakınca DLL uzantılı bir dosya olduğunu görüyoruz. Bu dosyanın işimize yarayacağını düşünüp bir kenara alıyorum. Cebimizde kalsın. 4. seçeneğe baktığımızda ise karşımıza bir IP adresi çıkıyor. Zararlının kullandığı IP adresinin bu olduğunu düşünüyoruz ve son olarak 5. seçeneğe bakınca herşey yerine oturuyor. En çok işimize yarayacak bu kısımda zararlının bir DLL uzantısı kullanarak mail gönderdiğini öğreniyoruz.
Email loglarını inceleyerek diğer kullanılan DLL ler de incelenebilir. Fakat dikkat edilmesi gereken asıl zararlıların her zaman DLL dosyaları olmadığıdır. Zararlı yazılım DLL dosyasını da kullanabilir.
Paketlenmiş ve Gizlenmiş Malware
Malware yazarları, zararlının tespit edilmesini zorlaştırmak için paketleme ve gizleme yollarına başvurur. Her iki teknik de bizleri analiz yaparken oldukça zorlayacaktır.
Zararsız yazılımlar genellikle birçok string içerirler. Gizlenmiş veya paketlenmiş zararlılar ise çok az string içerirler. Eğer zararlıyı analiz etmeye başlarsanız elinizde inceleme yapacağınız pek bir string yok ise büyük ihtimalle bu zararlı paketlenmiş veya gizlenmiştir ve bunu detaylı araştırmak için statik analiz yeterli olmayacaktır.
Dosyaları Paketleme
Paketlenmiş yazılım çalıştığında arka tarafta küçük sarmalayıcı (wrapper) program çalışarak paketlenmiş yazılımı açıp, paketlenmemiş şekilde çalıştırır. Paketlenmiş programı statik olarak analiz etmek istediğimizde ulaşabileceğimiz tek veri sarmalayıcı program olacaktır ve sadece onu analiz edebiliriz.
Resimde de gördüğünüz gibi orijinal dosyada verilere ulaşmamız mümkünken sağ taraftaki sarmalayıcı (wrapper) programa baktığımızda herhangi bir veriye ulaşmamız statik analiz araçları ile çok mümkün değildir.
PEID ile paketleyiciyi analiz etmek
Paketlenmiş dosyayı analiz etmek için bir yol daha bulunuyor. Bu da PEID programı ile gerçekleştiriliyor. Paketleyicinin veya derleyicinin tipini öğrenmek için PEID programı kullanılabilir. Bu bilgi analizi daha kolay bir hale getirir.
PEID programını kullandığımızda, dosyanın UPX 0.89.6–1.02 veya 1.05–2.90 tarafından paketlendiğini söylüyor. UPX hakkında detaylı bilgi ileri kısımlarda anlatılacaktır.
Bir program paketlenmişse, analiz edebilmek için paketi açmak gerekir. Paket açma işlemi oldukça komplex ve kapalı birşeydir. İlerleyen bölümlerde açıklanacaktır. UPX oldukça popüler ve kullanımı basit bir programdır. Örneğin UPX kullanarak bir paketi açmak aşağıdaki gibidir.
upx -d PackedProgram.exe
NOT: Birçok PEID programında zafiyet bulunmaktadır. Örneğin PEID 0.92 versiyonu buffer overflow zafiyeti içermektedir. Akıllı bir malware yazarı, malware içine bu zafiyeti sömürecek kodda ekleyebilir. Bu nedenle kullandığınız PEID versiyonunun son sürüm olmasına dikkat edin.
Çalıştırılabilir Dosya Formatları
Şimdiye kadar dosya formatına bakmadan çalışan araçları inceledik. Analizde dosya formatları da oldukça önemli olabiliyor. Dosya formatları programların fonksiyonları hakkında bilgileri ortaya çıkarabiliyor.
Taşınabilir yürütebilir dosya (The Portable Executable) formatları, Windows programları, kodları ve DLL’leri tarafından kullanılmaktadır. PE (The Portable Executable) dosya formatı, windows işletim sistemi yükleyicisinin sarılmış yürütülebilir kodu yönetmesi için gerekli bilgileri içeren bir veri yapısıdır. Şuan windowsta yürütülebilen hemen hemen bütün dosyalar PE formatındadır.
PE dosyaları kod hakkında bilgi ve kütüphane fonksiyonları hakkında bilgiler içeren header ile başlar. PE header, malware analisti için harika haberler içerir.
Bağlantılı kütüphaneler ve fonksiyonları
İmport ile bir program birçok farklı programın fonksiyonlarını kullanabilir. Linking ile birçok program ile bağlantı kurulabilir. Kütüphane kodları statik, dinamik ve çalışma zamanında (runtime) linking edilebilir. Kütüphane kodlarının nasıl bağlandığı bizim malware’i anlamamızda çok kritiktir çünkü bu bilgi bize PE dosya headeri ile kütüphane kodunun nasıl bağlandığını gösterir. Sıradaki bölümde bunun için kullanılan araçları tartışacağız.
Statik, Çalışma Zamanında ve Dinamik Linking
Statik linking, kütüphane linking için en az kullanılan metottur. Genellikle linux ve unix sistemlerde kulllanılır. Bir kütüphane statik olarak zararlıya bağlandığında, kütüphanenin bütün kodları zararlıya kopyalanır ve zararlının kendi kodu olup olmadığını ayırt edemezsiniz. PE headerı da bu bilgiyi içermez.
Çalışma zamanında linking de genelde kullanılan yollardan biridir. Özellikle paketlenmiş ve gizlenmiş zararlılar da çok kullanılır. Program çalıştığı gibi kütüphaneler eklenmez. Sadece gerekli fonksiyonlarda çağrılırlar. Dinamik Linking de olduğu gibi sadece işi olduğunda gelir.
Birkaç Windows fonksiyonu, programın headerında belirtilmeyen kütüphanelere erişmesine olanak tanır. Bunlar LoadLibrary ve GetProcAdress’dir. Bunlar zararlının sistemdeki herhangi bir kütüphaneye erişmesine izin verirler. Bu, fonksiyonlar kullanıldığında zararlının nasıl bir linking yaptığını öğrenemeyeceğimiz anlamına geliyor.
Bütün metotlar içinden dinamik linking en çok kullanılan metot ve malware analistler için en ilgi çekici yöntemdir. Dinamikte, program kütüphaneyi çağırdığında hangi fonksiyon ile çalıştırıldığını öğrenmiş oluyoruz.
Dependecy Walker ile Dinamik Linking Fonksiyonlarının Keşfi
Dependency Walker programı, dosyanın sadece dinamik olarak bağlantılı olan fonksiyonlarını gösterir.
Yukarıdaki resimde Dependecy Walker programının arayüzü bulunuyor. PAYLOAD.EXE adında bir zararlı eklediğim arayüzde bazı numaralar bulunmakta. 1 Numara zararlımızın adını veriyor bizlere. 2 Numara ise import ettiği DLL dosyalarını bizlere gösteriyor. Herhangi birine tıkladığınızda, 3 numarada bu DLL dosyasının import ettiği fonksiyonlar resimdeki gibi gözükür. Bu kısmı detaylı inceleyerek zararlının amacını anlayabiliriz. Örneğin bizim zararlımız dosya kopyalama ve yeni bir directory oluşturma işlemleri gerçekleştiriyor. 4 numaralı bölüm ise DLL dosyamızın import edebileceği fonksiyonları gösteriyor. Burası bizim için en önemsiz yer. Son olarak 5 ve 6 numaralı bölümler ise zararlı çalıştıktan sonra yüklenecek olan DLL dosyalarını ve oluşacak hataları listeliyor.
Bir programın DLL dosyaları programın bütün işlevi hakkında bilgi verir. Aşağıdaki tabloda bazı DLL dosyaları ve açıklamaları bulunuyor.
PE Dosya Başlığı ve Bölümleri
PE (The Portable Executable) dosya başlıkları, içe aktarılan fonksiyonlardan çok daha fazla bilgi aktarabilir. Başlıklar, dosyalar hakkında metadatalar da içerir. Dosya başlıklarının bölümlerini dikkatlice incelediğimizde çok önemli bilgilere ulaşabiliriz. PE dosyasının en ilgi çekici bölümlerini ele alacak olursak;
.text Bölümü CPU’nun yürüttüğü talimatları içerir. Sadece bu bölüm execute edilebilir ve kod içeren tek bölüm olmalıdır.
.rdata Bölümü ise genelde import ve export bilgilerini içerir. Bu bilgilere Dependency Walker ve PEview ile ulaşılabilir. Bu bölüm aynı zamanda diğer read-only verileride bir program kullanarak depolayabilir.
.data Bölümü program hakkındaki genel verileri içerir. Hangi verinin programın neresine erişebileceği gibi bilgileri içerir.
.rsrc Bölümü execute dosyasının kullandığı fakat kabul etmediği kaynakları içerir. İkonlar, fotoğraflar, menüler gibi.
Yukarıdaki tablodan PE dosyasının diğer bölümleri hakkında bilgi alabilirsiniz.
PEview ile PE dosyalarını incelemek
PE (The Portable Executable) dosya formatlarının başlıkları içinde çok ilginç bilgilere ulaşılabilir. PEview aracını kullanarak bu bilgileri daha yakından inceleyeceğiz.
Yukarıdaki görselde PEview aracının arayüzü görülmektedir. 1 numaralı kısımda PE başlığının (header) ana parçaları görülmektedir. IMAGE_FILE_HEADER seçili olduğundan dolayı vurgulu olarak gözükmektedir. İlk iki seçenek yani IMAGE_DOS_HEADER ve MS-DOS-Stub Program tarihsel şeylerdir ve bizim için ilgi çekici bilgiler içermezler. IMAGE_NT_HEADERS ise NT (Windows NT Startup File) başlığını gösterir. Bu bölümün altındaki kısımlara bakacak olursak, Signature yani imza kısmı sürekli aynıdır. İşimize yarar bir bilgi alamayız. IMAGE_FILE_HEADER kısmına geldiğimizde görselde ekranın sağ tarafındaki bilgiler görülüyor. 2 numaralı alanda dosya hakkında basit bilgiler veriliyor. 3 numaralı alanda ise bu dosyanın ne zaman derlendiğini görebiliriz. Bu malware analizi için oldukça önemli bir bilgidir.
Örneğin derlenme tarihi eski ise bu bize bunun eski bir atak olduğunu gösterir ve antivirüs programlarının bu yazılımın imzasını içerebileceğini anlıyoruz. Eğer derlenme zamanı yeni bir tarih ise bu da bize tam tersi bir bilgi sağlar.
Bunun yanında bazı hatalara düşmemek gerekir. Bütün Delphi programları 19 Haziran 1992 derleme tarihini kullanır. Bu tarihli bir derleme tarihine sahip program görürseniz bu büyük ihtimalle delphi programıdır ve bu programın gerçek derlenme zamanını bilmediğimiz anlamına gelir. Malware yazarları rahatlıkla derleme zamanını değiştirebilir yani anlamsız bir derleme tarihi görürseniz bu büyük ihtimalle sahte bir tarihtir.
IMAGE_OPTİONAL_HEADER bölümü birkaç önemli bilgi içerir. Örneğin programın bir GUI program veya konsol program olup olmadığını buradan anlayabiliriz.
En ilginç bilgileri IMAGE_SECTION_HEADER bölümlerinden alabiliriz. Bu bölümler PE dosyasının her bir bölümünü açıklarlar.
Görselde 1 numaralı kısıma bakarsak Virtual Size bölümünde processin yüklenme süresinde hafızada ne kadar alan tahsis edilmiş bunu öğrenebiliriz. 2 numaralı kısımda ise programın diskte ne kadar büyüklükte alana sahip olduğunu gösterir. Bu iki değeri karşılaştırdığımızda neredeyse aynı değeri vermeliler. Ufak farklılıklar normaldir. Farklılık olması durumunda ise bazı durumlar ortaya çıkabilir.
Örneğin virtual size, Size of Raw Data değerinden büyük olursa buradan dosyanın hafızada diskten daha fazla yer ayırttığını anlarız. Bu da bize dosyanın paketlenmiş olabileceğini gösterir.
Fakat aradaki dosya boyutunda fark göremezsek bu bizi yanıltmasın çünkü bu dosyanın zararlı olmadığı anlamına gelmez sadece paketlenmemiş olduğu anlamına gelir.
Basic Static analiz buraya kadardı. Umarım açık bir şekilde anlatabilmişimdir. Geri dönüş verirseniz ona göre kendimi geliştirebilirim. Diğer bölümde Basic Dinamic Analizi göreceğiz. O zamana kadar kendinize iyi bakın.
Kişisel Web sitem: berkanturel.me