Reescrevendo um pequeno código shell execve

Passando porhttp://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html

Eu entendi o programa nasm que invocaexecve e estava tentando reescrevê-lo.

Algumas informações básicas:

int execve(const char *filename, char *const argv[], char *const envp[]);

Assim,eax = 11 (número de chamada de função paraexecve)ebx deve apontar parachar* filename, ecx deve apontar paraargv[] (que será o mesmo queebx desde o primeiro argumento é o*filename se e. "/ bin / sh" neste caso), eedx apontará paraenvp[] (null nesse caso).

Código original nasm:

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

A pilha é a seguinte:

Agora eu tentei otimizar isso reduzindo algumas instruções. Eu concordo que atémov ebx, esp o código permanecerá o mesmo. No entanto, desdeecx precisará apontar paraebx, Eu posso reescrever o código da seguinte maneira:

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

No entanto, recebo uma falha de segmentação quando executo meu código reescrito.

Minha pilha é a seguinte:

Alguma idéia de por que o código reescrito não funciona? Eu executei o gdb também e os valores de endereço estão de acordo com o meu pensamento, mas ele simplesmente não será executado.

questionAnswers(1)

yourAnswerToTheQuestion