我应该使用push还是在syscall connect的寄存器中将sockaddr存储在堆栈中?

时间:2014-12-04 20:36:36

标签: assembly

我今天开始学习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, 

此时我不确定我应该做什么。我只是将值推到堆栈上吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

一种选择是将sockaddr_in结构推送到堆栈,然后将rsi设置为结构开头的地址。

我不确定,但我认为您需要反向推动sockaddr_in:堆栈增长但connect期望结构从低地址开始并以高地址结束

如果是这样的话,那就是:

  1. 推长(32位)0,两次(sin_zero [8])
  2. 推送长(32位)互联网地址(例如,32位十进制形式的3232235777,相当于点四合一中的192.168.1.1)。
  3. 推短(16位)端口(例如80)
  4. 推短20(AF_INET)
  5. 将esp的值放在rsi中(将指向short 20,这是struct的开头)
  6. 致电连接
  7. 但我在之前的评论中说:你可以使用connect()来查看gcc为一个小例子创建的程序集。