* Bir **cybersecurity şirketinde** çalışıyor musunuz? **Şirketinizi HackTricks'te reklamını görmek** ister misiniz? veya **PEASS'ın en son sürümüne veya HackTricks'i PDF olarak indirmek** ister misiniz? [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT koleksiyonumuz**](https://opensea.io/collection/the-peass-family)
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter**'da takip edin 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
Önceki programda **9 program başlığı** bulunmaktadır, ardından **segment eşlemesi** her bir bölümün hangi program başlığında (00 ile 08 arasında) bulunduğunu gösterir.
Bu başlıklar, bir binary'nin belleğe nasıl yükleneceğini göstermek için kullanılır.\
Her **LOAD** başlığı, bellekteki bir bölgeyi (boyut, izinler ve hizalama) gösterir ve ELF binary'sinin o bölgeye kopyalanacak olan baytlarını belirtir.
Örneğin, ikinci başlık 0x1190 boyutunda olup, 0x1fc48 adresinde okuma ve yazma izinleriyle bulunmalıdır ve 0xfc48 ofsetinden 0x528 bayt ile doldurulacaktır (tüm ayrılmış alanı doldurmaz). Bu bellek, `.init_array .fini_array .dynamic .got .data .bss` bölümlerini içerecektir.
Binary'nin RELRO (Relocation Read-Only) yapılandırmasını belirtir. Bu koruma, program yüklendikten ve çalışmaya başlamadan önce belleğin belirli bölümlerini (GOT veya init ve fini tabloları gibi) salt okunur olarak işaretler.
Önceki örnekte, salt okunur olarak 0x3b8 bayt 0x1fc48'e kopyalanmaktadır ve `.init_array .fini_array .dynamic .got .data .bss` bölümlerini etkilemektedir.
RELRO'nun kısmi veya tam olabileceğini unutmayın, kısmi sürüm **`.plt.got`** bölümünü korumaz, bu bölüm **geç bağlama** için kullanılır ve konumları ilk kez arandığında bu bellek alanının **yazma izinlerine** sahip olması gerekmektedir.
* **Dize tablosu**: ELF dosyası tarafından gereken tüm dizeleri içerir (ancak program tarafından gerçekten kullanılanları içermez). Örneğin, `.text` veya `.data` gibi bölüm adlarını içerir. Ve eğer `.text` dize tablosunda 45. ofsette ise, **name** alanında 45 sayısını kullanır.
* Dize tablosunun nerede olduğunu bulmak için, ELF dosyası bir dize tablosuna işaretçi içerir.
* **Sembol tablosu**: İsim (dize tablosundaki ofset), adres, boyut ve sembol hakkında daha fazla meta veri gibi semboller hakkında bilgi içerir.
* **`.text`**: Programın çalıştırılması için talimatlar.
* **`.data`**: Programda tanımlı bir değere sahip global değişkenler.
* **`.bss`**: Başlatılmamış global değişkenler (veya sıfıra başlatılmış). Buradaki değişkenler otomatik olarak sıfıra başlatıldığından, gereksiz sıfırların ikili dosyaya eklenmesi engellenir.
* **`.rodata`**: Sabit global değişkenler (salt okunur bölüm).
* **`.tdata`** ve **`.tbss`**: C++'da `__thread_local` veya `__thread` kullanıldığında, thread yerel değişkenlerin kullanıldığı .data ve .bss gibi.
* **Bağlama özellikleri** (zayıf, yerel veya global): Yerel bir sembol yalnızca program tarafından erişilebilirken, global semboller program dışında paylaşılır. Zayıf bir nesne örneği, farklı bir nesne tarafından geçersiz kılınabilen bir işlevdir.
* **Tür**: NOTYPE (belirtilmemiş tür), OBJECT (global veri değişkeni), FUNC (işlev), SECTION (bölüm), FILE (hata ayıklama için kaynak kodu dosyası), TLS (iş parçacığı yerel değişkeni), GNU\_IFUNC (yeniden yerleştirme için dolaylı işlev)
Gerekli dizin, programın devam etmek için **bahsedilen kütüphaneyi yüklemesi gerektiğini** gösterir. GEREKLİ dizini, paylaşılan **kütüphane tamamen işlevsel ve kullanıma hazır olduğunda** tamamlanır.
Yükleyici, bağımlılıkları yükledikten sonra yer değiştirmeleri yapmak zorundadır. Bu yer değiştirmeler, REL veya RELA formatında yer değiştirme tablosunda belirtilir ve yer değiştirme sayısı dinamik bölümlerde RELSZ veya RELASZ olarak verilir.
Eğer program, tercih edilen adres olan genellikle 0x400000'den farklı bir yere yüklenmişse (adres zaten kullanıldığı için veya ASLR veya başka bir nedenle), statik bir yer değiştirme, ikili dosyanın tercih edilen adreste yüklenmesini bekleyen değerlere sahip olan işaretçileri düzeltir.
Yer değiştirme ayrıca harici bir sembolü (bağımlılıktan bir işlev gibi) de referans alabilir. Örneğin, libC'den malloc işlevi gibi. Ardından, yükleyici, libC'yi bir adrese yüklerken malloc işlevinin nerede yüklendiğini kontrol eder ve bu adresi GOT (Global Offset Table) tablosuna yazar (yer değiştirme tablosunda belirtilen) malloc adresinin belirtilmesi gereken yer.
Bu nedenle, bir program malloc'a çağrı yaptığında, aslında PLT'deki `malloc`'ın ilgili konumunu (`malloc@plt`) çağırır. İlk kez çağrıldığında, `malloc`'ın adresini çözümler ve saklar, böylece bir sonraki `malloc` çağrıldığında, bu adres PLT kodu yerine kullanılır.
Program yüklendikten sonra çalışması gereken zamandır. Ancak, çalıştırılan ilk kod her zaman `main` işlevi değildir. Bunun nedeni örneğin C++'da bir **global değişkenin bir sınıf nesnesi** olması durumunda, bu nesnenin **main çalışmadan önce başlatılması** gerektiğidir, örneğin:
Bu global değişkenler `.data` veya `.bss` bölümlerinde bulunur, ancak `__CTOR_LIST__` ve `__DTOR_LIST__` listelerinde başlatılacak ve yok edilecek nesneler saklanır ve bunların takibi yapılır.
Derleyici açısından, `main` fonksiyonu çalıştırılmadan önce ve sonra bu eylemleri gerçekleştirmek için **`init`** ve **`fini`** fonksiyonları oluşturulabilir ve bunlar ELF'in **`INIT`** ve **`FIN`** olarak referans alınır ve ELF'in **`init`** ve **`fini`** bölümlerine yerleştirilir.
Diğer bir seçenek olarak, dinamik bölümde **`INIT_ARRAY`** ve **`FINI_ARRAY`** girişlerinde **`__CTOR_LIST__`** ve **`__DTOR_LIST__`** listelerine referans vermek mümkündür ve bunların uzunluğu **`INIT_ARRAYSZ`** ve **`FINI_ARRAYSZ`** ile belirtilir. Her giriş, argümansız olarak çağrılacak bir işlev işaretçisidir.
Bu kullanıldığında, ELF'de **`.tdata`** ve **`.tbss`** bölümleri kullanılır. Bunlar, TLS için `.data` (başlatılmış) ve `.bss` (başlatılmamış) gibi bölümlerdir.
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmak için</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>'ı öğrenin</strong>!</summary>
* Bir **siber güvenlik şirketinde** çalışıyor musunuz? **Şirketinizi HackTricks'te reklamını görmek** ister misiniz? veya **PEASS'ın en son sürümüne erişmek veya HackTricks'i PDF olarak indirmek** ister misiniz? [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'ler**](https://opensea.io/collection/the-peass-family)
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter**'da takip edin 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**