mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/basic-stack-binary-exploitation-met
This commit is contained in:
parent
867d2390e6
commit
fd581caecb
@ -1,10 +1,10 @@
|
||||
# ELF Msingi wa Taarifa
|
||||
# ELF Basic Information
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Vichwa vya Programu
|
||||
## Program Headers
|
||||
|
||||
Vinavyoelezea kwa loader jinsi ya kupakia **ELF** kwenye kumbukumbu:
|
||||
Inatoa maelezo kwa loader jinsi ya kupakia **ELF** kwenye kumbukumbu:
|
||||
```bash
|
||||
readelf -lW lnstat
|
||||
|
||||
@ -37,9 +37,9 @@ Segment Sections...
|
||||
07
|
||||
08 .init_array .fini_array .dynamic .got
|
||||
```
|
||||
Programu ya awali ina **vichwa vya programu 9**, kisha, **ramani ya sehemu** inaonyesha katika kichwa gani cha programu (kuanzia 00 hadi 08) **kila sehemu iko**.
|
||||
The previous program has **9 program headers**, then, the **segment mapping** indicates in which program header (from 00 to 08) **each section is located**.
|
||||
|
||||
### PHDR - Kichwa cha Programu
|
||||
### PHDR - Program HeaDeR
|
||||
|
||||
Inajumuisha meza za vichwa vya programu na metadata yenyewe.
|
||||
|
||||
@ -47,44 +47,60 @@ Inajumuisha meza za vichwa vya programu na metadata yenyewe.
|
||||
|
||||
Inaonyesha njia ya loader inayotumika kupakia binary kwenye kumbukumbu.
|
||||
|
||||
> Tip: Statically linked or static-PIE binaries won’t have an `INTERP` entry. In those cases there is no dynamic loader involved, which disables techniques that rely on it (e.g., `ret2dlresolve`).
|
||||
|
||||
### LOAD
|
||||
|
||||
Vichwa hivi vinatumika kuonyesha **jinsi ya kupakia binary kwenye kumbukumbu.**\
|
||||
Kila kichwa cha **LOAD** kinaonyesha eneo la **kumbukumbu** (ukubwa, ruhusa na usawa) na inaonyesha bytes za ELF **binary za kunakili huko**.
|
||||
Kila **LOAD** header inaonyesha eneo la **kumbukumbu** (ukubwa, ruhusa na usawa) na inaonyesha bytes za ELF **binary za kunakili huko**.
|
||||
|
||||
Kwa mfano, ya pili ina ukubwa wa 0x1190, inapaswa kuwa katika 0x1fc48 ikiwa na ruhusa za kusoma na kuandika na itajazwa na 0x528 kutoka kwa ofset 0xfc48 (haijaza nafasi yote iliyohifadhiwa). Kumbukumbu hii itakuwa na sehemu `.init_array .fini_array .dynamic .got .data .bss`.
|
||||
Kwa mfano, ya pili ina ukubwa wa 0x1190, inapaswa kuwa kwenye 0x1fc48 ikiwa na ruhusa za kusoma na kuandika na itajazwa na 0x528 kutoka kwenye ofset 0xfc48 (haijaza nafasi yote iliyohifadhiwa). Kumbukumbu hii itakuwa na sehemu `.init_array .fini_array .dynamic .got .data .bss`.
|
||||
|
||||
### DYNAMIC
|
||||
|
||||
Kichwa hiki husaidia kuunganisha programu na utegemezi wa maktaba zao na kutekeleza uhamasishaji. Angalia sehemu **`.dynamic`**.
|
||||
Hii header inasaidia kuunganisha programu na utegemezi wao wa maktaba na kutekeleza uhamasishaji. Angalia sehemu **`.dynamic`**.
|
||||
|
||||
### NOTE
|
||||
|
||||
Hii inahifadhi taarifa za metadata za muuzaji kuhusu binary.
|
||||
|
||||
- On x86-64, `readelf -n` will show `GNU_PROPERTY_X86_FEATURE_1_*` flags inside `.note.gnu.property`. If you see `IBT` and/or `SHSTK`, the binary was built with CET (Indirect Branch Tracking and/or Shadow Stack). This impacts ROP/JOP because indirect branch targets must start with an `ENDBR64` instruction and returns are checked against a shadow stack. See the CET page for details and bypass notes.
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/cet-and-shadow-stack.md
|
||||
{{#endref}}
|
||||
|
||||
### GNU_EH_FRAME
|
||||
|
||||
Inafafanua eneo la meza za kuondoa stack, zinazotumiwa na debuggers na kazi za usimamizi wa makosa za C++.
|
||||
Inafafanua eneo la meza za kuondoa stack, zinazotumiwa na debuggers na kazi za usimamizi wa makosa ya C++.
|
||||
|
||||
### GNU_STACK
|
||||
|
||||
Inajumuisha usanidi wa ulinzi wa kuzuia utekelezaji wa stack. Ikiwa imewezeshwa, binary haitakuwa na uwezo wa kutekeleza msimbo kutoka kwenye stack.
|
||||
|
||||
- Check with `readelf -l ./bin | grep GNU_STACK`. To forcibly toggle it during tests you can use `execstack -s|-c ./bin`.
|
||||
|
||||
### GNU_RELRO
|
||||
|
||||
Inaonyesha usanidi wa RELRO (Relocation Read-Only) wa binary. Ulinzi huu utaashiria kama isiyo na kuandika sehemu fulani za kumbukumbu (kama `GOT` au meza za `init` na `fini`) baada ya programu kupakiwa na kabla ya kuanza kutekelezwa.
|
||||
|
||||
Katika mfano wa awali inakopi bytes 0x3b8 hadi 0x1fc48 kama zisizo na kuandika zikihusisha sehemu `.init_array .fini_array .dynamic .got .data .bss`.
|
||||
Katika mfano wa awali inakopi bytes 0x3b8 hadi 0x1fc48 kama isiyo na kuandika ikihusisha sehemu `.init_array .fini_array .dynamic .got .data .bss`.
|
||||
|
||||
Kumbuka kwamba RELRO inaweza kuwa ya sehemu au kamili, toleo la sehemu halilindi sehemu **`.plt.got`**, ambayo inatumika kwa **lazy binding** na inahitaji nafasi hii ya kumbukumbu kuwa na **ruhusa za kuandika** ili kuandika anwani za maktaba wakati wa kwanza mahali pake inatafutwa.
|
||||
Kumbuka kwamba RELRO inaweza kuwa ya sehemu au kamili, toleo la sehemu halilindi sehemu **`.plt.got`**, ambayo inatumika kwa **lazy binding** na inahitaji nafasi hii ya kumbukumbu kuwa na **ruhusa za kuandika** ili kuandika anwani za maktaba wakati wa kwanza kutafutwa mahali pake.
|
||||
|
||||
> For exploitation techniques and up-to-date bypass notes, check the dedicated page:
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/relro.md
|
||||
{{#endref}}
|
||||
|
||||
### TLS
|
||||
|
||||
Inafafanua meza ya entries za TLS, ambayo inahifadhi taarifa kuhusu mabadiliko ya ndani ya thread.
|
||||
Inafafanua meza ya TLS entries, ambayo inahifadhi taarifa kuhusu mabadiliko ya ndani ya nyuzi.
|
||||
|
||||
## Vichwa vya Sehemu
|
||||
## Section Headers
|
||||
|
||||
Vichwa vya sehemu vinatoa mtazamo wa kina zaidi wa binary ya ELF.
|
||||
Vichwa vya sehemu vinatoa mtazamo wa kina zaidi wa ELF binary.
|
||||
```
|
||||
objdump lnstat -h
|
||||
|
||||
@ -145,26 +161,26 @@ CONTENTS, READONLY
|
||||
25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 000101bc 2**2
|
||||
CONTENTS, READONLY
|
||||
```
|
||||
Inayoonyesha pia mahali, ofseti, ruhusa lakini pia **aina ya data** ambayo sehemu hiyo ina.
|
||||
It also indicates the location, offset, permissions but also the **type of data** it section has.
|
||||
|
||||
### Sehemu za Meta
|
||||
### Meta Sections
|
||||
|
||||
- **String table**: Inayo kila nyuzi inayohitajika na faili la ELF (lakini si zile zinazotumiwa na programu). Kwa mfano, ina majina ya sehemu kama `.text` au `.data`. Na ikiwa `.text` iko kwenye ofseti 45 katika jedwali la nyuzi itatumia nambari **45** katika uwanja wa **jina**.
|
||||
- Ili kupata mahali ambapo jedwali la nyuzi liko, ELF ina kiashiria kwa jedwali la nyuzi.
|
||||
- **Symbol table**: Inayo taarifa kuhusu alama kama jina (ofseti katika jedwali la nyuzi), anwani, ukubwa na metadata zaidi kuhusu alama hiyo.
|
||||
- **String table**: Inajumuisha nyuzi zote zinazohitajika na faili ya ELF (lakini si zile zinazotumiwa na programu). Kwa mfano inajumuisha majina ya sehemu kama `.text` au `.data`. Na ikiwa `.text` iko kwenye offset 45 katika jedwali la nyuzi itatumia nambari **45** katika uwanja wa **jina**.
|
||||
- Ili kupata mahali ambapo jedwali la nyuzi liko, ELF ina kipanga njia kwa jedwali la nyuzi.
|
||||
- **Symbol table**: Inajumuisha taarifa kuhusu alama kama jina (offset katika jedwali la nyuzi), anwani, ukubwa na metadata zaidi kuhusu alama.
|
||||
|
||||
### Sehemu Kuu
|
||||
### Main Sections
|
||||
|
||||
- **`.text`**: Maagizo ya programu ya kukimbia.
|
||||
- **`.text`**: Maagizo ya programu ya kuendesha.
|
||||
- **`.data`**: Vigezo vya kimataifa vyenye thamani iliyofafanuliwa katika programu.
|
||||
- **`.bss`**: Vigezo vya kimataifa vilivyotelekezwa (au kuanzishwa kuwa sifuri). Vigezo hapa vinakaguliwa kiotomatiki kuwa sifuri hivyo kuzuia sifuri zisizohitajika kuongezwa kwenye binary.
|
||||
- **`.rodata`**: Vigezo vya kimataifa visivyobadilika (sehemu ya kusoma tu).
|
||||
- **`.tdata`** na **`.tbss`**: Kama .data na .bss wakati vigezo vya ndani ya thread vinapotumika (`__thread_local` katika C++ au `__thread` katika C).
|
||||
- **`.tdata`** na **`.tbss`**: Kama .data na .bss wakati vigezo vya ndani ya nyuzi vinapotumika (`__thread_local` katika C++ au `__thread` katika C).
|
||||
- **`.dynamic`**: Angalia hapa chini.
|
||||
|
||||
## Alama
|
||||
## Symbols
|
||||
|
||||
Alama ni mahali lenye jina katika programu ambalo linaweza kuwa kazi, kitu cha data cha kimataifa, vigezo vya ndani ya thread...
|
||||
Symbols ni eneo lenye jina katika programu ambalo linaweza kuwa kazi, kitu cha data cha kimataifa, vigezo vya ndani ya nyuzi...
|
||||
```
|
||||
readelf -s lnstat
|
||||
|
||||
@ -189,12 +205,16 @@ Kila kipengele cha alama kina:
|
||||
|
||||
- **Jina**
|
||||
- **Sifa za uhusiano** (dhaifu, za ndani au za kimataifa): Alama ya ndani inaweza kufikiwa tu na programu yenyewe wakati alama za kimataifa zinashirikiwa nje ya programu. Kitu dhaifu ni mfano wa kazi ambayo inaweza kubadilishwa na nyingine tofauti.
|
||||
- **Aina**: NOTYPE (aina haijabainishwa), OBJECT (kibadilisha data cha kimataifa), FUNC (kazi), SECTION (sehemu), FILE (faili ya msimbo wa chanzo kwa ajili ya wadhibiti), TLS (kibadilisha cha ndani cha nyuzi), GNU_IFUNC (kazi isiyo ya moja kwa moja kwa ajili ya uhamasishaji)
|
||||
- **Aina**: NOTYPE (aina haijabainishwa), OBJECT (data ya kimataifa), FUNC (kazi), SECTION (sehemu), FILE (faili ya msimbo wa chanzo kwa ajili ya wadhibiti), TLS (kigezo cha nyuzi za ndani), GNU_IFUNC (kazi isiyo ya moja kwa moja kwa ajili ya uhamasishaji)
|
||||
- **Sehemu** index ambapo iko
|
||||
- **Thamani** (anwani katika kumbukumbu)
|
||||
- **Ukubwa**
|
||||
|
||||
## Sehemu ya Kihisia
|
||||
#### GNU Symbol Versioning (dynsym/dynstr/gnu.version)
|
||||
|
||||
Modern glibc inatumia toleo la alama. Utapata vipengele katika `.gnu.version` na `.gnu.version_r` na majina ya alama kama `strlen@GLIBC_2.17`. Linker ya dynamic inaweza kuhitaji toleo maalum wakati wa kutatua alama. Wakati wa kuunda uhamasishaji wa mikono (mfano, ret2dlresolve) lazima utoe index sahihi ya toleo, vinginevyo kutatua kutashindwa.
|
||||
|
||||
## Sehemu ya Dynamic
|
||||
```
|
||||
readelf -d lnstat
|
||||
|
||||
@ -229,11 +249,28 @@ Tag Type Name/Value
|
||||
0x000000006ffffff9 (RELACOUNT) 15
|
||||
0x0000000000000000 (NULL) 0x0
|
||||
```
|
||||
Direktori ya NEEDED inaonyesha kwamba programu **inahitaji kupakia maktaba iliyoelezwa** ili kuendelea. Direktori ya NEEDED inakamilika mara tu **maktaba inayo shared inakuwa na kazi kamili na tayari** kwa matumizi.
|
||||
The NEEDED directory indicates that the program **inahitaji kupakia maktaba iliyoelezwa** ili kuendelea. The NEEDED directory completes once the shared **maktaba imefanya kazi kikamilifu na iko tayari** kwa matumizi.
|
||||
|
||||
## Mabadiliko
|
||||
### Dynamic loader search order (RPATH/RUNPATH, $ORIGIN)
|
||||
|
||||
Mchambuzi pia lazima ahamasishe utegemezi baada ya kuyapakia. Mabadiliko haya yanaonyeshwa katika jedwali la mabadiliko katika muundo wa REL au RELA na idadi ya mabadiliko inatolewa katika sehemu za dynamic RELSZ au RELASZ.
|
||||
The entries `DT_RPATH` (deprecated) and/or `DT_RUNPATH` influence where the dynamic loader searches for dependencies. Rough order:
|
||||
|
||||
- `LD_LIBRARY_PATH` (ignored for setuid/sgid or otherwise "secure-execution" programs)
|
||||
- `DT_RPATH` (only if `DT_RUNPATH` absent)
|
||||
- `DT_RUNPATH`
|
||||
- `ld.so.cache`
|
||||
- default directories like `/lib64`, `/usr/lib64`, etc.
|
||||
|
||||
`$ORIGIN` can be used inside RPATH/RUNPATH to refer to the directory of the main object. From an attacker perspective this matters when you control the filesystem layout or environment. For hardened binaries (AT_SECURE) most environment variables are ignored by the loader.
|
||||
|
||||
- Inspect with: `readelf -d ./bin | egrep -i 'r(path|unpath)'`
|
||||
- Quick test: `LD_DEBUG=libs ./bin 2>&1 | grep -i find` (shows search path decisions)
|
||||
|
||||
> Priv-esc tip: Prefer abusing writable RUNPATHs or misconfigured `$ORIGIN`-relative paths owned by you. LD_PRELOAD/LD_AUDIT are ignored in secure-execution (setuid) contexts.
|
||||
|
||||
## Relocations
|
||||
|
||||
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.
|
||||
```
|
||||
readelf -r lnstat
|
||||
|
||||
@ -274,7 +311,6 @@ Offset Info Type Sym. Value Sym. Name + Addend
|
||||
00000001fea0 000900000402 R_AARCH64_JUMP_SL 0000000000000000 perror@GLIBC_2.17 + 0
|
||||
00000001fea8 000b00000402 R_AARCH64_JUMP_SL 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0
|
||||
00000001feb0 000c00000402 R_AARCH64_JUMP_SL 0000000000000000 putc@GLIBC_2.17 + 0
|
||||
00000001feb8 000d00000402 R_AARCH64_JUMP_SL 0000000000000000 opendir@GLIBC_2.17 + 0
|
||||
00000001fec0 000e00000402 R_AARCH64_JUMP_SL 0000000000000000 fputc@GLIBC_2.17 + 0
|
||||
00000001fec8 001100000402 R_AARCH64_JUMP_SL 0000000000000000 snprintf@GLIBC_2.17 + 0
|
||||
00000001fed0 001200000402 R_AARCH64_JUMP_SL 0000000000000000 __snprintf_chk@GLIBC_2.17 + 0
|
||||
@ -310,21 +346,39 @@ Offset Info Type Sym. Value Sym. Name + Addend
|
||||
|
||||
Ikiwa **programu imepakuliwa mahali tofauti** na anwani inayopendelea (kawaida 0x400000) kwa sababu anwani hiyo tayari inatumika au kwa sababu ya **ASLR** au sababu nyingine yoyote, uhamasishaji wa statiki **unarekebisha viashiria** ambavyo vilikuwa na thamani zikitarajia binary kupakuliwa katika anwani inayopendelea.
|
||||
|
||||
Kwa mfano, sehemu yoyote ya aina `R_AARCH64_RELATIV` inapaswa kuwa na anwani iliyorekebishwa kwenye bias ya uhamasishaji pamoja na thamani ya kuongeza.
|
||||
Kwa mfano, sehemu yoyote ya aina `R_AARCH64_RELATIV` inapaswa kuwa na anwani iliyorekebishwa kwa bias ya uhamasishaji pamoja na thamani ya kuongeza.
|
||||
|
||||
### Dynamic Relocations and GOT
|
||||
|
||||
Uhamasishaji unaweza pia kurejelea alama ya nje (kama kazi kutoka kwa utegemezi). Kama kazi malloc kutoka libC. Kisha, mpakuwaji anapopakua libC katika anwani akichunguza mahali ambapo kazi ya malloc imepakuliwa, itaandika anwani hii katika jedwali la GOT (Global Offset Table) (linaloonyeshwa katika jedwali la uhamasishaji) ambapo anwani ya malloc inapaswa kufafanuliwa.
|
||||
Uhamasishaji unaweza pia kurejelea alama ya nje (kama kazi kutoka kwa utegemezi). Kama kazi malloc kutoka libC. Kisha, mzigo unapopakua libC katika anwani akichunguza mahali ambapo kazi ya malloc imepakuliwa, itaandika anwani hii katika jedwali la GOT (Global Offset Table) (linaloonyeshwa katika jedwali la uhamasishaji) ambapo anwani ya malloc inapaswa kufafanuliwa.
|
||||
|
||||
### Procedure Linkage Table
|
||||
|
||||
Sehemu ya PLT inaruhusu kufanya uhusiano wa uvivu, ambayo inamaanisha kwamba ufumbuzi wa mahali pa kazi utafanywa wakati wa kwanza inapoombwa.
|
||||
Sehemu ya PLT inaruhusu kufanya uhusiano wa polepole, ambayo inamaanisha kwamba ufumbuzi wa mahali pa kazi utafanywa wakati wa kwanza inapoombwa.
|
||||
|
||||
Hivyo wakati programu inaita malloc, kwa kweli inaita mahali husika pa `malloc` katika PLT (`malloc@plt`). Wakati wa kwanza inapoitwa inatatua anwani ya `malloc` na kuihifadhi ili wakati wa pili `malloc` inapoitwa, anwani hiyo inatumika badala ya msimbo wa PLT.
|
||||
Hivyo wakati programu inaita malloc, kwa kweli inaita mahali husika pa `malloc` katika PLT (`malloc@plt`). Wakati wa kwanza inapoitwa inatatua anwani ya `malloc` na kuihifadhi ili wakati mwingine `malloc` inapoitwa, anwani hiyo inatumika badala ya msimbo wa PLT.
|
||||
|
||||
#### Modern linking behaviors that impact exploitation
|
||||
|
||||
- `-z now` (Full RELRO) inazima uhusiano wa polepole; entries za PLT bado zipo lakini GOT/PLT imepangwa kuwa ya kusoma tu, hivyo mbinu kama **GOT overwrite** na **ret2dlresolve** hazitafanya kazi dhidi ya binary kuu (maktaba zinaweza bado kuwa sehemu ya RELRO). Tazama:
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/relro.md
|
||||
{{#endref}}
|
||||
|
||||
- `-fno-plt` inafanya kompyuta kuita kazi za nje kupitia **GOT entry moja kwa moja** badala ya kupitia PLT stub. Utaona mfuatano wa wito kama `mov reg, [got]; call reg` badala ya `call func@plt`. Hii inapunguza matumizi mabaya ya utekelezaji wa makisio na kubadilisha kidogo uwindaji wa ROP gadget kuzunguka PLT stubs.
|
||||
|
||||
- PIE vs static-PIE: PIE (ET_DYN na `INTERP`) inahitaji mzigo wa dynamic na inasaidia mashine ya kawaida ya PLT/GOT. Static-PIE (ET_DYN bila `INTERP`) ina uhamasishaji unaotumika na mzigo wa kernel na hakuna `ld.so`; tarajia hakuna ufumbuzi wa PLT wakati wa kutekeleza.
|
||||
|
||||
> Ikiwa GOT/PLT si chaguo, hamasisha kwenye viashiria vingine vya msimbo vinavyoweza kuandikwa au tumia ROP/SROP ya kawaida ndani ya libc.
|
||||
|
||||
{{#ref}}
|
||||
../arbitrary-write-2-exec/aw2exec-got-plt.md
|
||||
{{#endref}}
|
||||
|
||||
## Program Initialization
|
||||
|
||||
Baada ya programu kupakuliwa ni wakati wa kuendesha. Hata hivyo, msimbo wa kwanza unaotekelezwa **sio kila wakati kazi ya `main`**. Hii ni kwa sababu kwa mfano katika C++ ikiwa **kigezo cha kimataifa ni kitu cha darasa**, kitu hiki lazima kiwe **kimeanzishwa** **kabla** ya main kuendesha, kama katika:
|
||||
Baada ya programu kupakuliwa ni wakati wa kuikimbia. Hata hivyo, msimbo wa kwanza unaotekelezwa **sio kila wakati kazi ya `main`**. Hii ni kwa sababu kwa mfano katika C++ ikiwa **kigezo cha kimataifa ni kitu cha darasa**, kitu hiki lazima **kijazwe** **kabla** ya main kuendesha, kama ilivyo:
|
||||
```cpp
|
||||
#include <stdio.h>
|
||||
// g++ autoinit.cpp -o autoinit
|
||||
@ -352,20 +406,30 @@ Kutoka kwa msimbo wa C inawezekana kupata matokeo sawa kwa kutumia nyongeza za G
|
||||
__attributte__((constructor)) //Add a constructor to execute before
|
||||
__attributte__((destructor)) //Add to the destructor list
|
||||
```
|
||||
Kwa mtazamo wa mkusanyiko, ili kutekeleza vitendo hivi kabla na baada ya kazi ya `main` kutekelezwa, inawezekana kuunda kazi ya `init` na kazi ya `fini` ambazo zitarejelewa katika sehemu ya dynamic kama **`INIT`** na **`FIN`**. na zimewekwa katika sehemu za `init` na `fini` za ELF.
|
||||
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.
|
||||
|
||||
Chaguo lingine, kama ilivyotajwa, ni kurejelea orodha **`__CTOR_LIST__`** na **`__DTOR_LIST__`** katika **`INIT_ARRAY`** na **`FINI_ARRAY`** katika sehemu ya dynamic na urefu wa hizi unatajwa na **`INIT_ARRAYSZ`** na **`FINI_ARRAYSZ`**. Kila kipengee ni kiashiria cha kazi ambacho kitaitwa bila hoja.
|
||||
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.
|
||||
|
||||
Zaidi ya hayo, inawezekana pia kuwa na **`PREINIT_ARRAY`** yenye **viashiria** ambavyo vitatekelezwa **kabla** ya viashiria vya **`INIT_ARRAY`**.
|
||||
Moreover, it's also possible to have a **`PREINIT_ARRAY`** with **pointers** that will be executed **before** the **`INIT_ARRAY`** pointers.
|
||||
|
||||
#### Ujumbe wa Ukatili
|
||||
|
||||
- Chini ya Partial RELRO hizi arrays zinaishi katika kurasa ambazo bado zinaweza kuandikwa kabla `ld.so` haijabadilisha `PT_GNU_RELRO` kuwa isiyoandikwa. Ikiwa unapata kuandika bila mpangilio mapema vya kutosha au unaweza kulenga arrays zinazoweza kuandikwa za maktaba, unaweza kuingilia kati mtiririko wa udhibiti kwa kuandika tena kipengee na kazi unayochagua. Chini ya Full RELRO zinakuwa zisizoandikwa wakati wa utendaji.
|
||||
|
||||
- Kwa matumizi ya lazy binding ya linker ya dynamic kutatua alama zisizo na mpangilio wakati wa utendaji, angalia ukurasa maalum:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/ret2dlresolve.md
|
||||
{{#endref}}
|
||||
|
||||
### Agizo la Uanzishaji
|
||||
|
||||
1. Programu inawekwa kwenye kumbukumbu, mabadiliko ya kimataifa ya static yanaanzishwa katika **`.data`** na yasiyoanzishwa yanawekwa sifuri katika **`.bss`**.
|
||||
1. Programu inawekwa kwenye kumbukumbu, mabadiliko ya kimataifa ya statiki yanaanzishwa katika **`.data`** na yasiyoanzishwa yanawekwa sifuri katika **`.bss`**.
|
||||
2. **Mahitaji yote** ya programu au maktaba yanaanzishwa na **kuunganishwa kwa dynamic** kunatekelezwa.
|
||||
3. Kazi za **`PREINIT_ARRAY`** zinafanywa.
|
||||
4. Kazi za **`INIT_ARRAY`** zinafanywa.
|
||||
3. **`PREINIT_ARRAY`** kazi zinafanywa.
|
||||
4. **`INIT_ARRAY`** kazi zinafanywa.
|
||||
5. Ikiwa kuna kipengee cha **`INIT`** kinaitwa.
|
||||
6. Ikiwa ni maktaba, dlopen inamalizika hapa, ikiwa ni programu, ni wakati wa kuita **nukta halisi ya kuingia** (kazi ya `main`).
|
||||
6. Ikiwa ni maktaba, dlopen inamalizika hapa, ikiwa ni programu, ni wakati wa kuita **nukta halisi ya kuingia** (`main` function).
|
||||
|
||||
## Hifadhi ya Mitaa ya Thread (TLS)
|
||||
|
||||
@ -375,8 +439,35 @@ Kila thread itahifadhi eneo la kipekee kwa ajili ya variable hii hivyo ni thread
|
||||
|
||||
Wakati hii inatumika sehemu **`.tdata`** na **`.tbss`** zinatumika katika ELF. Ambazo ni kama `.data` (iliyowekwa) na `.bss` (siyo iliyowekwa) lakini kwa TLS.
|
||||
|
||||
Kila variable itakuwa na kipengee katika kichwa cha TLS kinachoelezea ukubwa na ofset ya TLS, ambayo ni ofset itakayotumiwa katika eneo la data la ndani la thread.
|
||||
Kila variable itakuwa na kipengee katika kichwa cha TLS kinachoelezea ukubwa na offset ya TLS, ambayo ni offset itakayotumia katika eneo la data la ndani la thread.
|
||||
|
||||
`__TLS_MODULE_BASE` ni alama inayotumika kurejelea anwani ya msingi ya hifadhi ya ndani ya thread na inaelekeza kwenye eneo katika kumbukumbu ambalo lina data zote za ndani za thread za moduli.
|
||||
|
||||
## Vector ya Msaada (auxv) na vDSO
|
||||
|
||||
Kernel ya Linux inapita vector ya msaada kwa michakato inayoshikilia anwani na bendera muhimu kwa utendaji:
|
||||
|
||||
- `AT_RANDOM`: inaelekeza kwa bytes 16 za nasibu zinazotumiwa na glibc kwa stack canary na mbegu nyingine za PRNG.
|
||||
- `AT_SYSINFO_EHDR`: anwani ya msingi ya ramani ya vDSO (inasaidia kupata `__kernel_*` syscalls na gadgets).
|
||||
- `AT_EXECFN`, `AT_BASE`, `AT_PAGESZ`, n.k.
|
||||
|
||||
Kama mshambuliaji, ikiwa unaweza kusoma kumbukumbu au faili chini ya `/proc`, mara nyingi unaweza kuvuja hizi bila infoleak katika mchakato wa lengo:
|
||||
```bash
|
||||
# Show the auxv of a running process
|
||||
cat /proc/$(pidof target)/auxv | xxd
|
||||
|
||||
# From your own process (helper snippet)
|
||||
#include <sys/auxv.h>
|
||||
#include <stdio.h>
|
||||
int main(){
|
||||
printf("AT_RANDOM=%p\n", (void*)getauxval(AT_RANDOM));
|
||||
printf("AT_SYSINFO_EHDR=%p\n", (void*)getauxval(AT_SYSINFO_EHDR));
|
||||
}
|
||||
```
|
||||
Kuvuja `AT_RANDOM` kunakupa thamani ya canary ikiwa unaweza kurejelea kiashiria hicho; `AT_SYSINFO_EHDR` inakupa msingi wa vDSO ili kutafuta gadgets au kuita syscalls haraka moja kwa moja.
|
||||
|
||||
## References
|
||||
|
||||
- ld.so(8) – Dynamic Loader search order, RPATH/RUNPATH, secure-execution rules (AT_SECURE): https://man7.org/linux/man-pages/man8/ld.so.8.html
|
||||
- getauxval(3) – Auxiliary vector and AT_* constants: https://man7.org/linux/man-pages/man3/getauxval.3.html
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user