Ghidra 调试器 attach 到目标进程报 Operation not permitted 怎么解决
【免费下载链接】ghidraGhidra is a software reverse engineering (SRE) framework项目地址: https://gitcode.com/GitHub_Trending/gh/ghidra
用 Ghidra Debugger 在 Linux 上通过 GDB attach 到已在运行的目标进程时,如果 attach 动作返回Operation not permitted或类似报错,Ghidra 官方课程文档给出的判断是:你的系统大概率启用了 Yama 的ptrace_scope=1,限制了 ptrace 的使用。仓库随课程练习文件提供了一个小工具anyptracer,用它来运行目标进程,可以让单个进程允许被 attach,而不必改动系统全局安全策略。本文以课程配套样例termmines为目标,给出完整的 attach 操作路径、两种修复方案和验证方法。
前提条件
- Linux 系统,GDB 可用,且 Ghidra 的 Debugger 工具已配置好 gdb 启动器(启动菜单中存在Configure and Launch ... using → gdb)。
- 目标进程独立于 Ghidra 之外运行。文档说明这种 attach 技巧之所以可行,是因为目标会等待输入;对启动后立即退出的程序无法 attach。
- 如果需要自己编译
termmines,系统要有ncurses及其开发头文件和库,在练习文件目录执行:
cd GhidraDocs/GhidraClass/ExerciseFiles/Debugger makemake会同时编译termmines和anyptracer。如果只需要 attach 工具本身,也可以只构建anyptracer目标(make anyptracer,见 Makefile),避免受 ncurses 依赖影响。
Attach 的操作路径与现象定位
按课程文档 Attaching 一节,attach 的完整步骤是:
- 在 Ghidra 之外的终端里运行
termmines(如需自定义命令行参数,就在这里带上)。 - 在 Ghidra Debugger 中,使用Launch按钮的下拉菜单,选择Configure and Launch termmines using... → gdb。
- 清空Image字段。清空后配置的是一个不带目标的 GDB 会话;gdb 的位置和架构默认值对 64 位 x86 目标(使用系统自带的 GDB)是正确的。
- 点击Launch。
- 在左侧Model窗口展开Available节点,在过滤框里输入
termmines。 - 右键该进程节点选择Attach;或者记下 PID(例如 1234),在Terminal中输入
attach 1234。
第 6 步在 Yamaptrace_scope=1的系统上就会得到Operation not permitted一类错误。
修复方案一(文档推荐):用 anyptracer 运行目标
anyptracer是课程提供的一个 stub 工具,源码见 anyptracer.c:它先对自己调用prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY),允许任何其它进程追踪自己,然后再执行一条 shell 命令。这样目标进程在ptrace_scope=1的系统上也能被 attach,效果"如同"ptrace_scope=0,但不会降低系统其余部分的安全性。
用法(来自程序自带的 Usage 文本):参数是一条 shell 命令,执行方式相当于/bin/sh -c COMMAND,且必须是单个参数;要运行带多个参数的命令时,把整条命令用引号包起来。针对 termmines 场景,文档给出的示例命令是:
./anyptracer 'exec ./termmines'关键在于exec:它让样例运行在这个"许可进程"内部,之后的 attach 才能成功。然后回到 Ghidra 侧重复上一节的 attach 步骤:以清空Image的方式配置 gdb 会话、Launch、在Model窗口找到termmines并Attach。
修复方案二(需要 root,日常系统不推荐):修改 ptrace_scope
如果你有 root 权限,文档说可以直接按照相关的在线文档把ptrace_scope配置改掉(文档未给出具体命令)。但文档明确警告:除非是专门留给调试用的系统,否则不应该全局设置ptrace_scope=0,因为这会显著降低系统安全性——任何被入侵的进程都能 attach 到同一用户的其它进程并窃取数据(例如凭据)。所以日常机器上应优先使用方案一。
验证 attach 是否正常
课程练习给出的验证方式是看回溯:在 Debugger 的Terminal中输入:
bt如果目标停在read中(termmines 启动后就在等待输入),即表示 attach 完成(文档以此作为练习完成的判断)。
attach 后Model窗口状态异常时,文档给出两个排查项:
- Model窗口是空的:检查 Dynamic Listing 里是否有 "noname" 标签页,点击它。
- attach 之后Model窗口看起来不完整:确认 Filter 过滤框已清空。
边界与限制
- 这条 attach 路径依赖目标进程存活且等待输入。文档也说明,attach 属于"slightly more advanced"的用法,适用于目标是更大系统的一部分、需要 in situ 运行的情况。
anyptracer只是让被它启动的那条命令允许被任意进程追踪,不改变 Yama 的全局策略;prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY)的效果只作用于它派生的进程。- 方案二属于系统级配置变更,执行前务必确认上面给出的安全风险描述。
相关文档:A1-GettingStarted.md(Attaching 与 Troubleshooting 两节)、Makefile、anyptracer.c。
【免费下载链接】ghidraGhidra is a software reverse engineering (SRE) framework项目地址: https://gitcode.com/GitHub_Trending/gh/ghidra
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考