<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
* Je, unafanya kazi katika **kampuni ya usalama wa mtandao**? Unataka kuona **kampuni yako ikionyeshwa kwenye HackTricks**? au unataka kupata upatikanaji wa **toleo jipya zaidi la PEASS au kupakua HackTricks kwa PDF**? Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* Pata [**swagi rasmi ya PEASS & HackTricks**](https://peass.creator-spring.com)
* **Jiunge na** [**💬**](https://emojipedia.org/speech-balloon/) [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **nifuata** kwenye **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwenye** [**repo ya hacktricks**](https://github.com/carlospolop/hacktricks) **na** [**repo ya hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Programu iliyotangulia ina **vichwa vya programu 9**, kisha, **upangaji wa sehemu** unaonyesha katika kichwa cha programu gani (kutoka 00 hadi 08) **kila sehemu inapatikana**.
### PHDR - Kichwa cha Programu
Ina meza za vichwa vya programu na metadata yenyewe.
Kwa mfano, la pili lina ukubwa wa 0x1190, linapaswa kuwa katika 0x1fc48 na ruhusa za kusoma na kuandika na litajazwa na 0x528 kutoka kwa offset 0xfc48 (hailazi nafasi yote iliyohifadhiwa). Kumbukumbu hii italeta sehemu `.init_array .fini_array .dynamic .got .data .bss`.
Inaonyesha usanidi wa RELRO (Relocation Read-Only) wa faili ya binary. Ulinzi huu utaweka sehemu fulani za kumbukumbu kama kusoma tu (kama vile `GOT` au meza za `init` na `fini`) baada ya programu kusomwa na kabla haijaanza kukimbia.
Tambua kuwa RELRO inaweza kuwa ya sehemu au kamili, toleo la sehemu halilindi sehemu **`.plt.got`**, ambayo hutumiwa kwa **kufunga uvivu** na inahitaji nafasi hii ya kumbukumbu kuwa na **ruhusa za kuandika** kuandika anwani za maktaba mara ya kwanza wanapopatikana.
* **Jedwali la String**: Inaleta pamoja strings zote zinazohitajika na faili ya ELF (lakini sio zile zinazotumiwa na programu). Kwa mfano, inaleta majina ya sehemu kama vile `.text` au `.data`. Na kama `.text` iko kwenye offset 45 katika jedwali la strings itatumia nambari **45** katika uga wa **jina**.
* **`.data`**: Variables za kimataifa zenye thamani iliyowekwa wazi katika programu.
* **`.bss`**: Variables za kimataifa zilizoachwa bila kuanzishwa (au kuanzishwa kwa sifuri). Variables hapa zinaanzishwa moja kwa moja kuwa sifuri hivyo kuzuia sifuri zisizohitajika kuongezwa kwenye binary.
* **`.rodata`**: Variables za kimataifa zenye thamani zisizobadilika (sehemu isiyoweza kusomwa).
* **`.tdata`** na **`.tbss`**: Kama .data na .bss wakati variables za thread-local zinapotumiwa (`__thread_local` katika C++ au `__thread` katika C).
- **Vipengele vya kufunga** (dhaifu, mahali au kuu): Alama ya mahali inaweza kupatikana tu na programu yenyewe wakati alama za kuu zinashirikiwa nje ya programu. Kitu dhaifu ni kwa mfano kazi inayoweza kubadilishwa na moja tofauti.
- **Aina**: NOTYPE (aina haikufafanuliwa), OBJECT (data ya kikoa cha kimataifa), FUNC (kazi), SECTION (sehemu), FILE (faili ya msingi ya nambari kwa wachunguzi wa hitilafu), TLS (kigezo cha mnyororo wa eneo), GNU\_IFUNC (kazi isiyo ya moja kwa moja kwa ajili ya uhamishaji)
Directory ya NEEDED inaonyesha kwamba programu **inahitaji kupakia maktaba iliyotajwa** ili iendelee. Directory ya NEEDED inakamilika mara tu maktaba **inapokuwa kamili na tayari kutumika**.
Mzigo lazima pia uhamishe mahitaji baada ya kuzipakia. Uhamishaji huu unaonyeshwa kwenye meza ya uhamishaji katika muundo wa REL au RELA na idadi ya uhamishaji inatolewa katika sehemu za kudumu RELSZ au RELASZ.
Ikiwa **programu imepakia mahali tofauti** na anwani inayopendelewa (kawaida 0x400000) kwa sababu anwani tayari inatumika au kwa sababu ya **ASLR** au sababu nyingine yoyote, urekebishaji wa stati **hurekebisha pointa** ambazo zilikuwa na thamani zikitarajia binary ipakuliwe katika anwani inayopendelewa.
Urekebishaji unaweza pia kurejelea alama ya nje (kama kazi kutoka kwa tegemezi). Kama vile kazi ya malloc kutoka libC. Kisha, mzigo unapopakia libC katika anwani ikichunguza wapi kazi ya malloc imepakuliwa, itaandika anwani hii kwenye jedwali la GOT (Global Offset Table) (inayoonyeshwa katika jedwali la urekebishaji) ambapo anwani ya malloc inapaswa kufafanuliwa.
Kwa hivyo wakati programu inaita malloc, kimsingi inaita eneo linalofanana la `malloc` katika PLT (`malloc@plt`). Mara ya kwanza inapoitwa, inatatua anwani ya `malloc` na kuihifadhi ili wakati `malloc` inaitwa tena, anwani hiyo itatumika badala ya msimbo wa PLT.
Baada ya programu kupakia, ni wakati wake wa kufanya kazi. Walakini, msimbo wa kwanza unaorushwa **si mara zote ni `main`**. Hii ni kwa sababu kwa mfano katika C++ ikiwa **kigezo cha kawaida ni kitu cha darasa**, kipengee hiki lazima kianzishwe **kabla** ya `main` kuanza, kama vile:
Tafadhali elewa kwamba hizi variables za kimataifa zinapatikana katika `.data` au `.bss` lakini katika orodha `__CTOR_LIST__` na `__DTOR_LIST__` vitu vya kuanzisha na kuharibu vimehifadhiwa kwa mpangilio ili kufuatilia.
__attributte__((constructor)) //Add a constructor to execute before
__attributte__((destructor)) //Add to the destructor list
```
Kutoka kwa mtazamo wa compiler, ili kutekeleza hatua hizi kabla na baada ya kazi ya `main` kutekelezwa, ni rahisi kuunda kazi ya `init` na kazi ya `fini` ambazo zitatajwa katika sehemu ya dynamic kama **`INIT`** na **`FIN`** na kuwekwa katika sehemu za `init` na `fini` za ELF.
Chaguo lingine, kama ilivyotajwa, ni kutaja orodha **`__CTOR_LIST__`** na **`__DTOR_LIST__`** katika viingilio vya **`INIT_ARRAY`** na **`FINI_ARRAY`** katika sehemu ya dynamic na urefu wa hizi unatajwa na **`INIT_ARRAYSZ`** na **`FINI_ARRAYSZ`**. Kila kuingilio ni kidude cha kazi ambacho kitaitwa bila hoja.
1. Programu inapakiwa kumbukani, vitu vya kimataifa vya tuli vinainishwa katika **`.data`** na vile visivyoainishwa vinawekwa sifuri katika **`.bss`**.
2.**Mahitaji yote** kwa programu au maktaba zina **anzishwa** na **kiunganishaji wa kudumu** unatekelezwa.
Kila kivinjari kitakuwa na kuingilio katika kichwa cha TLS kinachotaja ukubwa na kivinjari cha TLS, ambacho ni kivinjari kitatumia katika eneo la data la kipekee la kivinjari.
`__TLS_MODULE_BASE` ni ishara inayotumiwa kutaja anwani ya msingi ya uhifadhi wa wateja-kwa-wateja na inaelekeza kwenye eneo kumbukumbu linaloleta data yote ya wateja-kwa-wateja ya moduli.