【问题标题】:Suspend program execution if syscall with specific parameters called (GDB / strace)如果调用带有特定参数的系统调用(GDB / strace),则暂停程序执行
【发布时间】:2018-09-21 08:07:19
【问题描述】:

当使用特定参数调用某些系统调用时,是否有一种使用现成工具的直接方法来暂停跟踪进程的执行?具体来说,我想随时暂停程序执行

stat("/${SOME_PATH}")

readlink("/${SOME_PATH}")

被调用。然后我的目标是附加一个调试器,以便我可以识别链接到进程的数百个共享对象中的哪些正在尝试访问该特定路径。

strace 向我展示了系统调用,其余的由 gdb 完成。问题是,如何将它们结合在一起。这当然可以通过自定义胶水脚本来解决,但我宁愿使用干净的解决方案。


手头的问题是第 3 方工具套件,它仅以二进制形式提供,并且该分发包完全违反 LSB/FHS 和良好的礼仪,并将共享对象放置在整个文件系统中,其中一些是从不可配置的路径加载的。我想确定工具套件的哪些模块尝试执行此操作,然后修补二进制文件或向供应商提交问题。

【问题讨论】:

  • 特定于操作系统的东西可以吗?使用systemtapdtrace 在使用某些参数进行系统调用时向进程发送SIGSTOP 很容易,但它们并不存在于任何地方(并且需要提升权限)。
  • 目标操作系统是Linux,所以dtrace可用。 @Afshin 的回答也很合适,但是我也想看看 dtrace 解决方案。

标签: debugging gdb reverse-engineering system-calls strace


【解决方案1】:

这是我在 Windows 调试中用于类似情况的方法。即使我认为您也应该可以,但我还没有在 linux 中使用gdb 尝试过。

  1. 附加进程时,在系统调用上设置断点,例如 stat 在您的情况下。
  2. 将基于esp 的条件添加到断点。例如你想检查stat("/$te")[esp+4] 的值应该指向字符串的地址,在这种情况下是 "/$te"。然后添加一个条件,如:*(uint32_t*)[esp+4] == "/$te"。看来您也可以按照here 的描述在您的情况下使用strcmp()

我认为类似的东西也应该适合你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多