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

53 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WWW2Exec - .dtors & .fini_array
{{#include ../../banners/hacktricks-training.md}}
## .dtors
> [!CAUTION]
> Σήμερα είναι πολύ **περίεργο να βρεις ένα δυαδικό αρχείο με τμήμα .dtors!**
Οι καταστροφείς είναι συναρτήσεις που **εκτελούνται πριν το πρόγραμμα τελειώσει** (μετά την επιστροφή της συνάρτησης `main`).\
Οι διευθύνσεις αυτών των συναρτήσεων αποθηκεύονται μέσα στο **`.dtors`** τμήμα του δυαδικού αρχείου και επομένως, αν καταφέρετε να **γράψετε** τη **διεύθυνση** σε ένα **shellcode** στο **`__DTOR_END__`**, αυτό θα **εκτελεστεί** πριν το πρόγραμμα τελειώσει.
Πάρτε τη διεύθυνση αυτού του τμήματος με:
```bash
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
```
Συνήθως θα βρείτε τους **DTOR** δείκτες **μεταξύ** των τιμών `ffffffff` και `00000000`. Έτσι, αν δείτε μόνο αυτές τις τιμές, σημαίνει ότι **δεν υπάρχει καμία καταχωρημένη συνάρτηση**. Έτσι, **επικαλύψτε** το **`00000000`** με τη **διεύθυνση** του **shellcode** για να το εκτελέσετε.
> [!WARNING]
> Φυσικά, πρώτα πρέπει να βρείτε μια **θέση για να αποθηκεύσετε το shellcode** προκειμένου να το καλέσετε αργότερα.
## **.fini_array**
Ουσιαστικά, αυτή είναι μια δομή με **συναρτήσεις που θα κληθούν** πριν το πρόγραμμα τελειώσει, όπως η **`.dtors`**. Αυτό είναι ενδιαφέρον αν μπορείτε να καλέσετε το **shellcode απλά πηδώντας σε μια διεύθυνση**, ή σε περιπτώσεις όπου χρειάζεται να επιστρέψετε **πίσω στο `main`** ξανά για να **εκμεταλλευτείτε την ευπάθεια μια δεύτερη φορά**.
```bash
objdump -s -j .fini_array ./greeting
./greeting: file format elf32-i386
Contents of section .fini_array:
8049934 a0850408
#Put your address in 0x8049934
```
Σημειώστε ότι όταν εκτελείται μια συνάρτηση από το **`.fini_array`**, μετακινείται στην επόμενη, οπότε δεν θα εκτελείται πολλές φορές (αποτρέποντας τους αιώνιους βρόχους), αλλά επίσης θα σας δώσει μόνο 1 **εκτέλεση της συνάρτησης** που τοποθετείται εδώ.
Σημειώστε ότι οι καταχωρίσεις στο **`.fini_array`** καλούνται σε **αντίστροφη** σειρά, οπότε πιθανώς θέλετε να αρχίσετε να γράφετε από την τελευταία.
#### Αιώνιος βρόχος
Για να εκμεταλλευτείτε το **`.fini_array`** για να αποκτήσετε έναν αιώνιο βρόχο μπορείτε να [**ελέγξετε τι έγινε εδώ**](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)**:** Εάν έχετε τουλάχιστον 2 καταχωρίσεις στο **`.fini_array`**, μπορείτε να:
- Χρησιμοποιήσετε την πρώτη σας εγγραφή για να **καλέσετε ξανά τη λειτουργία ευάλωτης αυθαίρετης εγγραφής**
- Στη συνέχεια, υπολογίστε τη διεύθυνση επιστροφής στη στοίβα που αποθηκεύεται από το **`__libc_csu_fini`** (τη συνάρτηση που καλεί όλες τις συναρτήσεις του **`.fini_array`**) και τοποθετήστε εκεί τη **διεύθυνση του `__libc_csu_fini`**
- Αυτό θα κάνει το **`__libc_csu_fini`** να καλέσει ξανά τον εαυτό του εκτελώντας ξανά τις συναρτήσεις του **`.fini_array`**, οι οποίες θα καλέσουν τη ευάλωτη WWW συνάρτηση 2 φορές: μία για **αυθαίρετη εγγραφή** και μία άλλη για να ξαναγράψει τη **διεύθυνση επιστροφής του `__libc_csu_fini`** στη στοίβα για να καλέσει ξανά τον εαυτό του.
> [!CAUTION]
> Σημειώστε ότι με [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** η ενότητα **`.fini_array`** είναι **μόνο για ανάγνωση**.
> Σε νεότερες εκδόσεις, ακόμη και με [**Partial RELRO**] η ενότητα **`.fini_array`** είναι επίσης **μόνο για ανάγνωση**.
{{#include ../../banners/hacktricks-training.md}}