210 lines
2.8 KiB
NASM
210 lines
2.8 KiB
NASM
|
[BITS 64]
|
||
|
%include "definitions.inc"
|
||
|
%define sysread 0
|
||
|
%define syswrite 1
|
||
|
%define sysclose 3
|
||
|
%define sysmmap 9
|
||
|
%define sysmunmap 11
|
||
|
%define sysrtsigaction 13
|
||
|
%define syssocket 41
|
||
|
%define sysaccept 43
|
||
|
%define sysbind 49
|
||
|
%define syslisten 50
|
||
|
%define syssetsockopt 54
|
||
|
%define sysclone 56
|
||
|
%define sysexit 60
|
||
|
|
||
|
%define backlog 100
|
||
|
%define childsize 2048
|
||
|
|
||
|
global _start
|
||
|
section .data
|
||
|
|
||
|
reuse: dd 1
|
||
|
reuselen: equ $ - reuse
|
||
|
|
||
|
sockaddr:
|
||
|
sin_family dw AF_INET
|
||
|
sin_port db 1fh, 40h ; 8000
|
||
|
sin_addr db 0, 0, 0, 0
|
||
|
addrlen equ 16
|
||
|
|
||
|
status: db "HTTP/1.0 200 OK",13,10
|
||
|
db "Content-Type: text/plain",13,10
|
||
|
db 13,10
|
||
|
|
||
|
|
||
|
;; db "GIF89a"
|
||
|
;; dw 8 ; width (LE)
|
||
|
;; dw 8 ; heigh
|
||
|
;; db 10000000b ;
|
||
|
;; db 0 ; bg color
|
||
|
;; db 0 ; pixel aspect
|
||
|
;; ;; global color table
|
||
|
;; db 0,0,0
|
||
|
;; db 0xff, 0xff, 0xff
|
||
|
;; ;; image descriptor
|
||
|
;; db 0x2c ; image separator
|
||
|
;; dw 0 ; image left
|
||
|
;; dw 0 ; image top
|
||
|
;; dw 8 ; width
|
||
|
;; dw 8 ; height
|
||
|
;; db 0 ; packed
|
||
|
;; ;; table
|
||
|
;; db 13
|
||
|
;; db 4
|
||
|
|
||
|
;; db 1
|
||
|
;; db 10110000b
|
||
|
;; db 00101010b
|
||
|
;; db 10000000b
|
||
|
;; db 0
|
||
|
|
||
|
|
||
|
status_len: equ $ - status
|
||
|
|
||
|
pipeign:
|
||
|
handler dd SIG_IGN
|
||
|
mask dd 0
|
||
|
|
||
|
section .bss
|
||
|
clientaddr:
|
||
|
cl_family resw 1
|
||
|
cl_port resw 1
|
||
|
cl_addr resd 1
|
||
|
pad resq 1
|
||
|
cl_addrlen resd 1
|
||
|
|
||
|
section .text
|
||
|
_start:
|
||
|
mov rax, sysrtsigaction
|
||
|
mov rdi, SIGPIPE
|
||
|
mov rsi, pipeign
|
||
|
mov rdx, 0
|
||
|
mov r10, 8
|
||
|
syscall
|
||
|
|
||
|
mov rax, syssocket
|
||
|
mov rdi, AF_INET
|
||
|
mov rsi, SOCK_STREAM
|
||
|
xor rdx, rdx
|
||
|
syscall
|
||
|
test rax, rax
|
||
|
js fail
|
||
|
mov rdi, rax
|
||
|
|
||
|
mov rax, syssetsockopt
|
||
|
mov rsi, SOL_SOCKET
|
||
|
mov rdx, SO_REUSEADDR
|
||
|
mov r10, reuse
|
||
|
mov r8, reuselen
|
||
|
syscall
|
||
|
test rax, rax
|
||
|
jnz fail
|
||
|
|
||
|
mov rax, sysbind
|
||
|
mov rsi, sockaddr
|
||
|
mov rdx, addrlen
|
||
|
syscall
|
||
|
test rax, rax
|
||
|
jnz fail
|
||
|
|
||
|
mov rax, syslisten
|
||
|
mov rsi, 10
|
||
|
syscall
|
||
|
test rax, rax
|
||
|
jnz fail
|
||
|
|
||
|
mov r12, rdi
|
||
|
|
||
|
xor rsp, rsp
|
||
|
accept:
|
||
|
mov rax, sysaccept
|
||
|
mov rsi, clientaddr
|
||
|
mov rdx, cl_addrlen
|
||
|
syscall
|
||
|
test rax, rax
|
||
|
js fail
|
||
|
mov rsi, rax
|
||
|
|
||
|
clone:
|
||
|
mov rax, sysclone
|
||
|
mov rdi, 0x00013fff
|
||
|
xor rdx, rdx
|
||
|
syscall
|
||
|
|
||
|
test rax, rax
|
||
|
js fail
|
||
|
|
||
|
test rsp, rsp
|
||
|
jnz child
|
||
|
|
||
|
mov rdi, r12
|
||
|
|
||
|
jmp accept
|
||
|
fail:
|
||
|
mov rdi, rax
|
||
|
jmp exit
|
||
|
success:
|
||
|
mov rdi, 0
|
||
|
exit:
|
||
|
mov rax, sysexit
|
||
|
syscall
|
||
|
|
||
|
child:
|
||
|
mov r12, rsp
|
||
|
|
||
|
mov rax, sysmmap
|
||
|
mov rdi, 0
|
||
|
mov rsi, childsize
|
||
|
mov rdx, PROT_WRITE
|
||
|
mov r10, MAP_ANONYMOUS
|
||
|
or r10, MAP_PRIVATE
|
||
|
mov r8, 0
|
||
|
mov r9, 0
|
||
|
syscall
|
||
|
|
||
|
test rax, MAP_FAILED
|
||
|
je fail
|
||
|
|
||
|
mov rsp, rax
|
||
|
mov rdi, r12
|
||
|
|
||
|
read2k:
|
||
|
mov rax, sysread
|
||
|
mov rsi, rsp
|
||
|
mov rdx, childsize
|
||
|
syscall
|
||
|
test rax, rax
|
||
|
js close
|
||
|
|
||
|
mov r12, rax
|
||
|
write_head:
|
||
|
mov rax, syswrite
|
||
|
mov rsi, status
|
||
|
mov rdx, status_len
|
||
|
syscall
|
||
|
|
||
|
cmp rax, 0
|
||
|
jl close
|
||
|
|
||
|
write_echo:
|
||
|
mov rax, syswrite
|
||
|
mov rsi, rsp
|
||
|
mov rdx, r12
|
||
|
syscall
|
||
|
|
||
|
jmp close
|
||
|
write:
|
||
|
mov rax, syswrite
|
||
|
|
||
|
close:
|
||
|
mov rax, sysclose
|
||
|
syscall
|
||
|
mov rax, sysmunmap
|
||
|
mov rdi, rsp
|
||
|
mov rsi, childsize
|
||
|
syscall
|
||
|
|
||
|
jmp success
|