程序将可执行文件写入磁盘上的第二段,对其进行解密(进入/ tmp / decbd),并执行(按照计划) 文件decbd出现在磁盘上,可以通过shell执行,最后一个execve调用返回eax = -14,并且在程序结束后,执行流入数据并获得段错误。 http://pastebin.com/KywXTB0X
在使用hexdump和dd进行编译之后的第二段我手动放置了通过openssl加密的echo二进制文件,当我在最后一个int 0x80命令之前停止执行时,我已经能够在decbd中运行我的“echo”,使用另一个终奌站。
答案 0 :(得分:1)
man execve
在" ERRORS"关于返回码-14(-EFAULT
)的部分:
EFAULT filename points outside your accessible address space.
你传递了一个指向execve()
的错误指针。
答案 1 :(得分:1)
对于第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