标签: system-calls

从 strace 日志中过滤掉失败的系统调用

我可以运行strace类似的命令sleep 1 并查看它正在访问哪些文件,如下所示:

strace -e trace=file -o strace.log sleep 1
Run Code Online (Sandbox Code Playgroud)

然而,在我的机器上,许多调用的返回值为-1,表明该文件不存在。例如:

$ grep '= -1 ENOENT' strace.log | head
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_IDENTIFICATION", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_MEASUREMENT", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file …
Run Code Online (Sandbox Code Playgroud)

system-calls strace

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

系统调用列表及其解释?

在哪里可以找到系统调用列表以及每个调用的作用?我不是 C 程序员,我是管理员,所以有时我发现在正在运行的进程上运行strace以查看发生了什么很有帮助,但有很多东西我不明白。我想我可以接受阅读源代码,但对于像我这样不花一整天编程的人来说,这是一项耗时的工作。对于理解 GNU/Linux 的这个方面有什么建议吗?

linux system-calls

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

exec() 和 system() 系统调用

我明白虽然 exec() 在 Unix 中执行后不返回,system() 可能会或可能不会返回,具体取决于情况。但是谁能解释为什么 exec() 系统调用不返回以及 exec() 之间的差异) 和 system() 在 Unix 操作系统中

linux system-calls linux-kernel

5
推荐指数
1
解决办法
7383
查看次数

如何将 Wing IDE 的进程名称从 python 更改为更具描述性的名称

在我的 Ubuntu(使用top/ System Monitor)下的进程列表中,最大的内存猪(200+Mb)之一是python. 我搜索了一些我的程序,直到我意识到这是我的 Python IDE ( Wing ),它本身是用 Python 编写的。

我以为我可以通过从setproctitle包中插入 setproctitle 来更改程序的名称,但是 Wing 使用的 python 版本与我自己的不同。setproctitle需要编译,并且 wing 使用的 python 不是完整安装(我询问了 Wing 支持,但他们不太可能更改/合并 setproctitle)。

setproctitle 只能更改正在运行的进程的名称,因此我也无法制作启动 Wing 然后更改进程名称的脚本。

之后,我尝试写入 /proc/PIDNUM/comm,但尽管该“文件”是“rw”,但我不允许在那里写入。

我终于为这个特殊情况找到了一个不太便携的解决方案。但是我想知道是否有一种标准方法可以使用 Linux 系统调用更改另一个(可能是子)进程的进程名称。

process system-calls python

5
推荐指数
1
解决办法
1172
查看次数

没有系统调用的 API

《Understanding Linux Kernel》一书说,“对于数学函数之类的抽象事物,可能没有理由进行系统调用”。谁能解释一下数学函数中如何不需要系统调用?CPU 不参与数学运算吗?谁能举一个这样的程序的例子?

kernel system-calls

5
推荐指数
1
解决办法
1347
查看次数

获取主编号为 0 的设备(btrfs 子卷)

当我在 btrfs 子卷上统计文件时,我得到的主要设备编号为0. 有没有一种可靠的方法来找到这个设备的挂载点,而无需事先知道它是一个 btrfs 子卷?

例如,我希望能够在 python 中做到这一点:

>>> st = os.stat('a file')
>>> os.major(st.st_dev)
0
>>> os.minor(st.st_dev)
38
>>> os.path.exists('/sys/dev/block/0:38')
False
>>> magic_method_that_gets_mount_point(0, 38)
'/home'
>>> magic_method_that_gets_mount_point(8, 1)
'/boot'
Run Code Online (Sandbox Code Playgroud)

(在我的情况下,sda1( /sys/dev/block/8:1) 安装在 上/boot,并且/home是 的 btrfs 子卷sda2)。

编辑

我需要能够在不知道文件路径的情况下执行此操作。上面我用作os.stat示例,但是信息实际上是从ioctl对循环设备的调用中检索的,该循环设备返回:

struct loop_info64 {
    uint64_t    lo_device;
    uint64_t    lo_inode;
    uint64_t    lo_rdevice;
    uint64_t    lo_offset;
    uint64_t    lo_sizelimit;
    uint32_t    lo_number;
    uint32_t    lo_encrypt_type;
    uint32_t    lo_encrypt_key_size;
    uint32_t    lo_flags;
    uint8_t     lo_file_name[64];
    uint8_t     lo_crypt_name[64]; …
Run Code Online (Sandbox Code Playgroud)

filesystems system-calls stat btrfs

5
推荐指数
1
解决办法
680
查看次数

重新挂载只读而不更改其他选项

在 上工作systemd-shutdown,它用于mount()将文件系统重新挂载为只读。

/* MS_REMOUNT requires that the data parameter
 * should be the same from the original mount
 * except for the desired changes. Since we want
 * to remount read-only, we should filter out
 * rw (and ro too, because it confuses the kernel) */
...filter_options(m->options, "rw\0ro\0", NULL, NULL, &options);

...mount(NULL, m->path, NULL, MS_REMOUNT|MS_RDONLY, options)...
Run Code Online (Sandbox Code Playgroud)

但是当我查看时strace mount -oremount,rw /bootmount系统调用被传递为 NULL 作为它的最后一个参数。这是否表明实际上没有必要复制和破坏旧的选项字符串?

linux system-calls mount

5
推荐指数
1
解决办法
2656
查看次数

Bash 从哪个版本中删除特权?

我一直在尝试做一些缓冲区溢出攻击,我想我可以用system("/bin/bash")它来获得一个 root shell。

然后我阅读system().

它说:

system()实际上,在/bin/shbash 版本 2 的系统上,具有 set-user-ID 或 set-group-ID 权限的程序将无法正常工作,因为 bash 2 在启动时会删除权限。

我正在攻击的系统有一个 bash 版本 4.3,当我使用 a 时system("/bin/bash"),我没有获得 root 权限(当然,我攻击的初始程序以 root 权限开始)。我的问题是:系统会只删除 bash 版本 2 的权限,还是会删除版本 > 2 的任何 bash 的权限?

编辑:/bin/bash只是放弃特权,而/bin/dash/bin/sh不。

在阅读@StéphaneChazelas 的评论后,EDIT2:

  • 检查此链接以获取有关 bash 删除权限的更多解释和准确性。
  • -p 选项可用于确保在 bash 生成时保留特权。

shell bash version system-calls privileges

5
推荐指数
1
解决办法
2914
查看次数

以原子方式写入文件而不更改 inode(保留硬链接)

X在 Unix 上安全、原子地写入文件的正常方法是:

  1. 将新文件内容写入临时文件Y
  2. rename(2) YX

在两个步骤中,我们似乎除了X“就地”更改之外什么也没做。

它可以防止竞争条件和意外数据丢失(X被破坏但Y不完整或被破坏)。

这样做的缺点(在这种情况下)是它不会写入X就地引用的 inode ;rename(2)makeX引用一个新的 inode 编号。

X链接计数> 1(显式硬链接)的文件时,现在它不像以前一样引用相同的inode,硬链接已损坏。

消除缺点的明显方法是就地写入文件,但这不是原子的,可能会失败,可能导致数据丢失等。

有没有办法像原子一样做到rename(2)但保留硬链接?

也许将Y(临时文件)的 inode 编号更改为与 相同X,并为其X命名?一个 inode 级别的“重命名”。

这将有效地写入XwithY的新内容引用的 inode ,但不会破坏其硬链接属性,并且会保留旧名称。

如果假设的 inode“重命名”是原子的,那么我认为这将是原子的并且可以防止数据丢失/竞争。

system-calls hard-link inode rename write

5
推荐指数
1
解决办法
640
查看次数

将 syscall 事件跟踪输出的格式更改为 ftrace

我为 sys_enter_openat 系统调用启用了 ftrace 事件跟踪。在 events/syscalls/sys_enter_openat/format 给出的相应输出格式是

print fmt: "dfd: 0x%08lx, filename: 0x%08lx, flags: 0x%08lx, mode: 0x%08lx", ((unsigned long)(REC->dfd)), ((unsigned long)(REC->filename)), ((unsigned long)(REC->flags)), ((unsigned long)(REC->mode))
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,ftrace 的示例输出行类似于

msm_irqbalance-1338  [000] ...1 211710.033931: sys_openat(dfd: ffffff9c, filename: 5af693f224, flags: 2, mode: 0)
Run Code Online (Sandbox Code Playgroud)

有没有办法改变输出格式,这样filename: 5af693f224可以显示为filename: <string>而不是hex(5af693f224)

所以基本上有一种方法可以在跟踪特定事件(例如上面的 sys_enter_openat)到 ftrace 时更改输出格式。

我想这可以使用 systemtap 或 krpobe 实现,但我的设置目前不允许使用。

linux debugging system-calls strace ftrace

5
推荐指数
1
解决办法
593
查看次数