2017-03-09 8 views
-1

私はエラーが出る場所すべてのシステムコールは、sys_recvfrom前に正しい値を返すソケットセグメンテーションフォールトのrecvfromアセンブリ

global _start 

struc sockaddr_in 
    .sin_family resw 1 
    .sin_port resw 1 
    .sin_addr resd 1 
    .sin_zero resb 8 
endstruc 

struc img 
    .source_ip resb 4 
    .int_ip resb 4 
    .group_ip resb 4 
endstruc 

section .bss 

    listen_socket: resq 1 
    buffer: resb 2048 

section .data 

pop_sa istruc sockaddr_in 
     at sockaddr_in.sin_family, dw 2   ; AF_INET 
     at sockaddr_in.sin_port, dw 0x4b9c  ; port 40011 
     at sockaddr_in.sin_addr, dd 0xb46c0ef    ; INADDR_ANY 
     at sockaddr_in.sin_zero, dd 0, 0 
iend 
sockaddr_in_len  equ $ - pop_sa 

pop_mc istruc img ; 
    at img.source_ip, dd 0xb46c0ef ; 
    at img.int_ip,  dd 0    ; INADDR_ANY 
    at img.group_ip, dd 0x5a81320a ; 
iend 
img_len equ $ - pop_mc 
from_ip: dw 0  
from_ip_len: db 16 

section .text 

_start: 

    mov rdi, 2  ;AF_INET 
    mov rsi, 2  ;SOCK_DGRAM 
    mov rdx, 0  ;IPPROTO_UDP 
    mov rax, 41 
    syscall   ;sys_create_udp_socket 
    mov[listen_socket], rax 

    mov r8, 4   
    mov r10, 1 
    mov rdx, 2 ;SO_REUSEADDR 
    mov rsi, 1 ;SOL_SOCKET 
    mov rdi,[listen_socket] 
    mov rax, 54 
    syscall   ;sys_setsockopt 

    mov rdx, sockaddr_in_len 
    mov rsi, pop_sa 
    mov rdi,[listen_socket] 
    mov rax, 49 
    syscall   ;sys_bind 

    mov r8, img_len 
    mov r10, pop_mc 
    mov rdx, 39  ;IP_ADD_SOURCE_MEMBERSHIP 
    mov rsi, 0 ;IPPROTO_UDP 
    mov rdi,[listen_socket] 
    mov rax, 54 
    syscall   ;sys_setsockopt 

    mov r9, [from_ip_len] ; 
    mov r8, [from_ip] 
    mov r10, 0 
    mov rdx, 2047 
    mov rsi, buffer 
    mov rdi,[listen_socket] 
    mov rax, 45 
    syscall   ;sys_recvfrom 

    mov rdi, 0 
    mov rax, 60 
    syscall   ;sys_exit 

にメッセージを取得するには、次のアセンブリコードのためのセグメンテーションフォールトを取得しています - sys_recvfrom機能にEFAULTを、どのような間違いました? 64ビットアセンブリ。

答えて

0

r8とr9(sockaddrとsocklen)はポインタ型であると予想されます。値をdw変数のアドレスからレジスタに移動すると、r8にleaを使用するのですか?そしてその後も、あなたが言うことを、2バイトの変数へのポインタを渡すと、16バイトの大(socklen)

私のアセンブラで、特に私のUNIX関連のアセンブラは錆びですが、私の推測は次のようになり

  1. dwは16バイトだが16ビットだと思う。私はRAXレジスタ長に取得するあなたがその場合のmov REG、代わりにリーのREGを使用してアドレスの[変数]、[変数]
+0

おかげでマルコ・ファン・デ・Voort – compressor

+0

とR8、R9に値をロード

  • メッセージはOKですが、バッファにはデータがありません。 – compressor

  • 関連する問題