mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
53 lines
3.1 KiB
Markdown
53 lines
3.1 KiB
Markdown
# WWW2Exec - .dtors & .fini_array
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## .dtors
|
|
|
|
> [!CAUTION]
|
|
> Obecnie bardzo **dziwne jest znalezienie binarnego pliku z sekcją .dtors!**
|
|
|
|
Destruktory to funkcje, które są **wykonywane przed zakończeniem programu** (po zwróceniu funkcji `main`).\
|
|
Adresy tych funkcji są przechowywane w sekcji **`.dtors`** binarnego pliku, a zatem, jeśli uda ci się **zapisać** **adres** do **shellcode** w **`__DTOR_END__`**, to zostanie on **wykonany** przed zakończeniem programu.
|
|
|
|
Uzyskaj adres tej sekcji za pomocą:
|
|
```bash
|
|
objdump -s -j .dtors /exec
|
|
rabin -s /exec | grep “__DTOR”
|
|
```
|
|
Zazwyczaj znajdziesz znaczniki **DTOR** **pomiędzy** wartościami `ffffffff` i `00000000`. Więc jeśli widzisz tylko te wartości, oznacza to, że **nie ma zarejestrowanej funkcji**. Więc **nadpisz** **`00000000`** adresem do **shellcode**, aby go wykonać.
|
|
|
|
> [!WARNING]
|
|
> Oczywiście, najpierw musisz znaleźć **miejsce na przechowanie shellcode**, aby później móc go wywołać.
|
|
|
|
## **.fini_array**
|
|
|
|
Zasadniczo jest to struktura z **funkcjami, które będą wywoływane** przed zakończeniem programu, jak **`.dtors`**. To jest interesujące, jeśli możesz wywołać swój **shellcode, po prostu skacząc do adresu**, lub w przypadkach, gdy musisz wrócić do **`main`**, aby **wykorzystać lukę po raz drugi**.
|
|
```bash
|
|
objdump -s -j .fini_array ./greeting
|
|
|
|
./greeting: file format elf32-i386
|
|
|
|
Contents of section .fini_array:
|
|
8049934 a0850408
|
|
|
|
#Put your address in 0x8049934
|
|
```
|
|
Zauważ, że gdy funkcja z **`.fini_array`** jest wykonywana, przechodzi do następnej, więc nie będzie wykonywana kilka razy (zapobiegając wiecznym pętlom), ale także da tylko 1 **wykonanie funkcji** umieszczonej tutaj.
|
|
|
|
Zauważ, że wpisy w **`.fini_array`** są wywoływane w **odwrotnej** kolejności, więc prawdopodobnie chcesz zacząć pisać od ostatniego.
|
|
|
|
#### Wieczna pętla
|
|
|
|
Aby wykorzystać **`.fini_array`** do uzyskania wiecznej pętli, możesz [**sprawdzić, co zrobiono tutaj**](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)**:** Jeśli masz co najmniej 2 wpisy w **`.fini_array`**, możesz:
|
|
|
|
- Użyć swojego pierwszego zapisu, aby **ponownie wywołać podatną funkcję do dowolnego zapisu**
|
|
- Następnie obliczyć adres powrotu na stosie przechowywany przez **`__libc_csu_fini`** (funkcję, która wywołuje wszystkie funkcje z **`.fini_array`**) i umieścić tam **adres `__libc_csu_fini`**
|
|
- To spowoduje, że **`__libc_csu_fini`** wywoła się ponownie, wykonując funkcje **`.fini_array`** ponownie, co spowoduje wywołanie podatnej funkcji WWW 2 razy: raz dla **dowolnego zapisu** i jeszcze raz, aby ponownie nadpisać **adres powrotu `__libc_csu_fini`** na stosie, aby ponownie się wywołać.
|
|
|
|
> [!CAUTION]
|
|
> Zauważ, że przy [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** sekcja **`.fini_array`** jest ustawiona na **tylko do odczytu**.
|
|
> W nowszych wersjach, nawet przy [**Partial RELRO**] sekcja **`.fini_array`** jest również ustawiona na **tylko do odczytu**.
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|