Format Strings
Βασικές Πληροφορίες
Στη γλώσσα C, η printf
είναι μια συνάρτηση που μπορεί να χρησιμοποιηθεί για να εκτυπώσει μια συμβολοσειρά. Η πρώτη παράμετρος που αναμένει αυτή η συνάρτηση είναι το ακατέργαστο κείμενο με τους μορφοποιητές. Οι επόμενες παράμετροι που αναμένονται είναι οι τιμές που θα αντικατασταθούν στους μορφοποιητές από το ακατέργαστο κείμενο.
Άλλες ευάλωτες συναρτήσεις είναι οι sprintf()
και fprintf()
.
Η ευπάθεια εμφανίζεται όταν ένα κείμενο επιτιθέμενου χρησιμοποιείται ως η πρώτη παράμετρος σε αυτή τη συνάρτηση. Ο επιτιθέμενος θα μπορεί να δημιουργήσει μια ειδική είσοδο καταχρώμενος τις δυνατότητες της συμβολοσειράς μορφοποίησης του printf για να διαβάσει και εγγράψει οποιαδήποτε δεδομένα σε οποιαδήποτε διεύθυνση (αναγνώσιμη/εγγράψιμη). Με αυτόν τον τρόπο είναι δυνατή η εκτέλεση αυθαίρετου κώδικα.
Παραδείγματα:
Ευάλωτο παράδειγμα:
Κανονική Χρήση:
Με Λείποντα Ορίσματα:
ευάλωτη συνάρτηση fprintf:
Πρόσβαση σε Δείκτες
Η μορφή %<n>$x
, όπου n
είναι ένας αριθμός, επιτρέπει στο printf να επιλέξει την παράμετρο n (από τη στοίβα). Έτσι, αν θέλετε να διαβάσετε την 4η παράμετρο από τη στοίβα χρησιμοποιώντας το printf, μπορείτε να κάνετε:
και θα διαβάζετε από την πρώτη έως την τέταρτη παράμετρο.
Ή μπορείτε να κάνετε:
και διαβάστε απευθείας το τέταρτο.
Σημειώστε ότι ο επιτιθέμενος ελέγχει την παράμετρο pr
intf
, που σημαίνει βασικά ότι η είσοδός του θα βρίσκεται στη στοίβα όταν καλείται το printf
, πράγμα που σημαίνει ότι θα μπορούσε να γράψει συγκεκριμένες διευθύνσεις μνήμης στη στοίβα.
Ένας επιτιθέμενος που ελέγχει αυτήν την είσοδο, θα μπορεί να προσθέσει αυθαίρετη διεύθυνση στη στοίβα και να κάνει το printf
να τις προσπελάσει. Στην επόμενη ενότητα θα εξηγηθεί πώς να χρησιμοποιηθεί αυτή η συμπεριφορά.
Αυθαίρετη Ανάγνωση
Είναι δυνατό να χρησιμοποιηθεί ο μορφοποιητής %n$s
για να πάρει τη διεύθυνση που βρίσκεται στη θέση n, ακολουθούμενη από αυτή και να την εκτυπώσει σαν να ήταν ένα string (εκτύπωση μέχρι να βρεθεί το 0x00). Έτσι, αν η βασική διεύθυνση του δυαδικού είναι 0x8048000
, και γνωρίζουμε ότι η είσοδος του χρήστη ξεκινά στην 4η θέση στη στοίβα, είναι δυνατό να εκτυπώσουμε την αρχή του δυαδικού με:
Σημειώστε ότι δεν μπορείτε να τοποθετήσετε τη διεύθυνση 0x8048000 στην αρχή της εισόδου επειδή η συμβολοσειρά θα καταλήξει στο 0x00 στο τέλος αυτής της διεύθυνσης.
Εύρεση μετατόπισης
Για να βρείτε τη μετατόπιση προς την είσοδό σας, μπορείτε να στείλετε 4 ή 8 bytes (0x41414141
) ακολουθούμενα από το %1$x
και να αυξήσετε την τιμή μέχρι να ανακτήσετε τα A's
.
Last updated