直接执行系统调用

直接执行系统调用

假设用户被授权访问某些内容,他如何直接执行系统调用,例如 geteuid() - 从 bash 获取有效的用户 ID(这只是一个示例),我该怎么做?

答案1

通过系统调用的用户空间内核空间通信是根据内存位置和机器寄存器完成的。这远低于 shell 的抽象级别,shell 主要使用文本字符串进行操作。

也就是说,在 bash 中,您可以使用https://github.com/taviso/ctypes.sh用于将文本字符串抽象深入到 C 级粒度的插件:

$ . ctypes.sh
$ dlcall -r long geteuid
long:1001

不过,对于这个特定的操作,简单地使用 bash 的魔术变量会更简单、更惯用、更高效$UID

$ echo "$EUID" #effectively a cached geteuid call
1001

答案2

要获取 uid,请编写自己的 C 程序(或一些 shell 插件,如果您的 shell 接受它们;仅供参考)桀骜可以有插件,称为模块.) 或者更简单地运行编号(1)命令。

对于其他系统调用(列于系统调用(2)),它是相同的:使用一些程序(或一些内置或一些插件)来执行它们。该程序可以直接用汇编程序编码,并使用SYSCALL机器SYSENTER指令来执行系统调用,或者(更常见的是)它将使用您的C标准库并使用执行该系统调用的函数libc。可执行文件不需要从 C 源代码获取(例如,忙碌盒用汇编程序编码,方案骨头编译器不使用任何 libc)。然而,libc是基石您的系统的。

更改进程的某些可更改和可继承属性的系统调用应该是 shell 内置函数(cd例如目录(2)ulimit为了设置限制(2)等...),因为您可能想要更改 shell 进程本身的属性(并由 shell 启动的未来命令进程继承)。因此,如果cd是一个程序,它只适用于运行该程序的 shell 子进程。

顺便提一句,系统调用只有当某些人完成时才有意义过程。该进程可以是 shell 进程,也可以是 shell 启动的某个子(或后代)进程。

请注意Unix shell都是普通程序。其中有很多(例如桀骜,,韋斯特,英语等等......)...编写自己的 shell 是一个有趣的练习(这可以简单地完成,请参阅窗扇举个例子;也看看有关通配符的提示)。阅读有关Linux编程。如果您对bash使用另一个 shell不满意(也许使用以下命令更改您的登录 shellchsh(1))或者自己写一个。还,GNU bash就像大多数其他贝壳一样自由软件。如果您愿意,您可以研究其源代码并对其进行改进。

相关内容