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.