-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsushi.asm
More file actions
312 lines (288 loc) · 5.41 KB
/
Copy pathsushi.asm
File metadata and controls
312 lines (288 loc) · 5.41 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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
FORMAT elf64 EXECUTABLE 3
SEGMENT READABLE EXECUTABLE WRITABLE
deb_mess db "FAIL",10
command_buffer rb 256
full_path_buf rb 512
buffer rb 200
pipefd rb 8
envp_ptr dq 0
MAX_ARGS=1000*8
BUFFER_SIZE=200
entry main
main:
mov rax, [rsp]
lea rsi, [rsp + 16 + rax*8]
mov [envp_ptr], rsi
main_loop:
call clean_buffer
mov rax, 0
mov rdi, 0
mov rsi, buffer
mov rdx, BUFFER_SIZE
syscall
cmp rax, 0
jle exit_proc
call handle_cd
mov rax, 57
syscall
cmp rax, 0
jne wait_parent
jmp execute_chain
wait_parent:
mov rax, 61
mov rdi, -1
xor rsi, rsi
xor rdx, rdx
xor r10, r10
syscall
jmp main_loop
exit_proc:
mov rax, 60
xor rdi, rdi
syscall
fail:
mov rax, 1
mov rdi, 2
mov rsi, deb_mess
mov rdx, 5
syscall
mov rax, 60
mov rdi, 1
syscall
handle_cd:
mov rsi, buffer
cmp byte [rsi], 'c'
jne .out
cmp byte [rsi+1], 'd'
jne .out
add rsi, 3
mov rdi, rsi
.fnl:
cmp byte [rdi], 10
je .t
cmp byte [rdi], 0
je .t
inc rdi
jmp .fnl
.t:
mov byte [rdi], 0
mov rax, 80
mov rdi, rsi
syscall
pop rax
jmp main_loop
.out:
ret
clean_buffer:
mov rcx, BUFFER_SIZE
mov rdi, buffer
xor al, al
rep stosb
ret
execute_chain:
mov r12, buffer
.chain_loop:
mov rsi, r12
.find_pipe:
mov al, [rsi]
cmp al, 10
je .last_cmd
cmp al, 0
je .last_cmd
cmp al, '|'
je .found_pipe
inc rsi
jmp .find_pipe
.found_pipe:
mov byte [rsi], 0
lea r13, [rsi + 1]
.skip_s:
cmp byte [r13], 32
jne .p_go
inc r13
jmp .skip_s
.p_go:
mov rax, 22
mov rdi, pipefd
syscall
mov rax, 57
syscall
cmp rax, 0
jne .p_parent
mov rax, 33
mov edi, dword [pipefd+4]
mov rsi, 1
syscall
mov rax, 3
mov edi, dword [pipefd]
syscall
mov rax, 3
mov edi, dword [pipefd+4]
syscall
mov rsi, r12
jmp do_exec
.p_parent:
mov rax, 33
mov edi, dword [pipefd]
mov rsi, 0
syscall
mov rax, 3
mov edi, dword [pipefd]
syscall
mov rax, 3
mov edi, dword [pipefd+4]
syscall
mov r12, r13
jmp .chain_loop
.last_cmd:
mov byte [rsi], 0
mov rsi, r12
jmp do_exec
do_exec:
mov r14, rsi
mov rax, 9
xor rdi, rdi
mov rsi, MAX_ARGS
mov rdx, 3
mov r10, 34
xor r8, r8
xor r9, r9
syscall
mov rbx, rax
mov rdx, rbx
mov rsi, r14
.skip_initial_spaces:
cmp byte [rsi], 32
jne .start_parse
inc rsi
jmp .skip_initial_spaces
.start_parse:
mov rdi, command_buffer
mov [rdx], rdi
add rdx, 8
.parse:
mov al, [rsi]
cmp al, 0
je .done
cmp al, 32
je .s
cmp al, 10
je .done
cmp al, '>'
je .redir
mov [rdi], al
inc rdi
inc rsi
jmp .parse
.s:
mov byte [rdi], 0
inc rdi
inc rsi
.ss:
cmp byte [rsi], 32
jne .sn
inc rsi
jmp .ss
.sn:
cmp byte [rsi], 10
je .done
cmp byte [rsi], 0
je .done
mov [rdx], rdi
add rdx, 8
jmp .parse
.redir:
mov byte [rdi], 0
inc rsi
.rs:
cmp byte [rsi], 32
jne .rf
inc rsi
jmp .rs
.rf:
mov rdi, rsi
.rl:
cmp byte [rsi], 32
je .re
cmp byte [rsi], 10
je .re
cmp byte [rsi], 0
je .re
inc rsi
jmp .rl
.re:
mov byte [rsi], 0
mov rax, 2
mov rsi, 578
mov rdx, 448
syscall
mov rdi, rax
mov rax, 33
mov rsi, 1
syscall
jmp .done
.done:
mov byte [rdi], 0
mov qword [rdx], 0
mov rsi, command_buffer
cmp byte [rsi], '/'
je .direct
cmp byte [rsi], '.'
je .direct
mov r8, [envp_ptr]
.f_path:
mov rsi, [r8]
test rsi, rsi
jz .direct
cmp dword [rsi], "PATH"
jne .n_env
cmp byte [rsi+4], "="
je .p_found
.n_env:
add r8, 8
jmp .f_path
.p_found:
add rsi, 5
mov r9, rsi
.p_l:
mov rdi, full_path_buf
.c_d:
mov al, [r9]
cmp al, ':'
je .d_d
cmp al, 0
je .d_d
mov [rdi], al
inc rdi
inc r9
jmp .c_d
.d_d:
mov byte [rdi], '/'
inc rdi
mov rsi, command_buffer
.c_c:
mov al, [rsi]
test al, al
jz .att
mov [rdi], al
inc rdi
inc rsi
jmp .c_c
.att:
mov byte [rdi], 0
mov rax, 59
mov rdi, full_path_buf
mov rsi, rbx
xor rdx, rdx
syscall
cmp byte [r9], 0
je fail
inc r9
jmp .p_l
.direct:
mov rax, 59
mov rdi, command_buffer
mov rsi, rbx
xor rdx, rdx
syscall
jmp fail