Skip to content

Instantly share code, notes, and snippets.

@1995eaton
Created July 12, 2015 18:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 1995eaton/b4e0b7a9d001b78a3345 to your computer and use it in GitHub Desktop.
Save 1995eaton/b4e0b7a9d001b78a3345 to your computer and use it in GitHub Desktop.
Linux socket messaging test in assembly
# 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