PIE

Υποστήριξε το HackTricks

Βασικές Πληροφορίες

Ένα δυαδικό που έχει μεταγλωττιστεί ως PIE, ή Position Independent Executable, σημαίνει ότι το πρόγραμμα μπορεί να φορτωθεί σε διαφορετικές θέσεις μνήμης κάθε φορά που εκτελείται, αποτρέποντας τις σκληροκωδικοποιημένες διευθύνσεις.

Το κόλπο για την εκμετάλλευση αυτών των δυαδικών βρίσκεται στην εκμετάλλευση των σχετικών διευθύνσεων - οι μετατοπίσεις μεταξύ τμημάτων του προγράμματος παραμένουν ίδιες ακόμα κι αν οι απόλυτες τοποθεσίες αλλάζουν. Για να παρακάμψετε το PIE, χρειάζεται μόνο να διαρρεύσετε μια διεύθυνση, συνήθως από τη στοίβα χρησιμοποιώντας ευπάθειες όπως οι επιθέσεις με format string. Αφού αποκτήσετε μια διεύθυνση, μπορείτε να υπολογίσετε άλλες με βάση τις σταθερές μετατοπίσεις τους.

Ένα χρήσιμο υπόδειγμα στην εκμετάλλευση των δυαδικών PIE είναι ότι η βασική διεύθυνσή τους τελειώνει συνήθως σε 000 λόγω των σελίδων μνήμης που είναι οι μονάδες τυχαιοποίησης, μεγέθους 0x1000 bytes. Αυτή η ευθυγράμμιση μπορεί να είναι ένα κρίσιμο έλεγχος αν ένα εκμετάλλευση δεν λειτουργεί όπως αναμένεται, υποδεικνύοντας εάν έχει εντοπιστεί η σωστή βασική διεύθυνση. Ή μπορείτε να χρησιμοποιήσετε αυτό για την εκμετάλλευσή σας, αν διαρρεύσετε ότι μια διεύθυνση βρίσκεται στο 0x649e1024 ξέρετε ότι η βασική διεύθυνση είναι 0x649e1000 και από εκεί μπορείτε απλά να υπολογίσετε τις μετατοπίσεις των λειτουργιών και των τοποθεσιών.

Παρακάμψεις

Για να παρακάμψετε το PIE χρειάζεται να διαρρεύσετε κάποια διεύθυνση του φορτωμένου δυαδικού, υπάρχουν μερικές επιλογές γι' αυτό:

  • Απενεργοποιημένο ASLR: Εάν το ASLR είναι απενεργοποιημένο ένα δυαδικό με μεταγλώττιση ως PIE θα φορτώνεται πάντα στην ίδια διεύθυνση, επομένως το PIE θα είναι άχρηστο καθώς οι διευθύνσεις των αντικειμένων θα είναι πάντα στον ίδιο χώρο.

  • Να σας δοθεί η διαρροή (συνηθισμένη σε εύκολες προκλήσεις CTF, ελέγξτε αυτό το παράδειγμα)

  • Δοκιμάστε όλες τις τιμές EBP και EIP στη στοίβα μέχρι να διαρρεύσετε τις σωστές:

BF Addresses in the Stack
  • Χρησιμοποιήστε μια ευπάθεια αυθαίρετης ανάγνωσης όπως η format string για να διαρρεύσετε μια διεύθυνση του δυαδικού (π.χ. από τη στοίβα, όπως στην προηγούμενη τεχνική) για να πάρετε τη βάση του δυαδικού και να χρησιμοποιήσετε μετατοπίσεις από εκεί. Βρείτε ένα παράδειγμα εδώ.

Αναφορές

Υποστήριξε το HackTricks

Last updated