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ą.