Array Indexing
Βασικές Πληροφορίες
Αυτή η κατηγορία περιλαμβάνει όλες τις ευπάθειες που συμβαίνουν επειδή είναι δυνατόν να αντικατασταθεί συγκεκριμένα δεδομένα μέσω σφαλμάτων στην χειρισμό των δεικτών σε πίνακες. Είναι μια πολύ ευρεία κατηγορία χωρίς συγκεκριμένη μεθοδολογία καθώς ο μηχανισμός εκμετάλλευσης εξαρτάται πλήρως από τις συνθήκες της ευπάθειας.
Ωστόσο, εδώ μπορείτε να βρείτε μερικά ωραία παραδείγματα:
Υπάρχουν 2 συγκρουόμενοι πίνακες, ένας για τις διευθύνσεις όπου αποθηκεύονται τα δεδομένα και ένας με τις διαστάσεις αυτών των δεδομένων. Είναι δυνατό να αντικατασταθεί ένας από τον άλλο, επιτρέποντας την εγγραφή μιας αυθαίρετης διεύθυνσης που την δείχνει ως μέγεθος. Αυτό επιτρέπει την εγγραφή της διεύθυνσης της συνάρτησης
free
στον πίνακα GOT και στη συνέχεια την αντικατάστασή της με τη διεύθυνση τουsystem
, και την κλήση της free από μνήμη με/bin/sh
.64 bits, χωρίς nx. Αντικατάσταση μιας διάστασης για να πάρετε ένα είδος υπερχείλισης buffer όπου κάθε πράγμα θα χρησιμοποιηθεί ως διπλός αριθμός και θα ταξινομηθεί από τον μικρότερο στον μεγαλύτερο, επομένως είναι απαραίτητο να δημιουργηθεί ένα shellcode που πληροί αυτήν την απαίτηση, λαμβάνοντας υπόψη ότι το canary δεν πρέπει να μετακινηθεί από τη θέση του και τελικά να αντικατασταθεί το RIP με μια διεύθυνση προς ret, που πληροί τις προηγούμενες απαιτήσεις και τοποθετώντας τη μεγαλύτερη διεύθυνση μια νέα διεύθυνση που δείχνει στην αρχή του stack (διαρροή από το πρόγραμμα) έτσι ώστε να είναι δυνατή η χρήση του ret για να μεταβεί εκεί.
64bits, χωρίς relro, canary, nx, χωρίς pie. Υπάρχει ένα off-by-one σε έναν πίνακα στη στοίβα που επιτρέπει τον έλεγχο ενός δείκτη που χορηγεί WWW (γράφει το άθροισμα όλων των αριθμών του πίνακα στην αντικατασταθείσα διεύθυνση από το off-by-one στον πίνακα). Η στοίβα ελέγχεται έτσι ώστε η διεύθυνση
exit
του GOT να αντικατασταθεί μεpop rdi; ret
, και στη στοίβα προστίθεται η διεύθυνση τουmain
(επαναλαμβάνοντας στοmain
). Χρησιμοποιείται μια αλυσίδα ROP για να διαρρεύσει η διεύθυνση του put στο GOT χρησιμοποιώντας το puts (exit
θα κληθεί έτσι θα καλέσειpop rdi; ret
εκτελώντας έτσι αυτήν την αλυσίδα στη στοίβα). Τέλος χρησιμοποιείται μια νέα αλυσίδα ROP που εκτελεί ret2lib.32 bit, χωρίς relro, χωρίς canary, nx, pie. Εκμεταλλευτείτε ένα κακό δείκτη για να διαρρεύσετε διευθύνσεις της libc και της στοίβας από τη στοίβα. Εκμεταλλευτείτε την υπερχείλιση του buffer για να κάνετε ένα ret2lib καλώντας
system('/bin/sh')
(η διεύθυνση της στοίβας χρειάζεται για να παρακάμψει έναν έλεγχο).
Last updated