Ret2ret & Reo2pop
Ret2ret
Ο κύριος στόχος αυτής της τεχνικής είναι να προσπαθήσει να παρακάμψει το ASLR εκμεταλλευόμενος έναν υπάρχοντα δείκτη στη στοίβα.
Βασικά, οι υπερχείλισεις στη στοίβα προκαλούνται συνήθως από συμβολοσειρές, και οι συμβολοσειρές τελειώνουν με ένα μηδενικό byte στο τέλος στη μνήμη. Αυτό επιτρέπει να προσπαθήσουμε να μειώσουμε τον τόπο που δείχνει ήδη ένας υπάρχον δείκτης στη στοίβα. Έτσι, αν η στοίβα περιείχε 0xbfffffdd
, αυτή η υπερχείλιση θα μπορούσε να τη μετατρέψει σε 0xbfffff00
(σημειώστε το τελευταίο μηδενισμένο byte).
Αν αυτή η διεύθυνση δείχνει στο shellcode μας στη στοίβα, είναι δυνατόν να κάνουμε τη ροή να φτάσει σε αυτή τη διεύθυνση με το προσθήκη διευθύνσεων στην εντολή ret
μέχρι να φτάσουμε σε αυτήν.
Έτσι η επίθεση θα ήταν ως εξής:
NOP sled
Shellcode
Αντικατάσταση της στοίβας από το EIP με διευθύνσεις προς την
ret
εντολή (RET sled)0x00 προστίθεται από τη συμβολοσειρά τροποποιώντας μια διεύθυνση από τη στοίβα καθιστώντας τη να δείχνει στο NOP sled
Ακολουθώντας αυτόν το σύνδεσμο μπορείτε να δείτε ένα παράδειγμα ενός ευάλωτου δυαδικού και σε αυτόν την εκμετάλλευση.
Ret2pop
Σε περίπτωση που μπορείτε να βρείτε έναν τέλειο δείκτη στη στοίβα που δεν θέλετε να τροποποιήσετε (στο ret2ret
αλλάξαμε το τελικό χαμηλότερο byte σε 0x00
), μπορείτε να εκτελέσετε την ίδια επίθεση ret2ret
, αλλά το μήκος του RET sled πρέπει να είναι μικρότερο κατά 1 (ώστε το τελικό 0x00
να αντικαθιστά τα δεδομένα ακριβώς πριν τον τέλειο δείκτη), και η τελευταία διεύθυνση του RET sled πρέπει να δείχνει σε pop <reg>; ret
.
Με αυτόν τον τρόπο, τα δεδομένα πριν τον τέλειο δείκτη θα αφαιρεθούν από τη στοίβα (αυτά είναι τα δεδομένα που επηρεάζονται από το 0x00
) και το τελικό ret
θα δείχνει στην τέλεια διεύθυνση στη στοίβα χωρίς καμία αλλαγή.
Ακολουθώντας αυτόν το σύνδεσμο μπορείτε να δείτε ένα παράδειγμα ενός ευάλωτου δυαδικού και σε αυτόν την εκμετάλλευση.
Αναφορές
Last updated