Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 我应该将sockaddr存储在带有push的堆栈上,还是存储在syscall connect的寄存器中?_Assembly - Fatal编程技术网

Assembly 我应该将sockaddr存储在带有push的堆栈上,还是存储在syscall connect的寄存器中?

Assembly 我应该将sockaddr存储在带有push的堆栈上,还是存储在syscall connect的寄存器中?,assembly,Assembly,我今天开始学习ASM是为了好玩,我想弄明白的一件事是如何在ASM中打开TCP连接 我已经关闭了对socket()的调用,因为没有任何复杂的数据结构,我可以将值存储在注册表中 但是,我不知道如何处理open()系统调用,因为它需要指向sockaddr的指针 ; socket() mov rax, 41 mov rdi, 20 ; AF_INET mov rsi, 1 ; SOCK_STREAM mov rdx

我今天开始学习ASM是为了好玩,我想弄明白的一件事是如何在ASM中打开TCP连接

我已经关闭了对socket()的调用,因为没有任何复杂的数据结构,我可以将值存储在注册表中

但是,我不知道如何处理open()系统调用,因为它需要指向sockaddr的指针

    ; socket()
    mov     rax, 41
    mov     rdi, 20     ; AF_INET
    mov     rsi, 1      ; SOCK_STREAM
    mov     rdx, 0      ; Protocol
    syscall

    ; Valid socket?
    cmp     rax, 0
    jle     error

    ; connect()
    mov     rdi, rax    ; rax stores fd, save into rdi before moving rax to syscall id
    mov     rax, 42
    mov     rsi, 
在这一点上,我不确定我该做什么。我是否只是将值推送到堆栈上


提前感谢

一个选项是将结构中的
sockaddr_推送到堆栈上,然后将
rsi
设置到结构开头的地址

我不确定,但我认为您需要将
sockaddr\u按相反方向推:堆栈向下扩展,但
connect
将期望结构从低地址开始,到高地址结束

如果是这样的话,可以这样说:

  • 长推(32位)0,两次(sin_zero[8])
  • 推送长(32位)互联网地址(例如32位十进制形式的3232235777,相当于虚线四元组中的192.168.1.1)
  • 短按(16位)端口(例如80)
  • 短按20(自动对焦)
  • 将esp的值放入rsi(将指向短20,这是结构的开始)
  • 呼叫连接

  • 但我支持前面的一条评论:您可以使用
    connect()

    查看gcc创建的程序集作为一个小示例。首先,您将值存储在寄存器中,而不是“注册表”。至于如何在程序集中使用套接字,也许会给您一些答案。它是32位而不是64位,但看起来像您正在尝试做的。您可以始终使用“c”编写代码,然后生成asm输出并查看其外观。根据编译器的不同,汇编中有
    struct
    定义。例如
    NASM/YASM
    使用
    struct。。。endstruct
    MASM
    使用
    名称结构。。。名称结束