AWS Hacking öğrenin ve pratik yapın:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
GCP Hacking öğrenin ve pratik yapın: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'ı takip edin.**
The previous program has **9 program headers**, then, the **segment mapping** indicates in which program header (from 00 to 08) **each section is located**.
These headers are used to indicate **how to load a binary into memory.**\
Each **LOAD** header indicates a region of **memory** (size, permissions and alignment) and indicates the bytes of the ELF **binary to copy in there**.
For example, the second one has a size of 0x1190, should be located at 0x1fc48 with permissions read and write and will be filled with 0x528 from the offset 0xfc48 (it doesn't fill all the reserved space). This memory will contain the sections `.init_array .fini_array .dynamic .got .data .bss`.
Indicates the RELRO (Relocation Read-Only) configuration of the binary. This protection will mark as read-only certain sections of the memory (like the `GOT` or the `init` and `fini` tables) after the program has loaded and before it begins running.
Note that RELRO can be partial or full, the partial version do not protect the section **`.plt.got`**, which is used for **lazy binding** and needs this memory space to have **write permissions** to write the address of the libraries the first time their location is searched.
* **String table**: ELF dosyasının ihtiyaç duyduğu tüm dizeleri içerir (ancak program tarafından gerçekten kullanılanları değil). Örneğin, `.text` veya `.data` gibi bölüm adlarını içerir. Ve eğer `.text` dizeler tablosunda 45. offset'te ise, **name** alanında **45** numarasını kullanacaktır.
* Dize tablosunun nerede olduğunu bulmak için, ELF dize tablosuna bir işaretçi içerir.
* **Symbol table**: Semboller hakkında isim (dize tablosundaki offset), adres, boyut ve sembol hakkında daha fazla meta veriyi içerir.
* **`.bss`**: Başlatılmamış (veya sıfıra başlatılmış) global değişkenler. Buradaki değişkenler otomatik olarak sıfıra başlatılır, bu nedenle ikili dosyaya gereksiz sıfırların eklenmesini önler.
* **Bağlama özellikleri** (zayıf, yerel veya küresel): Yerel bir sembol yalnızca program tarafından erişilebilirken, küresel semboller programın dışındaki paylaşılan sembollerdir. Zayıf bir nesne, örneğin, farklı bir fonksiyonla geçersiz kılınabilen bir fonksiyondur.
* **Tür**: NOTYPE (tip belirtilmemiş), OBJECT (küresel veri değişkeni), FUNC (fonksiyon), SECTION (bölüm), FILE (hata ayıklayıcılar için kaynak kodu dosyası), TLS (iş parçacığına özgü değişken), GNU\_IFUNC (yer değiştirme için dolaylı fonksiyon)
GEREKEN dizini, programın devam edebilmesi için **belirtilen kütüphaneyi yüklemesi gerektiğini** gösterir. GEREKEN dizini, paylaşılan **kütüphane tamamen çalışır ve kullanıma hazır olduğunda** tamamlanır.
Yükleyici, bağımlılıkları yükledikten sonra yeniden yerleştirmeleri de yapmalıdır. Bu yeniden yerleştirmeler, REL veya RELA formatlarında yeniden yerleştirme tablosunda belirtilir ve yeniden yerleştirmelerin sayısı dinamik bölümlerde RELSZ veya RELASZ ile verilir.
Eğer **program tercih edilen adresten** (genellikle 0x400000) farklı bir yere yüklenirse, bu adresin zaten kullanılıyor olması veya **ASLR** ya da başka bir sebepten dolayı, statik bir yeniden yerleştirme **işaretçileri düzeltir** ki bu işaretçiler, ikili dosyanın tercih edilen adreste yükleneceğini bekliyordu.
Yeniden yerleştirme ayrıca bir dış sembole (bir bağımlılıktan bir fonksiyon gibi) atıfta bulunabilir. Örneğin, libC'den malloc fonksiyonu. O zaman, yükleyici libC'yi bir adrese yüklerken malloc fonksiyonunun yüklü olduğu yeri kontrol eder, bu adresi GOT (Küresel Ofset Tablosu) tablosuna (yeniden yerleştirme tablosunda belirtilmiştir) yazar, burada malloc'un adresi belirtilmelidir.
Bu nedenle bir program malloc'u çağırdığında, aslında PLT'deki `malloc`'un karşılık gelen yerini çağırır (`malloc@plt`). İlk kez çağrıldığında `malloc`'un adresini çözer ve bunu saklar, böylece bir sonraki `malloc` çağrıldığında, bu adres PLT kodu yerine kullanılır.
Program yüklendikten sonra çalıştırma zamanı gelmiştir. Ancak, çalıştırılan ilk kod **her zaman `main`** fonksiyonu değildir. Bunun nedeni, örneğin C++'ta eğer bir **global değişken bir sınıfın nesnesi ise**, bu nesne **main çalışmadan önce****başlatılmalıdır**, örneğin:
Not edin ki bu global değişkenler `.data` veya `.bss` içinde yer alır, ancak `__CTOR_LIST__` ve `__DTOR_LIST__` listelerinde başlatılacak ve yok edilecek nesneler saklanır, böylece bunların takibi yapılabilir.
From a compiler perspective, to execute these actions before and after the `main` function is executed, it's possible to create a `init` function and a `fini` function which would be referenced in the dynamic section as **`INIT`** and **`FIN`**. and are placed in the `init` and `fini` sections of the ELF.
Derleyici perspektifinden, `main` fonksiyonu çalıştırılmadan önce ve sonra bu eylemleri gerçekleştirmek için, dinamik bölümde **`INIT`** ve **`FIN`** olarak referans verilecek bir `init` fonksiyonu ve bir `fini` fonksiyonu oluşturmak mümkündür. Bu fonksiyonlar ELF'nin `init` ve `fini` bölümlerine yerleştirilir.
The other option, as mentioned, is to reference the lists **`__CTOR_LIST__`** and **`__DTOR_LIST__`** in the **`INIT_ARRAY`** and **`FINI_ARRAY`** entries in the dynamic section and the length of these are indicated by **`INIT_ARRAYSZ`** and **`FINI_ARRAYSZ`**. Each entry is a function pointer that will be called without arguments.
Diğer seçenek, bahsedildiği gibi, dinamik bölümdeki **`INIT_ARRAY`** ve **`FINI_ARRAY`** girişlerinde **`__CTOR_LIST__`** ve **`__DTOR_LIST__`** listelerine referans vermektir ve bunların uzunluğu **`INIT_ARRAYSZ`** ve **`FINI_ARRAYSZ`** ile belirtilir. Her giriş, argüman olmadan çağrılacak bir fonksiyon işaretçisidir.
When this is used the sections **`.tdata`** and **`.tbss`** are used in the ELF. Which are like `.data` (initialized) and `.bss` (not initialized) but for TLS.
Each variable will hace an entry in the TLS header specifying the size and the TLS offset, which is the offset it will use in the thread's local data area.
Her değişken, boyutu ve iş parçacığının yerel veri alanında kullanacağı TLS ofsetini belirten bir TLS başlığında bir girişe sahip olacaktır.
The `__TLS_MODULE_BASE` is a symbol used to refer to the base address of the thread local storage and points to the area in memory that contains all the thread-local data of a module.
`__TLS_MODULE_BASE`, iş parçacığına özel depolamanın temel adresine atıfta bulunmak için kullanılan bir semboldür ve bir modülün tüm iş parçacığına özel verilerini içeren bellek alanına işaret eder.
{% hint style="success" %}
Learn & practice AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.