hacktricks/src/binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md

53 lines
3.1 KiB
Markdown

# WWW2Exec - .dtors & .fini_array
{{#include ../../banners/hacktricks-training.md}}
## .dtors
> [!CAUTION]
> Vandag is dit baie **vreemd om 'n binêre met 'n .dtors afdeling te vind!**
Die vernietigers is funksies wat **uitgevoer word voordat die program eindig** (nadat die `main` funksie terugkeer).\
Die adresse van hierdie funksies word binne die **`.dtors`** afdeling van die binêre gestoor en daarom, as jy daarin slaag om die **adres** na 'n **shellcode** in **`__DTOR_END__`** te **skryf**, sal dit **uitgevoer** word voordat die programme eindig.
Kry die adres van hierdie afdeling met:
```bash
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
```
Gewoonlik sal jy die **DTOR** merkers **tussen** die waardes `ffffffff` en `00000000` vind. So as jy net daardie waardes sien, beteken dit dat daar **geen funksie geregistreer is** nie. So **oorwrite** die **`00000000`** met die **adres** na die **shellcode** om dit uit te voer.
> [!WARNING]
> Natuurlik moet jy eers 'n **plek vind om die shellcode** te stoor om dit later aan te roep.
## **.fini_array**
Essensieel is dit 'n struktuur met **funksies wat geroep sal word** voordat die program klaar is, soos **`.dtors`**. Dit is interessant as jy jou **shellcode kan aanroep deur net na 'n adres te spring**, of in gevalle waar jy weer **terug na `main`** moet gaan om die **kwesbaarheid 'n tweede keer te benut**.
```bash
objdump -s -j .fini_array ./greeting
./greeting: file format elf32-i386
Contents of section .fini_array:
8049934 a0850408
#Put your address in 0x8049934
```
Let daarop dat wanneer 'n funksie van die **`.fini_array`** uitgevoer word, dit na die volgende een beweeg, so dit sal nie verskeie kere uitgevoer word nie (wat ewige lusse voorkom), maar dit sal ook net 1 **uitvoering van die funksie** wat hier geplaas is, gee.
Let daarop dat inskrywings in **`.fini_array`** in **omgekeerde** volgorde aangeroep word, so jy wil waarskynlik begin skryf vanaf die laaste een.
#### Ewige lus
Om **`.fini_array`** te misbruik om 'n ewige lus te kry, kan jy [**kyk wat hier gedoen is**](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)**:** As jy ten minste 2 inskrywings in **`.fini_array`** het, kan jy:
- Gebruik jou eerste skrywe om die **kwetsbare arbitrêre skrywe funksie** weer aan te roep
- Dan, bereken die terugkeeradres in die stapel wat gestoor is deur **`__libc_csu_fini`** (die funksie wat al die **`.fini_array`** funksies aanroep) en plaas daar die **adres van `__libc_csu_fini`**
- Dit sal maak dat **`__libc_csu_fini`** homself weer aanroep en die **`.fini_array`** funksies weer uitvoer wat die kwesbare WWW funksie 2 keer sal aanroep: een vir **arbitrêre skrywe** en nog een om weer die **terugkeeradres van `__libc_csu_fini`** op die stapel te oorskryf om homself weer aan te roep.
> [!CAUTION]
> Let daarop dat met [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** die afdeling **`.fini_array`** **lees-slegs** gemaak word.
> In nuwer weergawes, selfs met [**Partial RELRO**] word die afdeling **`.fini_array`** ook **lees-slegs** gemaak.
{{#include ../../banners/hacktricks-training.md}}