如何在 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
失败的可能性,并妥善处理。
以下代码显示
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
失败的可能性,并妥善处理。