Переход через 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, и значения адреса соответствуют моему мнению, но он просто не будет работать.