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)
* 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.
The previous program has **9 program headers**, then, the **segment mapping** indicates in which program header (from 00 to 08) **each section is located**.
Ova zaglavlja se koriste da označe **kako učitati binarni fajl u memoriju.**\
Svako **LOAD** zaglavlje označava region **memorije** (veličina, dozvole i poravnanje) i ukazuje na bajtove ELF **binarne datoteke koje treba kopirati tamo**.
Na primer, drugo ima veličinu od 0x1190, treba da bude locirano na 0x1fc48 sa dozvolama za čitanje i pisanje i biće popunjeno sa 0x528 sa ofseta 0xfc48 (ne popunjava sav rezervisani prostor). Ova memorija će sadržati sekcije `.init_array .fini_array .dynamic .got .data .bss`.
Ukazuje na RELRO (Relocation Read-Only) konfiguraciju binarne datoteke. Ova zaštita će označiti kao samo za čitanje određene sekcije memorije (kao što su `GOT` ili `init` i `fini` tabele) nakon što se program učita i pre nego što počne da se izvršava.
Napomena da RELRO može biti delimičan ili potpun, delimična verzija ne štiti sekciju **`.plt.got`**, koja se koristi za **lenjo povezivanje** i treba ovaj memorijski prostor da ima **dozvole za pisanje** da bi zapisala adresu biblioteka kada se prvi put traži njihova lokacija.
* **String table**: Sadrži sve stringove potrebne ELF datoteci (ali ne i one koje program zapravo koristi). Na primer, sadrži imena sekcija kao što su `.text` ili `.data`. I ako je `.text` na offsetu 45 u tabeli stringova, koristiće broj **45** u polju **name**.
* Da bi se pronašlo gde se nalazi tabela stringova, ELF sadrži pokazivač na tabelu stringova.
* **Symbol table**: Sadrži informacije o simbolima kao što su ime (offset u tabeli stringova), adresa, veličina i više metapodataka o simbolu.
* **`.bss`**: Globalne promenljive koje nisu inicijalizovane (ili su inicijalizovane na nulu). Promenljive ovde se automatski inicijalizuju na nulu, čime se sprečava dodavanje bespotrebnih nula u binarni fajl.
* **Atributi vezivanja** (slab, lokalni ili globalni): Lokalni simbol može biti pristupljen samo od strane samog programa, dok su globalni simboli deljeni van programa. Slab objekat je, na primer, funkcija koja može biti zamenjena drugom.
* **Tip**: NOTYPE (tip nije specificiran), OBJECT (globalna podatkovna varijabla), FUNC (funkcija), SECTION (sekcija), FILE (izvorni kod za debagere), TLS (varijabla lokalna za nit), GNU\_IFUNC (indirektna funkcija za relokaciju)
The NEEDED directory indicates that the program **treba da učita pomenutu biblioteku** kako bi nastavio. The NEEDED directory completes once the shared **biblioteka je potpuno operativna i spremna** za korišćenje.
The loader also must relocate dependencies after having loaded them. These relocations are indicated in the relocation table in formats REL or RELA and the number of relocations is given in the dynamic sections RELSZ or RELASZ.
Ako je **program učitan na mestu koje se razlikuje** od preferirane adrese (obično 0x400000) zato što je adresa već zauzeta ili zbog **ASLR** ili bilo kog drugog razloga, statička relokacija **ispravlja pokazivače** koji su imali vrednosti očekujući da će binarni fajl biti učitan na preferiranoj adresi.
Relokacija može takođe referencirati spoljašnji simbol (kao što je funkcija iz zavisnosti). Kao što je funkcija malloc iz libC. Tada, učitavač prilikom učitavanja libC na adresu proverava gde je učitana funkcija malloc, i upisuje ovu adresu u GOT (Global Offset Table) tabelu (naznačeno u relokacionoj tabeli) gde bi adresa malloc trebala biti specificirana.
Dakle, kada program poziva malloc, zapravo poziva odgovarajuću lokaciju `malloc` u PLT (`malloc@plt`). Prvi put kada se pozove, rešava adresu `malloc` i čuva je, tako da sledeći put kada se pozove `malloc`, ta adresa se koristi umesto PLT koda.
Nakon što je program učitan, vreme je da se pokrene. Međutim, prvi kod koji se izvršava **nije uvek `main`** funkcija. To je zato što, na primer, u C++ ako je **globalna promenljiva objekat klase**, ovaj objekat mora biti **inicijalizovan****pre** nego što se main izvrši, kao u:
Napomena da su ove globalne promenljive smeštene u `.data` ili `.bss`, ali u listama `__CTOR_LIST__` i `__DTOR_LIST__` objekti za inicijalizaciju i destrukciju su smešteni kako bi se pratili.
Sa perspektive kompajlera, da bi se izvršile ove radnje pre i posle izvršavanja `main` funkcije, moguće je kreirati `init` funkciju i `fini` funkciju koje bi bile referencirane u dinamičkom odeljku kao **`INIT`** i **`FIN`**. i smeštene su u `init` i `fini` odeljke ELF-a.
Druga opcija, kao što je pomenuto, je da se referenciraju liste **`__CTOR_LIST__`** i **`__DTOR_LIST__`** u **`INIT_ARRAY`** i **`FINI_ARRAY`** stavkama u dinamičkom odeljku, a dužina ovih stavki je označena sa **`INIT_ARRAYSZ`** i **`FINI_ARRAYSZ`**. Svaka stavka je pokazivač na funkciju koja će biti pozvana bez argumenata.
1. Program se učitava u memoriju, statičke globalne promenljive se inicijalizuju u **`.data`** i neinicijalizovane se postavljaju na nulu u **`.bss`**.
2. Sve **zavisnosti** za program ili biblioteke su **inicijalizovane** i izvršava se **dinamičko povezivanje**.
3.**`PREINIT_ARRAY`** funkcije se izvršavaju.
4.**`INIT_ARRAY`** funkcije se izvršavaju.
5. Ako postoji **`INIT`** stavka, ona se poziva.
6. Ako je u pitanju biblioteka, dlopen ovde završava, ako je program, vreme je da se pozove **pravi ulazni tačka** (`main` funkcija).
Kada se ovo koristi, odeljci **`.tdata`** i **`.tbss`** se koriste u ELF-u. Koji su slični `.data` (inicijalizovano) i `.bss` (neinicijalizovano) ali za TLS.
Svaka promenljiva će imati stavku u TLS zaglavlju koja specificira veličinu i TLS offset, što je offset koji će koristiti u lokalnom području podataka niti.
`__TLS_MODULE_BASE` je simbol koji se koristi za referenciranje osnovne adrese skladišta lokalnih niti i ukazuje na područje u memoriji koje sadrži sve podatke lokalne za niti modula.