为什么会发生溢出?

时间:2017-04-09 16:50:56

标签: assembly stack buffer-overflow

所以我有些日子想知道这段代码是如何导致溢出的:

__asm
{
CheckDebugger:
  PUSH EAX                    // Save the EAX value to stack
  MOV EAX, [FS:0x30]          // Get PEB structure address
  MOV EAX, [EAX+0x02]         // Get being debugged byte
  TEST EAX, EAX               // Check if being debuged byte is set
  JNE CheckDebugger           // If debugger present check again
  POP EAX                     // Put back the EAX value
}

因此,此代码正在检查BeingDebuggedByte到PEB块的值。

所以,如果设置了这个,他会再次跳到CheckDebugger,如果没有,他会继续。

所以,我正在阅读反检测艺术(1),而且这份文件说:

“如果调试器存在,它将再次检查,直到堆栈发生溢出,当发生溢出时,堆栈canaries将触发异常并且进程将被关闭,这是退出程序的最短方式。”< / em>的

如何在堆栈中发生溢出?也许是因为我们每次都将eax推入堆栈?

1 个答案:

答案 0 :(得分:0)

精神错乱的定义是什么?一遍又一遍地做同样的事情并期待不同的结果。

如果TEST EAX, EAX测试不是第一次测试,那么每次都会测试它不相等,因为你什么也没做,无法改变你正在测试的值。

另一方面,当你push eax时,循环的每次迭代都会向堆栈添加一个32位数字,这就是它溢出的原因。

您可以跳转到push eax之后的指令然后您将处于无限循环中,但另一个线程可能会更改您正在测试的变量并让您退出循环 - 如果还有其他线程。