hacktricks/binary-exploitation/array-indexing.md

6.2 KiB
Raw Blame History

Δείκτες Πίνακα

{% hint style="success" %} Μάθετε & εξασκηθείτε στο Hacking του AWS:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο Hacking του GCP: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)

Υποστηρίξτε το HackTricks
{% endhint %}

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

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

Ωστόσο, εδώ μπορείτε να βρείτε μερικά ωραία παραδείγματα:

  • https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html
  • Υπάρχουν 2 συγκρουόμενοι πίνακες, ένας για τις διευθύνσεις όπου αποθηκεύονται τα δεδομένα και ένας με τις διαστάσεις αυτών των δεδομένων. Είναι δυνατόν να αντικατασταθεί ένας από τον άλλο, επιτρέποντας την εγγραφή μιας αυθαίρετης διεύθυνσης δείχνοντάς την ως μέγεθος. Αυτό επιτρέπει την εγγραφή της διεύθυνσης της συνάρτησης free στον πίνακα GOT και στη συνέχεια την αντικατάστασή της με τη διεύθυνση του system, και την κλήση της free από μνήμη με /bin/sh.
  • https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html
  • 64 bits, χωρίς nx. Αντικαταστήστε μια διάσταση για να πάρετε ένα είδος υπερχείλισης buffer όπου όλα θα χρησιμοποιηθούν ως διπλός αριθμός και θα ταξινομηθούν από τον μικρότερο στον μεγαλύτερο, επομένως είναι απαραίτητο να δημιουργηθεί ένα shellcode που να πληροί αυτήν την απαίτηση, λαμβάνοντας υπόψη ότι το canary δεν πρέπει να μετακινηθεί από τη θέση του και τελικά να αντικατασταθεί το RIP με μια διεύθυνση προς ret, που να πληροί τις προηγούμενες απαιτήσεις και να τοποθετηθεί η μεγαλύτερη διεύθυνση μιας νέας διεύθυνσης που να δείχνει στην αρχή του stack (διαρρεύτηκε από το πρόγραμμα) έτσι ώστε να είναι δυνατή η χρήση του ret για να μεταβεί εκεί.
  • https://faraz.faith/2019-10-20-secconctf-2019-sum/
  • 64bits, χωρίς relro, canary, nx, χωρίς pie. Υπάρχει ένα off-by-one σε έναν πίνακα στη στοίβα που επιτρέπει τον έλεγχο ενός δείκτη που χορηγεί WWW (γράφει το άθροισμα όλων των αριθμών του πίνακα στην αντικατασταθείσα διεύθυνση από το off-by-one στον πίνακα). Η στοίβα ελέγχεται έτσι ώστε η διεύθυνση exit του GOT να αντικατασταθεί με pop rdi; ret, και στη στοίβα προστίθεται η διεύθυνση του main (επαναλαμβάνοντας στο main). Χρησιμοποιείται μια ROP αλυσίδα για να διαρρεύσει η διεύθυνση που έχει τοποθετηθεί στο GOT χρησιμοποιώντας την puts (exit θα κληθεί έτσι θα καλέσει pop rdi; ret εκτελώντας έτσι αυτήν την αλυσίδα στη στοίβα). Τέλος χρησιμοποιείται μια νέα ROP αλυσίδα εκτελώντας ret2lib.
  • https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
  • 32 bit, χωρίς relro, χωρίς canary, nx, pie. Εκμεταλλευτείτε έναν κακό δείκτη για να διαρρεύσετε διευθύνσεις της libc και της στοίβας από τη στοίβα. Εκμεταλλευτείτε την υπερχείλιση του buffer για να κάνετε ένα ret2lib καλώντας system('/bin/sh') (η διεύθυνση της στοίβας χρειάζεται για να παρακάμψει έναν έλεγχο).