-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathecho.asm
More file actions
153 lines (126 loc) · 2.38 KB
/
echo.asm
File metadata and controls
153 lines (126 loc) · 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
format ELF64 executable
;; https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
SYS_WRITE = 1
SYS_CLOSE = 3
SYS_SOCKET = 41
SYS_ACCEPT = 43
SYS_SENDTO = 44
SYS_RECVFROM = 45
SYS_BIND = 49
SYS_LISTEN = 50
SYS_SETSOCKOPT = 54
SYS_EXIT = 60
STDIN = 0
STDOUT = 1
STDERR = 2
AF_INET = 2
SOCK_STREAM = 1
segment readable writeable executable
macro exit returncode {
mov rax, SYS_EXIT
mov rdi, returncode
syscall
}
macro empty_buffer [buf] {
mov edi, buffer
mov ecx, 256
xor eax, eax
rep stosb
}
macro str_cmp buf, str {
mov esi, buf
mov edi, str
xor eax, eax
cmps dword [fs:esi],[edi]
setnz al
}
macro close_socket fd {
mov rax, SYS_CLOSE
mov rdi, fd
syscall
}
_start:
mov rax, SYS_SOCKET
mov rdi, AF_INET
mov rsi, SOCK_STREAM
mov rdx, 0
syscall
mov r12, rax ; server fd
mov word [addr.sin_family], AF_INET
mov word [addr.sin_port], 36895 ; htons(8080)36895 ; htons(8080)
mov dword [addr.sin_addr], 0
mov rax, SYS_BIND
mov rdi, r12
mov rsi, addr.sin_family
mov rdx, addr_size
syscall
mov rax, SYS_LISTEN
mov rdi, r12
mov rsi, 8
syscall
.loop:
mov rax, SYS_ACCEPT
mov rdi, r12
mov rsi, 0
mov rdx, 0
syscall
mov r13, rax ; client fd
mov rax, SYS_RECVFROM
mov rdi, r13
mov rsi, buffer
mov rdx, 256
mov r10, 0
mov r8, 0
mov r9, 0
syscall
mov rax, SYS_WRITE
mov rdi, STDOUT
mov rsi, buffer
mov rdx, 256
syscall
mov rax, SYS_SENDTO
mov rdi, r13
mov rsi, buffer
mov rdx, 256
mov r10, 0
mov r8, 0
mov r9, 0
syscall
str_cmp buffer, quit_str
test rax, rax
jz .quit
empty_buffer buffer
close_socket r13
jmp .loop
.quit:
mov rax, SYS_WRITE
mov rdi, STDOUT
mov rsi, goodbye
mov rdx, goodbye_size
syscall
mov rax, SYS_SENDTO
mov rdi, r13
mov rsi, goodbye
mov rdx, goodbye_size
mov r10, 0
mov r8, 0
mov r9, 0
syscall
close_socket r13
close_socket r12
exit 0
ret
segment readable writeable
struc servaddr_in {
.sin_family dw 0
.sin_port dw 0
.sin_addr dd 0
.sin_zero dq 0
}
quit_str db "quit", 10, 0
goodbye db 27, "[36mGoodbye...", 27, "[0m", 10, 0
goodbye_size = $ - goodbye
error_msg db "Error", 10, 0
buffer db 256 dup 0
addr servaddr_in
addr_size = $ - addr