通过http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html
execve
我理解调用并试图重写它的 nasm 程序。
一些背景资料:
int execve(const char *filename, char *const argv[], char *const envp[]);
因此,(函数调用eax = 11
号execve
)应该ebx
指向_ _ _ )。char* filename
ecx
argv[]
ebx
*filename
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 并且地址值是根据我的想法,但它不会运行。