Basic Stack Binary Exploitation Methodology
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Πριν ξεκινήσετε να εκμεταλλεύεστε οτιδήποτε, είναι ενδιαφέρον να κατανοήσετε μέρος της δομής ενός δυαδικού αρχείου ELF:
ELF Basic InformationΜε τόσες πολλές τεχνικές, είναι καλό να έχετε ένα σχέδιο για το πότε θα είναι χρήσιμη κάθε τεχνική. Σημειώστε ότι οι ίδιες προστασίες θα επηρεάσουν διαφορετικές τεχνικές. Μπορείτε να βρείτε τρόπους να παρακάμψετε τις προστασίες σε κάθε ενότητα προστασίας, αλλά όχι σε αυτή τη μεθοδολογία.
Υπάρχουν διάφοροι τρόποι που μπορείτε να ελέγξετε τη ροή ενός προγράμματος:
Stack Overflows που επαναγράφουν τον δείκτη επιστροφής από το stack ή το EBP -> ESP -> EIP.
Μπορεί να χρειαστεί να εκμεταλλευτείτε μια Integer Overflow για να προκαλέσετε την υπερχείλιση.
Ή μέσω Arbitrary Writes + Write What Where to Execution.
Format strings: Εκμεταλλευτείτε το printf
για να γράψετε αυθαίρετο περιεχόμενο σε αυθαίρετες διευθύνσεις.
Array Indexing: Εκμεταλλευτείτε μια κακώς σχεδιασμένη ευρετηρίαση για να μπορέσετε να ελέγξετε ορισμένους πίνακες και να αποκτήσετε μια αυθαίρετη εγγραφή.
Μπορεί να χρειαστεί να εκμεταλλευτείτε μια Integer Overflow για να προκαλέσετε την υπερχείλιση.
bof to WWW via ROP: Εκμεταλλευτείτε μια υπερχείλιση buffer για να κατασκευάσετε ένα ROP και να μπορέσετε να αποκτήσετε ένα WWW.
Μπορείτε να βρείτε τις τεχνικές Write What Where to Execution σε:
Write What Where 2 ExecΚάτι που πρέπει να λάβετε υπόψη είναι ότι συνήθως μόνο μία εκμετάλλευση μιας ευπάθειας μπορεί να μην είναι αρκετή για να εκτελέσετε μια επιτυχημένη εκμετάλλευση, ειδικά κάποιες προστασίες χρειάζονται να παρακαμφθούν. Επομένως, είναι ενδιαφέρον να συζητήσουμε κάποιες επιλογές για να κάνουμε μια μοναδική ευπάθεια εκμεταλλεύσιμη πολλές φορές στην ίδια εκτέλεση του δυαδικού αρχείου:
Γράψτε σε μια ROP αλυσίδα τη διεύθυνση της main
συνάρτησης ή τη διεύθυνση όπου συμβαίνει η ευπάθεια.
Ελέγχοντας μια κατάλληλη αλυσίδα ROP, μπορεί να είστε σε θέση να εκτελέσετε όλες τις ενέργειες σε αυτή την αλυσίδα.
Γράψτε στη διεύθυνση exit
στο GOT (ή σε οποιαδήποτε άλλη συνάρτηση που χρησιμοποιείται από το δυαδικό πριν τελειώσει) τη διεύθυνση για να επιστρέψετε στην ευπάθεια.
Όπως εξηγήθηκε στο .fini_array, αποθηκεύστε 2 συναρτήσεις εδώ, μία για να καλέσετε ξανά την ευπάθεια και άλλη για να καλέσετε**__libc_csu_fini
** που θα καλέσει ξανά τη συνάρτηση από το .fini_array
.
ret2win: Υπάρχει μια συνάρτηση στον κώδικα που πρέπει να καλέσετε (ίσως με κάποιες συγκεκριμένες παραμέτρους) προκειμένου να αποκτήσετε τη σημαία.
Σε μια bof με PIE, θα χρειαστεί να την παρακάμψετε.
Σε μια bof με canary, θα χρειαστεί να την παρακάμψετε.
Αν χρειαστεί να ορίσετε πολλές παραμέτρους για να καλέσετε σωστά τη συνάρτηση ret2win, μπορείτε να χρησιμοποιήσετε:
Μια ROP αλυσίδα αν υπάρχουν αρκετά gadgets για να προετοιμάσετε όλες τις παραμέτρους.
SROP (σε περίπτωση που μπορείτε να καλέσετε αυτή τη syscall) για να ελέγξετε πολλούς καταχωρητές.
Μέσω ενός Write What Where μπορείτε να εκμεταλλευτείτε άλλες ευπάθειες (όχι bof) για να καλέσετε τη συνάρτηση win
.
Pointers Redirecting: Σε περίπτωση που το stack περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να επαναγράψετε αυτή τη διεύθυνση.
Αρχικοί μεταβλητές: Ποτέ δεν ξέρετε.
(Stack) Shellcode: Αυτό είναι χρήσιμο για να αποθηκεύσετε ένα shellcode στο stack πριν ή μετά την επαναγραφή του δείκτη επιστροφής και στη συνέχεια να κάνετε jump σε αυτό για να το εκτελέσετε:
Σε κάθε περίπτωση, αν υπάρχει ένα canary, σε μια κανονική bof θα χρειαστεί να την παρακάμψετε (leak).
Με ASLR θα χρειαστείτε τεχνικές όπως ret2esp/ret2reg για να κάνετε jump σε αυτό.
Αυτό θα αναμείξει το shellcode με μια αλυσίδα ROP.
Ret2syscall: Χρήσιμο για να καλέσετε execve
για να εκτελέσετε αυθαίρετες εντολές. Πρέπει να μπορείτε να βρείτε τα gadgets για να καλέσετε τη συγκεκριμένη syscall με τις παραμέτρους.
SROP μπορεί να είναι χρήσιμο για να προετοιμάσετε το ret2execve.
Ret2lib: Χρήσιμο για να καλέσετε μια συνάρτηση από μια βιβλιοθήκη (συνήθως από libc
) όπως system
με κάποιες προετοιμασμένες παραμέτρους (π.χ. '/bin/sh'
). Πρέπει το δυαδικό να φορτώσει τη βιβλιοθήκη με τη συνάρτηση που θα θέλατε να καλέσετε (συνήθως libc).
Αν είναι στατικά μεταγλωττισμένο και δεν έχει PIE, η διεύθυνση του system
και του /bin/sh
δεν θα αλλάξει, οπότε είναι δυνατόν να τις χρησιμοποιήσετε στατικά.
Χωρίς ASLR και γνωρίζοντας την έκδοση libc που έχει φορτωθεί, η διεύθυνση του system
και του /bin/sh
δεν θα αλλάξει, οπότε είναι δυνατόν να τις χρησιμοποιήσετε στατικά.
Χρησιμοποιήστε ret2dlresolve
για να επιλύσετε τη διεύθυνση του system
και να την καλέσετε.
Παρακάμψτε ASLR και υπολογίστε τη διεύθυνση του system
και του '/bin/sh'
στη μνήμη.
Παρακάμψετε PIE.
Βρείτε την έκδοση libc
που χρησιμοποιείται (leak μια-δυο διευθύνσεις συναρτήσεων).
Ελέγξτε τα προηγούμενα σενάρια με ASLR για να συνεχίσετε.
Stack Pivoting / EBP2Ret / EBP Chaining: Ελέγξτε το ESP για να ελέγξετε το RET μέσω του αποθηκευμένου EBP στο stack.
Χρήσιμο για off-by-one υπερχείλιση stack.
Χρήσιμο ως εναλλακτικός τρόπος για να ελέγξετε το EIP ενώ εκμεταλλεύεστε το EIP για να κατασκευάσετε το payload στη μνήμη και στη συνέχεια να κάνετε jump σε αυτό μέσω EBP.
Pointers Redirecting: Σε περίπτωση που το stack περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να επαναγράψετε αυτή τη διεύθυνση.
Αρχικοί μεταβλητές: Ποτέ δεν ξέρετε.
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)