Created
July 12, 2015 18:12
-
-
Save 1995eaton/b4e0b7a9d001b78a3345 to your computer and use it in GitHub Desktop.
Linux socket messaging test in assembly
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# compile with gcc -noprefix | |
# example usage: | |
# echo Hello server\! | netcat -c 127.0.0.1 8005 | |
.intel_syntax noprefix | |
.set sys_socket, 41 | |
.set sys_setsockopt, 54 | |
.set sys_bind, 49 | |
.set sys_listen, 50 | |
.set sys_accept, 43 | |
.set sys_sendto, 44 | |
.set sys_recvfrom, 45 | |
.set sys_write, 1 | |
.set sys_exit, 60 | |
.set AF_INET, 2 | |
.set SOCK_STREAM, 1 | |
.set SOL_SOCKET, 1 | |
.set SO_REUSEADDR, 2 | |
.set MSG_WAITALL, 256 | |
.section .rodata | |
optval: .int 1 | |
.data | |
sockaddr: | |
.short 2 # sa_family => AF_INET | |
# sa_data => char[14] | |
.byte 8005 >> 8, 8005 & 0xff # port 8005 (short in network byte order) | |
.byte 127,0,0,1 # ip addr | |
.space 8, 0 | |
socklen: .quad $-sockaddr | |
peeraddr: .space 16, 0 | |
peerlen: .quad $-peeraddr | |
sendbuf: .asciz "Hello!\n" | |
sendbuflen: .quad $-sendbuf | |
recvbuf: .space 1024, 0 | |
recvbuflen: .quad $-recvbuf | |
.text | |
.globl recv_loop | |
recv_loop: | |
push rbp | |
mov rbp, rsp | |
sub rsp, 16 | |
mov [rbp-8], rdi | |
L0: | |
mov BYTE PTR [recvbuf], 0 | |
mov rax, sys_recvfrom | |
mov rdi, [rbp-8] | |
lea rsi, [recvbuf] | |
mov rdx, [recvbuflen] | |
mov r10, MSG_WAITALL | |
mov r8, 0 | |
mov r9, 0 | |
syscall | |
mov [rbp-16], rax | |
cmp rax, 0 | |
je END | |
mov rdx, [rbp-16] | |
mov rax, sys_write | |
mov rdi, 1 | |
lea rsi, [recvbuf] | |
syscall | |
mov rax, [rbp-16] | |
cmp rax, [recvbuflen] | |
je L0 | |
END: | |
mov rsp, rbp | |
pop rbp | |
ret | |
.globl _start | |
_start: | |
push rbp | |
mov rbp, rsp | |
sub rsp, 32 | |
mov rax, sys_socket | |
mov rdi, AF_INET | |
mov rsi, SOCK_STREAM | |
mov rdx, 0 # protocol | |
syscall | |
mov [rbp-8], rax # host fd | |
mov rax, sys_setsockopt | |
mov rdi, [rbp-8] | |
mov rsi, SOL_SOCKET | |
mov rdx, SO_REUSEADDR | |
lea r10, [optval] | |
mov r8, 4 | |
syscall | |
mov rax, sys_bind | |
mov rdi, [rbp-8] | |
lea rsi, [sockaddr] | |
mov rdx, [socklen] | |
syscall | |
mov rax, sys_listen | |
mov rdi, [rbp-8] | |
mov rsi, 10 # backlog | |
syscall | |
mov rax, sys_accept | |
mov rdi, [rbp-8] | |
lea rsi, [peeraddr] | |
lea rdx, [peerlen] | |
syscall | |
mov [rbp-16], rax # peer fd | |
mov rax, sys_sendto | |
mov rdi, [rbp-16] | |
lea rsi, [sendbuf] | |
mov rdx, [sendbuflen] | |
mov r10, 0 | |
mov r8, 0 | |
mov r9, 0 | |
syscall | |
mov rdi, [rbp-16] | |
call recv_loop | |
mov rax, 3 | |
mov rdi, [rbp-16] | |
syscall | |
mov rax, 3 | |
mov rdi, [rbp-8] | |
syscall | |
mov rsp, rbp | |
pop rbp | |
mov rax, sys_exit | |
mov rdi, 0 | |
syscall |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment