C语言 跟踪保护调试故障



我在一个研究项目上遇到了麻烦。我试图使用ptrace来监视目标进程的执行。在ptrace的帮助下,我将mprotect系统调用注入目标代码段(类似于断点),并将堆栈保护设置为PROT_NONE。之后,我恢复原来的指令,让目标继续。当我得到一个无效的权限段错误时,我再次注入系统调用来取消对堆栈的保护,然后我执行导致段错误的指令并再次保护堆栈。

(这确实适用于简单的程序。)

我现在的问题是,有了这个设置,目标(漂亮)随机崩溃在库函数调用(无论我是否使用动态或静态链接)。通过崩溃,我的意思是,它要么试图访问内存,由于某种原因没有映射,或者它只是保持挂在函数__lll_lock_wait_private(这是在malloc调用之后)。

让我再次强调,崩盘并不总是发生,也不总是发生在相同的位置。

这听起来像是一个同步问题,但据我所知(意思是我查看了/proc/pid/tasks/),只有一个线程在运行。

那么你知道这可能是什么原因吗?请告诉我你的建议,即使你不确定,我已经没有主意了。

不确定性也可能是由地址空间随机化造成的。您可能需要禁用该选项,以尝试使问题更具确定性。

编辑:

假设关闭ASR"修复"了问题,那么潜在的问题可能是:

  1. 某个地方认为0是无效的,而它应该是有效的,反之亦然。(我有什么)。
  2. 在不同的运行中使用一次运行的地址?

最新更新