127 lines
2.5 KiB
Plaintext
127 lines
2.5 KiB
Plaintext
import stdlib/stdlib.sl
|
|
import stdlib/linux.sl
|
|
import stdlib/mem.sl
|
|
|
|
# sh ( cmd_addr cmd_len -- exit_code | neg_errno )
|
|
word sh
|
|
swap
|
|
>r # save cmd_addr
|
|
>r # save cmd_len
|
|
|
|
r@ 1 +
|
|
dup >r # stash len+1 for munmap
|
|
alloc
|
|
dup 0 < if
|
|
rdrop
|
|
rdrop
|
|
rdrop
|
|
else
|
|
dup >r # remember buffer pointer
|
|
drop
|
|
|
|
3 rpick # src addr
|
|
0 rpick # dst addr
|
|
swap
|
|
2 rpick # len
|
|
memcpy
|
|
|
|
0 rpick
|
|
2 rpick
|
|
+
|
|
0
|
|
c!
|
|
|
|
"/bin/sh" drop
|
|
0
|
|
mem +
|
|
!
|
|
"-c" drop
|
|
8
|
|
mem +
|
|
!
|
|
0 rpick
|
|
16
|
|
mem +
|
|
!
|
|
0
|
|
24
|
|
mem +
|
|
!
|
|
0
|
|
32
|
|
mem +
|
|
!
|
|
|
|
syscall.fork
|
|
syscall
|
|
dup 0 < if
|
|
>r
|
|
1 rpick
|
|
2 rpick
|
|
free
|
|
r>
|
|
rdrop
|
|
rdrop
|
|
rdrop
|
|
rdrop
|
|
else
|
|
dup 0 == if
|
|
drop
|
|
"/bin/sh" drop
|
|
mem
|
|
dup
|
|
32 +
|
|
syscall.execve
|
|
syscall
|
|
drop
|
|
127
|
|
syscall.exit
|
|
syscall
|
|
else
|
|
mem
|
|
40 +
|
|
dup >r
|
|
0
|
|
0
|
|
syscall.wait4
|
|
syscall
|
|
dup 0 < if
|
|
>r
|
|
rdrop
|
|
1 rpick
|
|
2 rpick
|
|
free
|
|
r>
|
|
rdrop
|
|
rdrop
|
|
rdrop
|
|
rdrop
|
|
else
|
|
drop
|
|
0 rpick
|
|
@
|
|
rdrop
|
|
dup
|
|
128 %
|
|
dup 0 != if
|
|
swap drop
|
|
128 +
|
|
else
|
|
drop
|
|
256 /
|
|
end
|
|
>r
|
|
1 rpick
|
|
2 rpick
|
|
free
|
|
r>
|
|
rdrop
|
|
rdrop
|
|
rdrop
|
|
rdrop
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|