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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta