跟踪反向执行中的奇怪行为

逆向工程 模糊测试 仪器仪表
2021-06-12 22:27:48

在使用 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 中的奇怪指令,即它必须在内核空间中,但在这里我已经在程序中(即在用户空间中)观察到它。

我知道这个问题很具体,但请随时向我索取更多信息。我真的很感激任何帮助。

1个回答

在处理多线程程序时,您最终可能会收到来自不同线程的指令。例如,您可以检查当前线程 ID 以确保获得所需内容。

即使程序本身不使用线程,它们也可能由系统库创建。最常见的示例之一是TppWaiterpThreadRPC 函数也经常创建线程。