Linux 它不是打开外壳,而是结束
我试图编写一个汇编程序(64位Ubuntu20.04机器上的NASM)来执行sh命令的syscall execve 它不是打开外壳,而是结束。 我真的非常感谢任何帮助解决这个问题 代码如下: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
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
值的负数。