Skip to content

Instantly share code, notes, and snippets.

@ncfavier
Last active June 4, 2019 20:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ncfavier/888337c8e2dc220c81fda7c1d37fa06a to your computer and use it in GitHub Desktop.
Save ncfavier/888337c8e2dc220c81fda7c1d37fa06a to your computer and use it in GitHub Desktop.
GASton serves index.html on port 8080.
# to compile:
# gcc gaston.S -nostdlib -no-pie
#define SYS_WRITE 1
#define SYS_OPEN 2
#define SYS_CLOSE 3
#define SYS_LSEEK 8
#define SYS_SENDFILE 40
#define SYS_SOCKET 41
#define SYS_ACCEPT 43
#define SYS_SENDTO 44
#define SYS_RECVFROM 45
#define SYS_BIND 49
#define SYS_LISTEN 50
#define SYS_SETSOCKOPT 54
#define SYS_EXIT 60
#define AF_INET 2
#define SOCK_STREAM 1
#define PROTO_TCP 6
#define SOL_SOCKET 1
#define SOL_TCP 6
#define SO_REUSEADDR 2
#define TCP_CORK 3
#define O_RDONLY 0
#define SEEK_SET 0
#define SEEK_END 2
#define MAX_QUEUE 10
.global _start
_start:
mov $SYS_SOCKET, %rax
mov $AF_INET, %rdi
mov $SOCK_STREAM, %rsi
mov $0, %rdx
syscall
mov %rax, serverSocket
mov $SYS_SETSOCKOPT, %rax
mov serverSocket, %rdi
mov $SOL_SOCKET, %rsi
mov $SO_REUSEADDR, %rdx
mov $one, %r10
mov $one_len, %r8
syscall
mov $SYS_SETSOCKOPT, %rax
mov serverSocket, %rdi
mov $SOL_TCP, %rsi
mov $TCP_CORK, %rdx
mov $one, %r10
mov $one_len, %r8
syscall
mov $SYS_BIND, %rax
mov serverSocket, %rdi
mov $serverAddress, %rsi
mov $serverAddress_len, %rdx
syscall
mov $SYS_LISTEN, %rax
mov serverSocket, %rdi
mov $MAX_QUEUE, %rsi
syscall
loop:
mov $SYS_ACCEPT, %rax
mov serverSocket, %rdi
mov $0, %rsi
mov $0, %rdx
syscall
mov %rax, clientSocket
mov $SYS_RECVFROM, %rax
mov clientSocket, %rdi
mov $requestBuffer, %rsi
mov $requestBuffer_len, %rdx
mov $0, %r10
mov $0, %r8
mov $0, %r9
syscall
mov $SYS_SENDTO, %rax
mov clientSocket, %rdi
mov $headers, %rsi
mov $headers_len, %rdx
mov $0, %r10
mov $0, %r8
mov $0, %r9
syscall
mov $SYS_OPEN, %rax
mov $filename, %rdi
mov $O_RDONLY, %rsi
mov $0, %rdx
syscall
mov %rax, fileDescriptor
mov $SYS_LSEEK, %rax
mov fileDescriptor, %rdi
mov $0, %rsi
mov $SEEK_END, %rdx
syscall
mov %rax, fileSize
mov $SYS_LSEEK, %rax
mov fileDescriptor, %rdi
mov $0, %rsi
mov $SEEK_SET, %rdx
syscall
mov $SYS_SENDFILE, %rax
mov clientSocket, %rdi
mov fileDescriptor, %rsi
mov $0, %rdx
mov fileSize, %r10
syscall
mov $SYS_CLOSE, %rax
mov fileDescriptor, %rdi
syscall
mov $SYS_CLOSE, %rax
mov clientSocket, %rdi
syscall
jmp loop
mov $SYS_CLOSE, %rax
mov serverSocket, %rdi
syscall
mov $SYS_EXIT, %rax
mov $0, %rdi
syscall
.data
serverAddress:
.word AF_INET
.word 0x901f
.int 0
.zero 8
serverAddress_len = . - serverAddress
headers:
.ascii "HTTP/1.1 200 OK\nServer: gaston\nContent-Type: text/html\n\n"
headers_len = . - headers
filename:
.asciz "index.html"
one:
.int 1
one_len = . - one
.bss
serverSocket:
.quad 0
clientSocket:
.quad 0
fileDescriptor:
.quad 0
fileSize:
.quad 0
requestBuffer:
.zero 8192
requestBuffer_len = . - requestBuffer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment