【问题标题】:How to set up execve call on nasm right?如何在 nasm 上设置 execve 调用?
【发布时间】:2015-04-23 16:56:37
【问题描述】:

以下代码显示

重定位被截断以适应:R_386_8 针对 `.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 中声明字符串数组。

【问题讨论】:

  • 指针不是字节。您应该使用argv dd argv0, argv1, 0 使它们具有适当的大小,并且NULL 终止列表。

标签: linux assembly exec nasm system-calls


【解决方案1】:

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

argv dd argv0, argv1, 0

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

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

另外 - 虽然 execve 通常不会返回,但健壮的代码会考虑到 execve 失败的可能性,并妥善处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2012-09-23
    • 2013-02-13
    相关资源
    最近更新 更多