【发布时间】:2016-05-25 22:44:50
【问题描述】:
我正在调试 linux 中的崩溃,并且正在组装函数 cxa_finalize
崩溃发生在看起来无法访问的源代码行上:
cmp %edx,%esi // f >= &funcs->fns[0]
jae 0xb6e17b88 // enter for loop
jmp 0xb6e17c08 // exit for loop
lea 0x0(%esi,%eiz,1),%esi // crashes here - how do we even get here since there is a
// jmp above us, and nothing jumps to here
cmp %edi,0xc(%esi) // d == f->func.cxa.dso_handle (jumped to from below)
稍后在此方法中,在 jmp 和 nop 之后出现的另一个 lea 0x0(%esi,%eiz,1),%esi 指令也似乎无法访问。在这种情况下,jmp 也会退出 for 循环。
这里是否存在一些范式,其中包含无法访问的指令?
编辑:当访问esi 的内存时,它并没有在lea 指令上崩溃,而是在它之后的cmp 指令上崩溃。
【问题讨论】:
-
它可能只是你的调试器正在反汇编为可读指令的垃圾。发生这种情况的原因多种多样。
-
知道这段代码的地址会有所帮助。例如,您知道
jae 0xb6e17b88指令不只是将jmp指令跳转到lea指令吗? -
它也可能是其他跳转的目标。顺便说一下,
lea只是对齐的填充,因此可能确实无法达到。 -
我个人最喜欢的是一个粉碎的堆栈导致返回到代码中的错误位置。欢闹的结果。这不是比尔默里有趣,但它在那里。
-
@davidbak,是的,我知道。我在我的问题中显示了一个简化的输出,但在我的完整输出中,每一行旁边都有一个绝对地址和相对地址,所有跳转也显示相对地址,因此很容易看到所有跳转的位置的功能正在进行中。