如何在 nasm 上正确设置 execve 调用?

How to set up execve call on nasm right?

以下代码显示

relocation truncated to fit: R_386_8 against `.data'

 child:
    mov eax,11
    mov ebx,echo
    mov ecx,argv
    xor edx,edx
    int 0x80

section .data    
echo db '/bin/echo',0

argv0 db 'echo',0
argv1 db 'child excuted',0
argv db argv0, argv1

我应该如何设置 execve 调用权限? 我想将地址放入堆栈并使用 esp 但我仍然需要知道如何在 nasm.

中声明字符串数组

正如@Jester 所建议的,您需要正确声明 argv

argv dd argv0, argv1, 0

db指的是定义一个8位字节的列表。 dw 会让您定义 16 位短裤。 dd 用于 32 位数字 - 在 32 位 Linux 上,这是正确的指针大小。 (您将在 64 位上使用 dq,因为这是一个 64 位数字,在这种情况下这是正确的指针大小。)

execve 需要一个以 NULL 结尾的指针列表,因此我们对每个指针使用 dd,然后使用 NULL (0) 来终止参数列表。

此外 - 虽然 execve 通常不会 return,但稳健的代码会考虑 execve 失败的可能性,并妥善处理。