Files
l2/nob.sl

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