Ponowne pisanie małego kodu powłoki execve

Iść przezhttp://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html

Zrozumiałem program nasm, który wywołujeexecve i próbował go ponownie napisać.

Niektóre podstawowe informacje:

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

Więc,eax = 11 (numer wywołania funkcji dlaexecve),ebx powinien wskazaćchar* filename, ecx powinien wskazaćargv[] (który będzie taki sam jakebx ponieważ pierwszym argumentem jest*filename sam np. „/ bin / sh” w tym przypadku) iedx wskażeenvp[] (null w tym przypadku).

Oryginalny kod 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

Stos jest następujący:

Teraz próbowałem to zoptymalizować, zmniejszając kilka instrukcji. Zgadzam się, że dopókimov ebx, esp kod pozostanie taki sam. Jednak od tego czasuecx będzie musiał wskazaćebx, Mogę ponownie napisać kod w następujący sposób:

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

Dostaję jednak błąd segmentacji, gdy uruchamiam ponownie przepisany kod.

Mój stos wygląda następująco:

Jakieś pomysły, dlaczego przepisany kod nie działa? Uruchomiłem także gdb, a wartości adresu są zgodne z moim myśleniem, ale po prostu nie działają.

questionAnswers(1)

yourAnswerToTheQuestion