Linux 它不是打开外壳,而是结束

Linux 它不是打开外壳,而是结束,linux,assembly,x86-64,nasm,execve,Linux,Assembly,X86 64,Nasm,Execve,我试图编写一个汇编程序(64位Ubuntu20.04机器上的NASM)来执行sh命令的syscall execve 它不是打开外壳,而是结束。 我真的非常感谢任何帮助解决这个问题 代码如下: global _start _start: mov rax,59 xor rdi, rdi mov rdi, str1 xor rsi, rsi mov rsi, str2 mov rdx, 0xa syscall ;execute execve syscall mov rax,60 x

我试图编写一个汇编程序(64位Ubuntu20.04机器上的NASM)来执行sh命令的syscall execve

它不是打开外壳,而是结束。

我真的非常感谢任何帮助解决这个问题

代码如下:

global _start
_start:

mov rax,59

xor rdi, rdi
mov rdi, str1

xor rsi, rsi
mov rsi, str2

mov rdx, 0xa

syscall     ;execute execve syscall

mov rax,60
xor rdi,rdi
syscall     ;execute exit syscall

section .data
str1: db '/bin/sh'  ;string of the first argument of execve 
str2: db '/bin/sh',0xa  ;string array of the secand argument of execve.
            
我编译并执行asm文件,如下所示:

nasm -felf64 execve_sh.nasm -o xxx.o    
ld xxx.o -o zzz         
./zzz
非常感谢
Tali

虽然不是唯一的问题,但字符串需要以nul(0)结尾。我建议使用调试器,尤其是
strace
查看execve系统调用的参数。你可能会发现这些问题
strace./zzz
我试图将0xa添加到str1中,但什么都没有改变。Str2以0xa终止。它们必须以nul(0x0)终止,而不是换行符(0xa)。但也要仔细考虑参数向量的外观。它不是指向字符串的指针,而是指向指针数组的指针。您必须在内存中构造这样一个数组,并用空指针标记其结束。请注意,“Just ends”可能是因为execve系统调用失败,“Just ending”是您的程序在
execve
syscall返回时故意执行的操作(通过调用
\u exit
syscall)。如果通过
execve
系统调用检查
rax
中留下的错误代码,您将获得更多信息;它是
errno
值的负数。虽然不是您唯一的问题,但字符串需要以nul(0)结尾。我建议使用调试器,尤其是
strace
查看execve系统调用的参数。你可能会发现这些问题
strace./zzz
我试图将0xa添加到str1中,但什么都没有改变。Str2以0xa终止。它们必须以nul(0x0)终止,而不是换行符(0xa)。但也要仔细考虑参数向量的外观。它不是指向字符串的指针,而是指向指针数组的指针。您必须在内存中构造这样一个数组,并用空指针标记其结束。请注意,“Just ends”可能是因为execve系统调用失败,“Just ending”是您的程序在
execve
syscall返回时故意执行的操作(通过调用
\u exit
syscall)。如果通过
execve
系统调用检查
rax
中留下的错误代码,您将获得更多信息;它是
errno
值的负数。