Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在64位(linux)asm中将argv参数传递给execv_Assembly_X86 64 - Fatal编程技术网

Assembly 如何在64位(linux)asm中将argv参数传递给execv

Assembly 如何在64位(linux)asm中将argv参数传递给execv,assembly,x86-64,Assembly,X86 64,我试图在对一位64位代码调用/bin/bash时传递参数。我不能使用.data部分,这对我来说有点棘手。我看过各种代码示例,但没有一个非常清楚(这里是初学者)。我想调用的是/bin/bash-c id 当我尝试将第二个参数保留为null时,我的代码可以工作,但当我添加它时,会出现以下错误: execve("/bin/bash", [0x7361622f6e69622f, 0x646920632d2068, 0x7361622f6e69622f, 0x68], NULL) = -1 EFAULT

我试图在对一位64位代码调用
/bin/bash
时传递参数。我不能使用
.data
部分,这对我来说有点棘手。我看过各种代码示例,但没有一个非常清楚(这里是初学者)。我想调用的是
/bin/bash-c id

当我尝试将第二个参数保留为null时,我的代码可以工作,但当我添加它时,会出现以下错误:

execve("/bin/bash", [0x7361622f6e69622f, 0x646920632d2068, 0x7361622f6e69622f, 0x68], NULL) = -1 EFAULT (Bad address)
编译时使用:
nasm-f elf64-o test.o test.asm;ld-o测试test.o

section .text 
  global _start

_start:
  mov rax,59                     
  lea rdi,[rel bin]             
  lea rsi,[rel msg]
  syscall                       

align 8
  msg db '/bin/bash -c /bin/id',0
  bin db '/bin/bash',0

execve的第二个参数是字符串指针数组的地址(
char**
char*argv[]
)。您已经给了它一个字符串的地址(
char*

还接受第三个参数,即环境列表。正如手册页所描述的,argv和/或envp可以为NULL,Linux将其视为等同于空列表(内存中指向NULL的有效指针)

以下是它应该是什么:

      mov rax, 59
      lea rdi, [rel bin]
      lea rsi, [rel args]
      xor edx, edx             ; Linux accepts NULL instead of a pointer to NULL
      syscall


; section   .rodata
      align 8
args  dq bin, arg1, arg2, 0

arg1  db '-c',0
arg2  db '/bin/id',0
bin   db '/bin/bash',0
如果您正在编写外壳代码,请注意,这在指令(非负
rel32
寻址模式和32位立即数)和数据中都包含多个
0
字节


如果您没有编写外壳代码(将代码和数据一起提取到一个平面二进制文件),请将数据放在单独的部分中,对于只读数据最好是
.rodata

第一个问题做得很好:您包括了您要做的事情、预期行为、实际行为和完整代码。惊喜。