free
Last updated
Last updated
Μάθετε & εξασκηθείτε στο Hacking του AWS:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο Hacking του GCP: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)
(Δεν εξηγούνται ελέγχοι σε αυτήν την περίληψη και ορισμένες περιπτώσεις έχουν παραλειφθεί για συντομία)
Αν η διεύθυνση είναι null, μην κάνετε τίποτα
Αν το κομμάτι ήταν διαμορφωμένο με χρήση mmap, απελευθερώστε το και τελειώστε
Καλέστε _int_free
:
Αν είναι δυνατό, προσθέστε το κομμάτι στην tcache
Αν είναι δυνατό, προσθέστε το κομμάτι στο fast bin
Καλέστε το _int_free_merge_chunk
για να συγχωνεύσετε το κομμάτι αν είναι απαραίτητο και προσθέστε το στη λίστα των μη ταξινομημένων
Το Free
καλεί το __libc_free
.
Αν η διεύθυνση που περνάται είναι Null (0), μην κάνετε τίποτα.
Ελέγξτε το ετικέτα δείκτη
Αν το κομμάτι είναι mmaped
, απελευθερώστε το και τέλος
Αν όχι, προσθέστε το χρώμα και καλέστε το _int_free
πάνω του
Αρχικά θα προσπαθήσει να δεσμεύσει αυτό το κομμάτι μνήμης στο σχετικό tcache. Ωστόσο, πραγματοποιούνται ορισμένοι έλεγχοι πριν. Θα επαναλάβει όλα τα κομμάτια του tcache στον ίδιο δείκτη με το απελευθερωμένο κομμάτι και:
Αν υπάρχουν περισσότερες καταχωρήσεις από mp_.tcache_count
: free(): too many chunks detected in tcache
Αν η καταχώρηση δεν είναι ευθυγραμμισμένη: free(): unaligned chunk detected in tcache 2
Αν το απελευθερωμένο κομμάτι έχει ήδη απελευθερωθεί και υπάρχει ως κομμάτι στο tcache: free(): double free detected in tcache 2
Αν όλα πάνε καλά, το κομμάτι προστίθεται στο tcache και η συνάρτηση επιστρέφει.
Ξεκινήστε ελέγχοντας αν το μέγεθος είναι κατάλληλο για τον γρήγορο κάδο και ελέγξτε αν είναι δυνατόν να το τοποθετήσετε κοντά στο κομμάτι κορυφής.
Στη συνέχεια, προσθέστε το απελευθερωμένο κομμάτι στην κορυφή του γρήγορου κάδου ενώ πραγματοποιείτε ορισμένους ελέγχους:
Εάν το μέγεθος του κομματιού είναι μη έγκυρο (πολύ μεγάλο ή μικρό) ενεργοποιήστε: free(): invalid next size (fast)
Εάν το προστιθέμενο κομμάτι ήταν ήδη στην κορυφή του γρήγορου κάδου: double free or corruption (fasttop)
Εάν το μέγεθος του κομματιού στην κορυφή έχει διαφορετικό μέγεθος από το κομμάτι που προσθέτουμε: invalid fastbin entry (free)
Αυτή η συνάρτηση θα προσπαθήσει να συγχωνεύσει το κομμάτι P με μέγεθος SIZE bytes με τους γείτονές του. Θα τοποθετήσει το αποτέλεσμα στη λίστα unsorted bin.
Κάποιοι έλεγχοι πραγματοποιούνται:
Αν το κομμάτι είναι το κορυφαίο κομμάτι: double free or corruption (top)
Αν το επόμενο κομμάτι βρίσκεται έξω από τα όρια της αρένας: double free or corruption (out)
Αν το κομμάτι δεν είναι σημασιοδοτημένο ως χρησιμοποιημένο (στο prev_inuse
από το επόμενο κομμάτι): double free or corruption (!prev)
Αν το επόμενο κομμάτι έχει πολύ μικρό ή πολύ μεγάλο μέγεθος: free(): invalid next size (normal)
Αν το προηγούμενο κομμάτι δεν είναι σε χρήση, θα προσπαθήσει να συγχωνεύσει. Αλλά, αν το prev_size διαφέρει από το μέγεθος που υποδεικνύεται στο προηγούμενο κομμάτι: corrupted size vs. prev_size while consolidating