程序集执行失败 -14
Assembly execve failure -14
程序将可执行文件写入磁盘的第二段,将其解密(进入 /tmp/decbd),然后执行(按计划执行)
文件 decbd 出现在磁盘上,可以通过 shell 执行,最后一次 execve 调用 return eax=-14,程序结束后,执行流向数据并出现段错误。
http://pastebin.com/KywXTB0X
在使用 hexdump 和 dd 编译后的第二段中,我手动放置了通过 openssl 加密的 echo 二进制文件,当我在最后一个 int 0x80 命令之前停止执行时,我已经能够 运行 我的 "echo" 在 decbd 中,使用另一个终端。
man execve
在关于 return 代码 -14 (-EFAULT
) 的 "ERRORS" 部分中这样说:
EFAULT filename points outside your accessible address space.
您向 execve()
传递了错误的指针。
- 您应该将其缩小到一个最小的例子。参见 MCVE。
- 如果您希望其他人提供帮助,您应该评论您的代码。
- 你应该学会使用调试器and/or其他工具。
对于第 1 点,您可以转到:
section .text
global _start ;must be declared for linker (ld)
_start:
mov eax,11 ; execve syscall
mov ebx,program ; name of program
mov ecx,[esp+4] ; pointer to argument array
mov ebp,[esp] ; number of arguments
lea edx,[esp+4*ebp+2] ; pointer to environ array
int 0x80
section .data
program db '/bin/echo',0
对于第 3 点,使用调试器你可以看到:
ebx
还可以
ebp
还可以
ecx
错了
edx
错了
这很容易解决。 ecx
应该加载地址,而不是值,edx
应该跳过 2 个指针,每个指针有 4 个字节,所以偏移量应该是 8
而不是 2
。固定代码可能如下所示:
section .text
global _start ;must be declared for linker (ld)
_start:
mov eax,11 ; execve syscall
mov ebx,program ; name of program
lea ecx,[esp+4] ; pointer to argument array
mov ebp,[esp] ; number of arguments
lea edx,[esp+4*ebp+8] ; pointer to environ array (skip argc and NULL)
int 0x80
section .data
program db '/bin/echo',0
程序将可执行文件写入磁盘的第二段,将其解密(进入 /tmp/decbd),然后执行(按计划执行) 文件 decbd 出现在磁盘上,可以通过 shell 执行,最后一次 execve 调用 return eax=-14,程序结束后,执行流向数据并出现段错误。 http://pastebin.com/KywXTB0X
在使用 hexdump 和 dd 编译后的第二段中,我手动放置了通过 openssl 加密的 echo 二进制文件,当我在最后一个 int 0x80 命令之前停止执行时,我已经能够 运行 我的 "echo" 在 decbd 中,使用另一个终端。
man execve
在关于 return 代码 -14 (-EFAULT
) 的 "ERRORS" 部分中这样说:
EFAULT filename points outside your accessible address space.
您向 execve()
传递了错误的指针。
- 您应该将其缩小到一个最小的例子。参见 MCVE。
- 如果您希望其他人提供帮助,您应该评论您的代码。
- 你应该学会使用调试器and/or其他工具。
对于第 1 点,您可以转到:
section .text
global _start ;must be declared for linker (ld)
_start:
mov eax,11 ; execve syscall
mov ebx,program ; name of program
mov ecx,[esp+4] ; pointer to argument array
mov ebp,[esp] ; number of arguments
lea edx,[esp+4*ebp+2] ; pointer to environ array
int 0x80
section .data
program db '/bin/echo',0
对于第 3 点,使用调试器你可以看到:
ebx
还可以ebp
还可以ecx
错了edx
错了
这很容易解决。 ecx
应该加载地址,而不是值,edx
应该跳过 2 个指针,每个指针有 4 个字节,所以偏移量应该是 8
而不是 2
。固定代码可能如下所示:
section .text
global _start ;must be declared for linker (ld)
_start:
mov eax,11 ; execve syscall
mov ebx,program ; name of program
lea ecx,[esp+4] ; pointer to argument array
mov ebp,[esp] ; number of arguments
lea edx,[esp+4*ebp+8] ; pointer to environ array (skip argc and NULL)
int 0x80
section .data
program db '/bin/echo',0