【问题标题】:How to properly pass buffer pointers to Linux system calls in x86_64 assembly?如何正确地将缓冲区指针传递给 x86_64 程序集中的 Linux 系统调用?
【发布时间】:2019-11-27 13:43:18
【问题描述】:

您好,我正在尝试学习如何在 Linux 上使用 x86_64 程序集进行系统调用。我遇到了一个问题,我似乎无法弄清楚如何正确传递 getpeername 的参数。

在这个使用 C 的链接中,看起来他们正在使用运算符的地址来传递参数。我不知道如何在汇编中复制它。这是我的缓冲区不使用括号时的 strace。

首先我在 .data 部分中定义了我的缓冲区

ip_buff:  times 14 db 0
.length: equ $-ip_buff

这是一个宏

%define SYS_getpeername 52

r12 存储来自套接字接受调用的返回值

syscall getpeername,r12,ip_buff,15

这里是不使用括号的strace

[pid   749] accept(3, NULL, NULL <unfinished ...>
[pid   761] read(4, "", 1024)           = 0
[pid   761] write(1, "", 0)             = 0
[pid   761] getpeername(4, 0x600733, 0xf) = -1 EFAULT (Bad address)

这是我使用括号时的strace。

[pid   749] accept(3, NULL, NULL <unfinished ...>
[pid   745] read(4, "GET / HTTP/1.1\r\nHost: 127.0.0.1:"..., 1024) = 78
[pid   745] write(1, "GET / HTTP/1.1\r\nHost: 127.0.0.1:"..., 78) = 78
[pid   745] getpeername(4, NULL, 0xf)   = -1 EFAULT (Bad address)

我怎样才能正确地进行这个系统调用?

【问题讨论】:

    标签: linux assembly x86-64 system-calls


    【解决方案1】:

    实际问题不在于缓冲区,而在于其长度。注意在原型中你有socklen_t *addrlen,所以它应该是一个指针。您传递的值 15 不是指针,因此是 -EFAULT

    您应该将.length: equ $-ip_buff 更改为ip_length: dd $-ip_buff,然后使用syscall getpeername,r12,ip_buff,ip_length

    【讨论】:

    • 非常感谢!作品完美欣赏它
    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多