WWW2Exec - .dtors & .fini_array

Reading time: 4 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

.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 για να αποκτήσετε έναν αιώνιο βρόχο μπορείτε να ελέγξετε τι έγινε εδώ: Εάν έχετε τουλάχιστον 2 καταχωρίσεις στο .fini_array, μπορείτε να:

  • Χρησιμοποιήσετε την πρώτη σας εγγραφή για να καλέσετε ξανά τη λειτουργία ευάλωτης αυθαίρετης εγγραφής
  • Στη συνέχεια, υπολογίστε τη διεύθυνση επιστροφής στη στοίβα που αποθηκεύεται από το __libc_csu_fini (τη συνάρτηση που καλεί όλες τις συναρτήσεις του .fini_array) και τοποθετήστε εκεί τη διεύθυνση του __libc_csu_fini
  • Αυτό θα κάνει το __libc_csu_fini να καλέσει ξανά τον εαυτό του εκτελώντας ξανά τις συναρτήσεις του .fini_array, οι οποίες θα καλέσουν τη ευάλωτη WWW συνάρτηση 2 φορές: μία για αυθαίρετη εγγραφή και μία άλλη για να ξαναγράψει τη διεύθυνση επιστροφής του __libc_csu_fini στη στοίβα για να καλέσει ξανά τον εαυτό του.

caution

Σημειώστε ότι με Full RELRO, η ενότητα .fini_array είναι μόνο για ανάγνωση. Σε νεότερες εκδόσεις, ακόμη και με [Partial RELRO] η ενότητα .fini_array είναι επίσης μόνο για ανάγνωση.

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks