如果syscall调用了特定参数(GDB / strace),则挂起程序执行

时间:2018-04-11 12:23:47

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

使用现成的工具来暂停跟踪过程是否存在一种直截了当的方式'使用特定参数调用某些系统调用时执行?具体来说,我想暂时执行程序执行

stat("/${SOME_PATH}")

readlink("/${SOME_PATH}")

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

strace向我显示系统调用正常,gdb完成剩下的工作。问题是,如何将它们结合在一起。这肯定可以通过自定义胶水脚本解决,但我宁愿使用干净的解决方案。

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

1 个答案:

答案 0 :(得分:1)

这是我在windows调试中用于类似条件的方法。即使我认为你也应该可以,但我还没有在linux中使用gdb进行尝试。

  1. 在附加流程时,请在系统调用中设置断点,例如stat
  2. 根据esp向您的断点添加条件。例如,您想要检查stat("/$te")[esp+4]处的值应指向字符串的地址,在本例中为"/$te"。然后添加如下条件:*(uint32_t*)[esp+4] == "/$te"。您似乎也可以在条件here中使用strcmp()
  3. 我认为类似的东西对你也有用。