mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
53 lines
5.1 KiB
Markdown
53 lines
5.1 KiB
Markdown
# 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}}
|