Assembly 如何在64位(linux)asm中将argv参数传递给execv
我试图在对一位64位代码调用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
/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
。第一个问题做得很好:您包括了您要做的事情、预期行为、实际行为和完整代码。惊喜。