WWW2Exec - .dtors & .fini_array
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Σήμερα είναι πολύ περίεργο να βρείτε ένα δυαδικό αρχείο με τμήμα .dtors!
Οι καταστροφείς είναι συναρτήσεις που εκτελούνται πριν το πρόγραμμα τελειώσει (μετά την επιστροφή της συνάρτησης main
).
Οι διευθύνσεις αυτών των συναρτήσεων αποθηκεύονται μέσα στο .dtors
τμήμα του δυαδικού αρχείου και επομένως, αν καταφέρετε να γράψετε τη διεύθυνση σε ένα shellcode στο __DTOR_END__
, αυτό θα εκτελεστεί πριν το πρόγραμμα τελειώσει.
Αποκτήστε τη διεύθυνση αυτού του τμήματος με:
Συνήθως θα βρείτε τους DTOR δείκτες μεταξύ των τιμών ffffffff
και 00000000
. Έτσι, αν δείτε μόνο αυτές τις τιμές, σημαίνει ότι δεν υπάρχει καμία καταχωρημένη συνάρτηση. Έτσι, επικαλύψτε το 00000000
με τη διεύθυνση του shellcode για να το εκτελέσετε.
Φυσικά, πρώτα πρέπει να βρείτε μια θέση για να αποθηκεύσετε το shellcode προκειμένου να το καλέσετε αργότερα.
Ουσιαστικά, αυτή είναι μια δομή με συναρτήσεις που θα κληθούν πριν το πρόγραμμα τελειώσει, όπως οι .dtors
. Αυτό είναι ενδιαφέρον αν μπορείτε να καλέσετε το shellcode απλά πηδώντας σε μια διεύθυνση, ή σε περιπτώσεις όπου χρειάζεται να επιστρέψετε ξανά στο main
για να εκμεταλλευτείτε την ευπάθεια μια δεύτερη φορά.
Σημειώστε ότι όταν εκτελείται μια συνάρτηση από το .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
στη στοίβα για να καλέσει ξανά τον εαυτό του.
Σημειώστε ότι με Full RELRO, η ενότητα .fini_array
γίνεται μόνο για ανάγνωση. Σε νεότερες εκδόσεις, ακόμη και με [Partial RELRO] η ενότητα .fini_array
γίνεται μόνο για ανάγνωση επίσης.
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)