Reescribiendo un pequeño shellcode execve.
Ir a travéshttp://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html
Entendí el programa nasm que invoca.execve
Y estaba intentando reescribirlo.
Alguna información de fondo:
int execve(const char *filename, char *const argv[], char *const envp[]);
Asi que,eax = 11
(número de llamada de función paraexecve
)ebx
debería apuntar achar* filename
, ecx
debería apuntar aargv[]
(que será lo mismo queebx
ya que el primer argumento es el*filename
en sí, por ejemplo "/ bin / sh" en este caso), yedx
apuntará aenvp[]
(null
en este caso).
Código nasm original:
global _start
section .text
_start:
xor eax, eax
push eax
; PUSH //bin/sh in reverse i.e. hs/nib//
push 0x68732f6e
push 0x69622f2f
mov ebx, esp
push eax
mov edx, esp
push ebx
mov ecx, esp
mov al, 11
int 0x80
La pila es la siguiente:
Ahora traté de optimizar esto reduciendo algunas instrucciones. Estoy de acuerdo en que hastamov ebx, esp
El código seguirá siendo el mismo. Sin embargo, desdeecx
tendrá que señalarebx
, Puedo reescribir el código de la siguiente manera:
global _start
section .text
_start:
xor eax, eax
push eax
; PUSH //bin/sh in reverse i.e. hs/nib//
push 0x68732f6e
push 0x69622f2f
mov ebx, esp
mov ecx,ebx
push eax
mov edx, esp
mov al, 11
int 0x80
Sin embargo, me sale un error de segmentación cuando ejecuto mi código reescrito.
Mi pila es la siguiente:
¿Alguna idea de por qué el código reescrito no funciona? También he ejecutado gdb y los valores de dirección están de acuerdo con mi forma de pensar, pero simplemente no se ejecutan.