VirtualMemory & PE File

Maveraün Nehr

Blue Team Expert
25 Haz 2021
975
1,861
41.303921, -81.901693

Portable Executable (PE) ~ Taşınabilir Yürütülebilir Dosya Nedir?


Windows işletim sistemlerinin 32 bit ve 64 bit sürümlerinde kullanılan yürütülebilir dosyaların bütününe denir. İçerisinde; .acm, .ax, .cpl, .drv, .efi, .mui, .ocx, .scr, .sys, .tsp, .dll ve .exe gibi uzantıları barındırır.

Not: Konu açılırken genelde winnt.h üzerinden gidilir, ben ana kavramlardan bahsedeceğim.

P.E. Dosya Formatı Neden Önemlidir?

Öncelikle Zararlı Yazılım Analizi ve Tersine mühendislik ile ilgilenen kişilerin kesinlikle bu dosya yapısını anlaması gerekiyor. Çünkü PE dosya formatındaki başlıklar o dosya ile ilgili kritik bilgiler içermektedir. Bu bilgilerden bazıları PE dosyasının yükleneceği makine türü, eğer çalıştırılabilen bir dosya ise programın entry point adresi, PE dosyasının oluşturulduğu tarih gibi önemli olabilecek bilgileri içerisinde barındırmakta.


P.E. Yapısı Görsel;


bp00wxe.png

Tanımlar;​

DOS: DOS başlığı esasen PE formatında geriye dönük uyumluluğu sağlamak için tutuluyor. Bu bölüm ile birlikte bir de DOS programı denilen bir program var. Eğer bu dosya DOS sisteminde çalıştırılırsa çalıştırılamayacağını belirtip kapanıyor.

PE(File) başlığı ve imzası: Bu başlığın hemen başında PE imzası denilen imza bulunuyor. (4 Byte uzunluğunda, değeri ise 45 50 00 00) Bu imzayı da PE başlığını doğrulamak için kullanabilirsiniz.

PE isteğe bağlı(!) başlığı (PE Optional Header): Başlığın ismi sizi yanıltmasın. Aslında hiç de isteğe bağlı bir başlık değil, aksine oldukça kritik bilgiler içeriyor. Bu yapının hem 64 bit hem de 32 bitlik versiyonu var. İlk stack boyutu, programın entry pointini, işletim sisteminin versiyonu gibi çok önemli bilgileri barındırır.


Bazı Sık karşılaşılan Terimler ve Tanımları;


  • WORD Machine; //Programın çalışması beklenen CPU
  • WORD NumberOfSections; //Section sayısı
  • DWORD TimeDateStamp; //Dosyanın üretildiği zaman
  • DWORD PointerToSymbolTable; //COFF sembol tablosuna gösterici
  • DWORD NumberOfSymbols; //Sembol tablosundaki sembol sayısı
  • WORD SizeOfOptionalHeader; //sizeof(IMAGE_OPTIONAL_HEADER)
  • WORD Characteristics; //Dosya hakkında bilgi
Machine

  • 0x014c -> Intel 386 (IMAGE_FILE_MACHINE_I386)
  • 0x0200 -> Intel 64 (IMAGE_FILE_MACHINE_IA64)
  • 0x01c0 -> ARM Little-Endian (IMAGE_FILE_MACHINE_ARM)
Characteristics

  • 0x0001 = relocation bilgisi eklenmemiştir.
  • 0x0002 = Dosya çalıştırılabilir bir dosyadır.
  • 0x0100 = Dosyanın çalıştırılacağı makina 32 bit işlemcili bir makinadır.
  • 0x2000 = Dosya bir dll dosyasıdır.
IMAGE OPTIONAL HEADER

Kritik bilgiler saklıdır. Stack boyutu, programın entry pointi, işletim sisteminin versiyonu gibi.

IMAGE OPTIONAL HEADER

Standart alanlar


  • WORD Magic;
  • BYTE MajorLinkerVersion;
  • BYTE MinorLinkerVersion;
  • DWORD SizeOfCode;
  • DWORD SizeOfInitializedData;
  • DWORD SizeOfUninitializedData;
  • DWORD AddressOfEntryPoint;
  • DWORD BaseOfCode;
  • DWORD BaseOfData;
MajorLinkerVersion & MinorLinkerVersion

Programın bağlayıcısının majör ve minör versiyon bilgileri.

SizeOfCode

.text bölümünün boyutunu verir yani kod olan bölümlerin toplam boyutunu

verir.

SizeOfInitializedData & SizeOfUninitializedData

static s1=5; => Bu size of intilialized data dır yani ilk değer atanmış değişkenlerdir.

(.data bölümünde olurlar)

static s1; => Bu ise SizeOfUninitializedData dır yani değer atanmamış değişkenler.

(.bss içinde bulunurlar)

AddressOfEntryPoint

Programın başlangıç noktasının RVA’sını verir.

BaseOfCode

Çalıştırılabilir makine kodlarını içeren .text bölümünün başlangıç RVA’sını verir.

BaseOfData

Statik verilerin tutulduğu .data bölümünün başlangıç RVAsı.

SizeOfImage

Dosyanın hafızaya yüklendiğinde ne kadar alan kaplayacağını gösterir.

MajorOperatingSystemVersion & MinorOperatingSystemVersion

PE dosyasının minimum işletim sistemi versiyon bilgisini içerir.

Section Table(Bölüm Tablosu)


9ji6pkw.jpg

Bu tabloya geçmeden önce bu tablo ile alakalı basit bir analiz yapalım diyelim ki bir arkadaşınız size bir dosya attı yararlı dosya ve zararlı dosya ikisi birbirini tutuyor kısacası binder işlemi yapılmış bu tabloyu kullanarak virüs analizi yapmayı ve zararlı ile zararsızı ikiye ayırmayı göstereceğim. Ben örnek olarak sahte bir Visual Basic formu oluşturdum(virüsüm bu) bunu ise Dying Light hilesi ile binder yardımı ile birleştirdim. Daha sonra bunu bilgisayarımda analiz etmeden açınca ortaya çıkan sonuç;

8g9nc4i.PNG

Gördüğünüz gibi sahte virüsüm ile birlikte hilem de çalıştı. Şimdi size Die kullanarak içerisinden zararsız uygulamamı sahte virüsümü çalıştırmadan çekmeyi göstereceğim bu sayede herhangi bir exe’nin binder işleminden geçip geçmediğini anlayacak virüsü bir kenara virüssüz olan dosyayı bir kenara atacaksınız. Bunu göstermemin sebebi bazı binder’ların resource ve sections sekmelerinde dosya saklamaları.

2wdli0b.PNG

Uygulama üzerine gelerek Sağ Tık - > Scanner -> Die dedim.

lfr6nrn.PNG

‘RBIND’ yazan yere tıkladım.

hhao48p.PNG

2 Adet uygulama görüyorum ve tanıdık gelen bir isim tabi ki de server.exe. Daha sonra lazım olan dosyamı ayırmak için Sağ Tık -> Dump seçeneği.

c720xrm.PNG

Seçeneğe tıkladıktan sonra Resource.bin olarak kaydedilsin mi diye bir seçenek çıkacak siz uzantı değiştirin .bin değil .exe daha sonra hazırsınız zararlıyı zararsızdan ayırdınız. Binder tuzağından kurtuldunuz!

pwhnu7n.PNG


edvl10j.PNG


gqvp47r.PNG

Gördüğünüz gibi uygulama çalıştı. Konumuza devam edelim.

-P.E dosyası sectionlardan oluşur. Bu section’lar içindeki verinin nasıl bir yapıda olduğunu belirtir. Örnek vermek gerekirse code section’ında execute edilecek opcode lar bulunur. Data section’ında ilk değer verilmiş global ve statik veriler bulunur. Bss section‘ında ise ilk değer verilmemiş global ve statik veriler bulunur.


Terimler ve Tanımlar;


BYTE Name [IMAGE_SIZEOF_SHORT_NAME] : Bu kısımda section ın ismi bulunuyor.

union{DWORD PhysicalAddress, DWORD VirtualSize}Misc : Bu kısım EXE ve OBJ için farklı anlamlara geliyor. Exe için kodun veya verinin gerçek boyutunu tutuyor.

DWORD VirtualAddress : Bu kısım EXE için anlamlıdır. Section ın nereye map edileceğinin RVA sını tutar.

DWORD SizeOfRawData : Bu kısım section ın yuvarlanmış boyutunu tutar.

DWORD PointerToRawData : Raw data nın adresini tutar.

DWORD PointerToRelocations

DWORD PointerToLinenumbers

WORD NumberOfRelocations

WORD NumberOfLinenumbers

DWORD Characteristics :
Section ın karakteristiğini belirler. 0x00000020 bu bölümde kodların olduğunu belirtir. 0x00000040 bu bölümde ilk değer verilmiş verilerin bulunduğunu belirtir. 0x00000080 bu bölümde ilk değer verilmemiş verilerin olduğunu belirtir. 0x20000000 bölümün executable olduğunu belirtir. 0x40000000 bölümün okunabilir olduğunu belirtir.

PE File Import


Bildiğiniz üzere kodladığımız programlarda başka dll’lerdeki fonksiyonları kullanıyoruz. Bu fonksiyonları kullanabilmek için kullandığımız dll’lerin kayıtlarının P.E dosya formatında bir yerde bulunması gerekiyor. Aksi halde bu fonksiyonları kullanamayız. İşte bu kayıtlar .idata section’ında yer alıyor. Bir resim değiştirme DLL’i oluşturalım ve inceleyelim.

Loader ( P.E dosyamızı ram’e gönderen program) .idata section’ındaki bilgileri kullanarak gerekli dll’lerin ve fonksiyonların adreslerini executable image e bağlar.

.idata section ı (Import Table) IMAGE_IMPORT_DESCRIPTOR dizisi ile başlar ve execute için gerekli olan her bir dll için dizide bir eleman bulunur. Toplam kaç adet eleman olduğunu tutan bir şey olmadığından dizinin bittiği NULL karakteri ile anlaşılır.


IMAGE_IMPORT_DECRIPTOR yapısına göz atalım.

DWORD Characteristics : Bu kısım IMAGE_IMPORT_BYNAME structure’ını gösteren pointer bulunduruyor.

DWORD TimeDateStamp : Dosya oluşturulma tarihi bulunuyor.

DWORD ForwarderChain : Burada FirstThunk dizisinin index i bulunuyor. Bu kısım dll yönlendirme ile alakalı.

DWORD Name : DLL’ in ismi bulunuyor burada.

PIMAGE_THUNK_DATA FirstThunk : Bu kısımda IMAGE_THUNK_DATA union ‘ının offset i bulunuyor.

Not:

VB.NET DLL Oluşturma Kullanma;


C# DLL Oluşturma Kullanma;


Bu Terimler İle Nerede Karşılaşılır?


Herhangi bir exe’yi DnSpy, CFF Explorer gibi bir programda analiz edince karşınıza çıkar.

Örnek;

7yumqvf.PNG

Virtual Memory ~ Sanal Bellek Nedir?

Sanal bellek, fiziksel belleğin görünürdeki miktarını arttırarak uygulama programına fiziksel belleğin boyutundan bağımsız ve sürekli bellek alanı sağlayan bilgisayar tekniğidir. Ana belleğin, diskin önbelleği (cache) gibi davranmasıyla; yani disk yüzeyini belleğin bir uzantısıymış gibi kullanmasıyla gerçekleştirilir. Günümüzde genel amaçlı bilgisayarların işletim sistemleri çoklu ortam uygulamaları, kelime işlemcileri, tablolama uygulamaları gibi sıradan uygulamalar için sanal bellek yöntemi kullanılmaktadır. Temel olarak işletim sistemi tarafından fiziksel hafızanın uygulamadan soyutlanması demektir. İşletim sistemi fiziksel hafızayı (örneğin 4KB’lik) bölümlere ayırır ve her birini page olarak adlandırır. İşletim sistemi, hafızayı kullanmak isteyen programlara bu page'leri direkt tahsis etmek yerine bu page'lere karşılık gelen Virtual Memory(Sanal Bellek) alanlarını tahsis eder. Virtual Memory ve fiziksel memory page'ler arasındaki dönüşüm MMU (Memory Management Unit) adlı hardware ile yapılır.

Örneğin, sistemimizde 4GB Ram bellek bulunduğunu düşünelim. Normal şartlarda çalıştırdığınız uygulamaların/uygulamanın ihtiyaç duyduğu bellek kapasite toplamı, mevcut kapasite miktarını aştığında hata verip çalışmaması gerekir. Bu noktada, sabit Disk üzerinde oluşturulmuş sanal bellek (Virtual Ram) devreye giriyor. Çalışacak uygulamanın hemen işletilecek bölümü Ram belleğe, kalan bölümü de sanal belleğe yazılıyor. Bu sırada Ram üzerinde o anda kullanılmayan, gereksinim duyulmayan veriler de sanal belleğe gönderiliyor. Böylelikle Ram üzerinde boş alan da elde ediliyor. Uygulamanın işletilen bölümü ile bekleyen bölümü, Ram bellek ile sanal bellek arasında sürekli takas ediliyor. Düşük belleğe sahip bilgisayarınız varsa ve bu bilgisayarınızda photoshop gibi işlemler yapmak istiyorsanız sanal bellek kesinlikle gerekli.

Önerdiğim Bir Video;


-SON-​
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.