Переход через http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html
Я понял программу nasm, которая вызывает execve и пыталась перезаписать ее.
Некоторая справочная информация:
int execve(const char *filename, char *const argv[], char *const envp[]);
Итак, eax = 11 (номер вызова функции для execve), ebx должен указывать на char* filename, ecx должен указывать на argv[] (который будет таким же, как ebx, поскольку первый аргументом является сам *filename, например, "/bin/sh" ), а edx будет указывать на envp[] (null в этом случае).
Оригинальный код 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
Стек выглядит следующим образом:
 
Теперь я попытался оптимизировать это, сократив несколько инструкций. Я согласен, что до mov ebx, esp код останется прежним. Однако, поскольку ecx нужно указать на ebx, я могу переписать код следующим образом:
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
Тем не менее, я получаю ошибку сегментации, когда я запускаю свой переписанный код.
Мой стек выглядит следующим образом: 
Любые идеи, почему переписанный код не работает? Я также запускал gdb, и значения адреса соответствуют моему мнению, но он просто не будет работать.
