【发布时间】:2013-05-14 00:21:07
【问题描述】:
通过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 本身,例如在这种情况下为“/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,地址值是根据我的想法,但它不会运行。
【问题讨论】:
-
注意:这些汇编代码强烈依赖机器,不能保证在每台随机机器上执行。
-
@M.M 但原始代码工作得很好。我已经在同一台机器上测试了它们。
标签: c++ assembly nasm shellcode execve