2026-01-11 19:26:39 +01:00
|
|
|
import stdlib/stdlib.sl
|
|
|
|
|
import stdlib/linux.sl
|
|
|
|
|
import stdlib/mem.sl
|
2026-01-09 15:45:36 +01:00
|
|
|
|
2026-01-11 19:26:39 +01:00
|
|
|
# sh ( cmd_addr cmd_len -- exit_code | neg_errno )
|
|
|
|
|
word sh
|
|
|
|
|
swap
|
|
|
|
|
>r # save cmd_addr
|
|
|
|
|
>r # save cmd_len
|
2026-01-09 15:45:36 +01:00
|
|
|
|
2026-01-11 19:26:39 +01:00
|
|
|
r@ 1 +
|
|
|
|
|
dup >r # stash len+1 for munmap
|
|
|
|
|
alloc
|
|
|
|
|
dup 0 < if
|
|
|
|
|
rdrop
|
|
|
|
|
rdrop
|
|
|
|
|
rdrop
|
|
|
|
|
else
|
|
|
|
|
dup >r # remember buffer pointer
|
|
|
|
|
drop
|
2026-01-09 15:45:36 +01:00
|
|
|
|
2026-01-11 19:26:39 +01:00
|
|
|
3 rpick # src addr
|
|
|
|
|
0 rpick # dst addr
|
|
|
|
|
swap
|
|
|
|
|
2 rpick # len
|
|
|
|
|
memcpy
|
2026-01-09 15:45:36 +01:00
|
|
|
|
2026-01-11 19:26:39 +01:00
|
|
|
0 rpick
|
|
|
|
|
2 rpick
|
|
|
|
|
+
|
|
|
|
|
0
|
|
|
|
|
c!
|
2026-01-09 15:45:36 +01:00
|
|
|
|
2026-02-02 15:51:58 +01:00
|
|
|
mem
|
2026-01-11 19:26:39 +01:00
|
|
|
"/bin/sh" drop
|
|
|
|
|
!
|
2026-02-02 15:51:58 +01:00
|
|
|
mem 8 +
|
2026-01-11 19:26:39 +01:00
|
|
|
"-c" drop
|
|
|
|
|
!
|
2026-02-02 15:51:58 +01:00
|
|
|
mem 16 +
|
2026-01-11 19:26:39 +01:00
|
|
|
0 rpick
|
|
|
|
|
!
|
2026-02-02 15:51:58 +01:00
|
|
|
mem 24 +
|
2026-01-11 19:26:39 +01:00
|
|
|
0
|
|
|
|
|
!
|
2026-02-02 15:51:58 +01:00
|
|
|
mem 32 +
|
2026-01-11 19:26:39 +01:00
|
|
|
0
|
|
|
|
|
!
|
2026-01-09 15:45:36 +01:00
|
|
|
|
2026-01-11 19:26:39 +01:00
|
|
|
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
|