装配执行失败-14

时间:2015-05-07 17:06:53

标签: linux assembly nasm elf system-calls

程序将可执行文件写入磁盘上的第二段,对其进行解密(进入/ tmp / decbd),并执行(按照计划) 文件decbd出现在磁盘上,可以通过shell执行,最后一个execve调用返回eax = -14,并且在程序结束后,执行流入数据并获得段错误。 http://pastebin.com/KywXTB0X

在使用hexdump和dd进行编译之后的第二段我手动放置了通过openssl加密的echo二进制文件,当我在最后一个int 0x80命令之前停止执行时,我已经能够在decbd中运行我的“echo”,使用另一个终奌站。

2 个答案:

答案 0 :(得分:1)

man execve在" ERRORS"关于返回码-14(-EFAULT)的部分:

        EFAULT filename points outside your accessible address space.

你传递了一个指向execve()的错误指针。

答案 1 :(得分:1)

  1. 你应该把它缩小到最小的例子。见MCVE
  2. 如果您希望其他人提供帮助,您应该对您的代码进行评论。
  3. 您应该学会使用调试器和/或其他工具。
  4. 对于第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