Perl erlaubt dies mit seinem syscall
Funktion:
$ perldoc -f syscall
syscall NUMBER, LIST
Calls the system call specified as the first element of the list,
passing the remaining elements as arguments to the system call. If
⋮
Die Dokumentation gibt auch ein Beispiel für den Aufruf von write(2):
require 'syscall.ph'; # may need to run h2ph
my $s = "hi there\n";
syscall(SYS_write(), fileno(STDOUT), $s, length $s);
Ich kann nicht sagen, dass ich das jemals getan habe habe diese Funktion aber genutzt. Nun, bevor Sie jetzt bestätigen, dass das Beispiel tatsächlich funktioniert.
Dies scheint mit getrandom
zu funktionieren :
$ perl -E 'require "syscall.ph"; $v = " "x8; syscall(SYS_getrandom(), $v, length $v, 0); print $v' | xxd
00000000: 5790 8a6d 714f 8dbe W..mqO..
Und wenn Sie getrandom nicht in Ihrer syscall.ph haben, können Sie stattdessen die Nummer verwenden. Es ist 318 auf meiner Debian-Testbox (amd64). Beachten Sie, dass Linux-Systemaufrufnummern architekturspezifisch sind.
In Python können Sie den ctypes
verwenden Modul für den Zugriff auf beliebige Funktionen in dynamischen Bibliotheken, einschließlich syscall()
aus libc:
import ctypes
SYS_getrandom = 318 # You need to check the syscall number for your target architecture
libc = ctypes.CDLL(None)
_getrandom_syscall = libc.syscall
_getrandom_syscall.restypes = ctypes.c_int
_getrandom_syscall.argtypes = ctypes.c_int, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t, ctypes.c_uint
def getrandom(size, flags=0):
buf = (ctypes.c_char * size)()
result = _getrandom_syscall(SYS_getrandom, buf, size, flags)
if result < 0:
raise OSError(ctypes.get_errno(), 'getrandom() failed')
return bytes(buf)
Wenn Ihre libc den getrandom()
enthält Wrapper-Funktion, Sie können sie auch aufrufen:
import ctypes
libc = ctypes.CDLL(None)
_getrandom = libc.getrandom
_getrandom.restypes = ctypes.c_int
_getrandom.argtypes = ctypes.POINTER(ctypes.c_char), ctypes.c_size_t, ctypes.c_uint
def getrandom(size, flags=0):
buf = (ctypes.c_char * size)()
result = _getrandom(buf, size, flags)
if result < 0:
raise OSError(ctypes.get_errno(), 'getrandom() failed')
return bytes(buf)
Ruby hat einen syscall(num [, args...]) → integer
Funktion.
Zum Beispiel:
irb(main):010:0> syscall 1, 1, "hello\n", 6
hello
=> 6
Mit getrandom()
:
irb(main):001:0> a = "aaaaaaaa"
=> "aaaaaaaa"
irb(main):002:0> syscall 318,a,8,0
=> 8
irb(main):003:0> a
=> "\x9Cq\xBE\xD6|\x87\u0016\xC6"
irb(main):004:0>