2017-06-11 12 views
-1
bits 32 

section .text 

    global _start 

_start: 

    ;socket 
    mov eax, 0x66 
    mov ebx, 0x1 
    push 0x0 
    push 0x1 
    push 0x2 
    mov ecx, esp 
    int 0x80 

    ;bind 
    mov edx, eax 
    xor eax, eax 
    mov eax, 0x66 
    mov ebx, 0x2 
    push word 0x0 
    push word 0x5c11 
    push word 0x2 
    mov ecx, esp 
    push 0x16 
    push ecx 
    push edx 
    int 0x80 

    ;listen 
    push eax 
    mov eax, 0x66 
    mov ebx, 0x4 
    push edx 
    mov ecx, esp 
    int 0x80 

    ;accept 
    push eax 
    push eax 
    push edx 
    mov ecx, esp 
    int 0x80 
$ nasm -f elf32 socket.asm ; ld -m elf_i386 -o socket socket.o 

$ ./socket 

Segmentation fault (core dumped) 

私はUbuntuの16.04デスクトップx86_64版でバイナリをコンパイルしています。セグメンテーションフォールト - 組立

+1

私は考えています:問題がどこにあるかを特定するためにデバッガを使用します。 –

+0

私はGrey氏と一緒にいますが、多くの言語でデバッガを使用して回避できますが、アセンブリは使用できません。 – Chris

+0

デバッガを使用することによって、私はripが存在しないアドレスで上書きされていることに気付きました。だから私は最後に出口を追加しましたが、今はセグメンテーション違反がありません。それが正しいか? – wrynux

答えて

2

最後に終了を追加しましたが、今はセグメント違反エラーが発生しません。

mov eax, 0x1 
mov ebx, 0x0 
int 0x80 
+2

はい、正しいです。自分の問題を解決するための+1。 2つのヒント:(1)Stack Overflowでコードをポストするときは、ブロック全体を選択し、Ctrl + K(またはツールバーの{{}ボタンをクリック)を押してコードとしてフォーマットします。 (2) 'mov reg、0'は' xor reg、reg'としてより一般的かつ効率的に書かれています。この場合、2行目は 'xor ebx、ebx'になります。 –