标签: system-calls

DTrace 捕获应用于某些文件的任何 chmod

在 Mac OS X 目录下,/audit我有一些用户可以chmod根据自己的喜好访问的文件。

我需要chmod通过记录时间、用户和文件来审核对任何文件所做的任何事情chmod,尤其是后者。

我可以dtrace -n 'syscall::chmod:entry'并检测到事件,如何读取第一个参数chmod

man 2 chmod 告诉我路径在第一个参数中:

chmod(const char *path, mode_t mode);
Run Code Online (Sandbox Code Playgroud)

但我怎么读args[0]?我想我这样做是错误的。也许条目与实际的系统调用不对应?

如果我有一个可以监控的探针,我如何检查它提供哪些参数供访问以及它们是什么类型?我假设一些指针需要根据它们的数据布局取消引用..

osx monitoring system-calls dtrace

6
推荐指数
1
解决办法
633
查看次数

您可以从 OSX 终端执行系统调用吗?

所以我在 C 程序的上下文中获得系统调用,但我的教科书并没有真正解决在终端(在 Mac OSX 上)中进行系统调用的问题。您可以像“命令”一样在命令行上执行这些操作,还是完全不同的概念?抱歉,我确定这是非常初级的,只是找不到答案。

command-line osx system-calls

6
推荐指数
1
解决办法
2974
查看次数

如何找到定义ac函数的头文件?

有没有一种简单的方法可以找出 C 函数声明在哪个头文件中?cd进入/usr/include并运行 ( grep -E 'system.*\(' *.h -R) 需要一些反复试验,但没有更简单的方法来做到这一点吗?

c system-programming system-calls

6
推荐指数
1
解决办法
1万
查看次数

6
推荐指数
2
解决办法
1330
查看次数

找出一个文件被打开了多少次?

好的,这是一个脑力难题:如何找出当前在 Linux 机器上运行的任何/所有进程(以任何模式)打开特定文件的次数?即有多少文件描述符,全局(或在命名空间/容器内,无关紧要)正在使用引用特定文件/inode?

找出这一点的一种方法可能是使用 lsof 并计算有问题的文件名在其输出中出现的次数。但这似乎不雅,无论如何,我需要在 C 中以编程方式进行类似的操作。

编辑:或者可能是一个类似但不同的问题,这也有帮助:任何进程(可能不包括这个)?

filesystems c system-calls lsof

6
推荐指数
1
解决办法
2814
查看次数

有关设备映射器 ioctl 的文档?

关于 Device Mapper 的 Red Hat 文档中,它写道:

“设备映射器的应用程序接口是 ioctl 系统调用。”

到目前为止,我知道ioctl被发送到/dev/mapper/control(对于大多数发行版),但似乎我需要深入研究dmsetup、 libdevmapper 或类似的源代码,以了解 ioctl 实际如何工作以及如何使用它们。

是否有任何书籍、讲座或文档对这个主题进行了扩展?我是否陷入了解析复杂源代码的困境?我使用 libdevmapper 而不是 ioctl 系统调用更好吗?ioctl 的手册页过于笼统,在这种情况下没有多大用处。

linux system-calls dm-crypt device-mapper ioctl

6
推荐指数
0
解决办法
1333
查看次数

直接执行系统调用

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

system-calls

6
推荐指数
2
解决办法
1万
查看次数

为什么系统调用寄存器和顺序从Intel 32bit 变成了64bit?

我正在努力记住 Linux 系统调用的顺序,以便我可以更轻松地识别这一点。然后我在这里找到了这篇论文,它说,

要在32位Linux系统调用,将系统中的电话号码eax,然后它的参数,以便在ebxecxedxesiedi,和ebp,然后调用INT 0x80的。

进而,

要在64位Linux系统调用,将系统中的电话号码rax,然后它的参数,以便在rdirsirdxr10r8,和r9,然后调用系统调用。

为什么订单在 64 位和 32 位之间变得如此残缺?我知道这个问题可能是历史问题而不是技术问题。

这完全由内核决定,对吧?是否有技术原因支持较新的约定?

linux system-calls history

6
推荐指数
2
解决办法
1463
查看次数

系统调用号?运行时的名称映射

有没有办法解决观察到的系统调用的数量:

SYS_345(0xe, 0xbff94188, 0x2, 0x4000, 0xb6526000) = 2
Run Code Online (Sandbox Code Playgroud)

在正在运行的内核中使用它的符号名称而不在源代码中查找它?

编辑用例是一个过时的strace二进制文件,位于外部框上,其内核源代码检索起来可能很乏味。

linux system-calls strace

6
推荐指数
1
解决办法
3158
查看次数

为什么我不能删除 sudo root 权限?

我正在调试一个程序,但不太清楚为什么我不能删除权限。

我有 root 权限sudo,可以调用setgid/setuid,但[is]不支持该操作。

重现的基本代码(golang):

package main

import (
    "fmt"
    "os"
    "strconv"
    "syscall"
)

func main() {
    if os.Getuid() != 0 {
        fmt.Println("run as root")
        os.Exit(1)
    }

    uid, err := strconv.Atoi(os.Getenv("SUDO_UID"))
    check("", err)

    gid, err := strconv.Atoi(os.Getenv("SUDO_GID"))
    check("", err)

    fmt.Printf("uid: %d, gid: %d\n", uid, gid)

    check("gid", syscall.Setgid(gid))
    check("uid", syscall.Setuid(uid))
}

func check(message string, err error) {
    if err != nil {
        fmt.Printf("%s: %s\n", message, err)
        os.Exit(1)
    }
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

$ sudo ./drop-sudo 
uid: 1000, …
Run Code Online (Sandbox Code Playgroud)

root setuid permissions sudo system-calls

6
推荐指数
1
解决办法
1430
查看次数