在使用 Pin 的 fuzzing 应用程序中(Pintool 源代码托管在这里,我很抱歉自我宣传),我在跟踪执行指令时遇到了一个非常奇怪的情况,以下跟踪:
...
0x404f94 test edx, edx
0x404f96 jnz 0x404fe1
0x404fe1 pop ebp
0x404f89 rep cmpsb byte ptr [esi], byte ptr [edi]
0x404f8b pop edi
0x404f8c pop esi
0x404f8d jz 0x404f94
0x404f8f sbb edx, edx
...
是从 wget 的执行中提取出来的。奇怪的观察是 0x404f8f 之后的指令在某种程度上是任意的,通常它应该是:
0x404f91 sbb edx, 0xffffffff
但“有时”是:
0x779a015d add esp, 0x4
它位于 NtWaitForMultipleObjects 中。说“有时”,我的意思是它并不总是发生,但它会发生,并且是 100% 可重复的。
我仍然无法弄清楚这里发生了什么。首先,观察意味着程序的控制流以不可预测的方式发生了变化。其次,位于 NtWaitForMultipleObjects 中的奇怪指令,即它必须在内核空间中,但在这里我已经在程序中(即在用户空间中)观察到它。
我知道这个问题很具体,但请随时向我索取更多信息。我真的很感激任何帮助。