1

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

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

我现在的问题是,通过这种设置,目标(相当)在库函数调用中随机崩溃(无论我使用动态链接还是静态链接)。通过崩溃,我的意思是,它要么尝试访问由于某种原因未映射的内存,要么它只是一直挂在函数中__lll_lock_wait_private(这是在 malloc 调用之后)。

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

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

那么你知道这可能是什么原因吗?即使您不确定,也请告诉我您的建议,我的想法已经不多了...

4

1 回答 1

1

地址空间随机化也可能产生非确定性。您可能希望禁用它以尝试使问题更具确定性。

编辑:

鉴于关闭 ASR 可以“解决”问题,那么潜在的问题可能是:

  1. 在某个地方认为 0 在它应该有效时是无效的,或者相反。(我有什么)。
  2. 使用来自一次运行的地址来对抗不同的运行?
于 2011-10-14T14:16:12.300 回答