程序集执行失败 -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() 传递了错误的指针。

  1. 您应该将其缩小到一个最小的例子。参见 MCVE
  2. 如果您希望其他人提供帮助,您应该评论您的代码。
  3. 你应该学会使用调试器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