gpt4 book ai didi

linux - gdb 似乎忽略了可执行功能

转载 作者:IT王子 更新时间:2023-10-29 00:23:49 25 4
gpt4 key购买 nike

我正在调试一个使用 libnetfilter_queue 的程序。文档指出用户空间队列处理应用程序需要 CAP_NET_ADMIN 功能才能运行。我已使用 setcap 实用程序完成此操作,如下所示:

$ sudo setcap cap_net_raw,cap_net_admin=eip ./a.out

我已验证功能已正确应用,因为 a) 程序正常运行并且 b) getcap 返回以下输出:

$ getcap ./a.out
./a.out = cap_net_admin,cap_net_raw+eip

但是,当我尝试从命令行使用 gdb(例如 $ gdb ./a.out)调试该程序时,由于没有正确的权限集。 gdb 的调试功能在其他情况下完美运行,并按正常方式进行调试。

我什至尝试将这些功能应用于 gdb 二进制文件本身,但无济于事。我这样做似乎是这样的(如 manpages 所记录,“i”标志可能允许被调试者从调试器继承功能。

我是否缺少一些微不足道的东西,或者这真的不能完成吗?

最佳答案

我遇到了同样的问题,一开始我的想法和上面一样,可能是 gdb 出于安全原因忽略了可执行文件的功能。但是,阅读源代码,甚至在调试打开 /dev/sda1 的 ext2fs-prog 时使用 eclipse 调试 gdb 本身,我意识到:

  1. gdb 与其他程序一样没有特别之处。 (就像在矩阵中一样,即使代理人本身也遵守相同的物理定律、重力等,只是他们都是守门人。)
  2. gdb 不是被调试可执行文件的父进程,而是祖父进程。
  3. 被调试的可执行文件的真正父进程是“shell”,即在我的例子中是 /bin/bash

因此,解决方案非常简单,除了将 cap_net_admin,cap_net_raw+eip 添加到 gdb 之外,您还将其应用于您的 shell。即 setcap cap_net_admin,cap_net_raw+eip/bin/bash

您还必须对 gdb 执行此操作的原因是因为 gdb 在创建调试进程之前是 /bin/bash 的父进程。

gdb 中真正的可执行命令行如下:

/bin/bash exec /my/executable/program/path

这是 gdb 内部 vfork 的参数。

关于linux - gdb 似乎忽略了可执行功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4357057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com