Format Strings
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
If you are interested in hacking career and hack the unhackable - we are hiring! (απαιτείται άριστη γνώση πολωνικών, γραπτά και προφορικά).
In C printf
είναι μια συνάρτηση που μπορεί να χρησιμοποιηθεί για να εκτυπώσει κάποιο κείμενο. Η πρώτη παράμετρος που περιμένει αυτή η συνάρτηση είναι το ακατέργαστο κείμενο με τους μορφοποιητές. Οι επόμενες παράμετροι που αναμένονται είναι οι τιμές για να αντικαταστήσουν τους μορφοποιητές από το ακατέργαστο κείμενο.
Άλλες ευάλωτες συναρτήσεις είναι οι sprintf()
και fprintf()
.
Η ευπάθεια εμφανίζεται όταν ένα κείμενο επιτιθέμενου χρησιμοποιείται ως η πρώτη παράμετρος σε αυτή τη συνάρτηση. Ο επιτιθέμενος θα είναι σε θέση να δημιουργήσει μια ειδική είσοδο εκμεταλλευόμενος τις δυνατότητες της printf format string για να διαβάσει και να γράψει οποιαδήποτε δεδομένα σε οποιαδήποτε διεύθυνση (αναγνώσιμη/γραπτή). Έχοντας έτσι τη δυνατότητα να εκτελέσει αυθαίρετο κώδικα.
Παραδείγματα:
Ευάλωτο παράδειγμα:
Κανονική Χρήση:
Με Ελλείποντες Παραμέτρους:
fprintf ευάλωτο:
Η μορφή %<n>$x
, όπου n
είναι ένας αριθμός, επιτρέπει να υποδείξετε στο printf να επιλέξει την n παράμετρο (από τη στοίβα). Έτσι, αν θέλετε να διαβάσετε την 4η παράμετρο από τη στοίβα χρησιμοποιώντας το printf, μπορείτε να κάνετε:
και θα διάβαζες από την πρώτη έως την τέταρτη παράμετρο.
Ή θα μπορούσες να κάνεις:
και να διαβάσει απευθείας το τέταρτο.
Σημειώστε ότι ο επιτιθέμενος ελέγχει την παράμετρο printf
, που σημαίνει βασικά ότι η είσοδός του θα είναι στη στοίβα όταν καλείται το printf
, που σημαίνει ότι θα μπορούσε να γράψει συγκεκριμένες διευθύνσεις μνήμης στη στοίβα.
Ένας επιτιθέμενος που ελέγχει αυτή την είσοδο, θα είναι σε θέση να προσθέσει αυθαίρετες διευθύνσεις στη στοίβα και να κάνει το printf
να τις προσπελάσει. Στην επόμενη ενότητα θα εξηγηθεί πώς να χρησιμοποιηθεί αυτή η συμπεριφορά.
Είναι δυνατόν να χρησιμοποιηθεί ο μορφοποιητής %n$s
για να κάνει το printf
να αποκτήσει τη διεύθυνση που βρίσκεται στη n θέση, ακολουθώντας την και να την εκτυπώσει σαν να ήταν μια συμβολοσειρά (εκτύπωση μέχρι να βρεθεί ένα 0x00). Έτσι, αν η βασική διεύθυνση του δυαδικού είναι 0x8048000
, και γνωρίζουμε ότι η είσοδος του χρήστη ξεκινά στην 4η θέση στη στοίβα, είναι δυνατόν να εκτυπωθεί η αρχή του δυαδικού με:
Σημειώστε ότι δεν μπορείτε να βάλετε τη διεύθυνση 0x8048000 στην αρχή της εισόδου γιατί η συμβολοσειρά θα κοπεί στο 0x00 στο τέλος αυτής της διεύθυνσης.
Για να βρείτε την απόσταση στην είσοδό σας, μπορείτε να στείλετε 4 ή 8 bytes (0x41414141
) ακολουθούμενα από %1$x
και να αυξήσετε την τιμή μέχρι να ανακτήσετε τα A's
.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)