WWW2Exec - .dtors & .fini_array
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: Εκπαίδευση HackTricks 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)