【问题标题】:Why this occur an overflow ?为什么会发生溢出?
【发布时间】:2017-09-04 16:20:32
【问题描述】:

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

__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),而这篇文档说:

" 如果调试器存在,它将再次检查,直到堆栈发生溢出,当发生溢出时,堆栈金丝雀将触发异常并关闭进程,这是退出程序的最短方法。"

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

【问题讨论】:

  • 是的,正是因为这个
  • 好的,谢谢@SamiKuhmonen!我迷路了..啊哈哈
  • 我投票决定将此问题作为题外话结束,因为原始发帖人在问题中回答了他自己的问题。
  • 有趣的事实:如果你在已经循环一次+时间后同时删除调试器,它可能会崩溃,因为只有单个 pop eax 不会恢复堆栈(尽管如果函数的最后部分是使用像mov esp,ebp ret这样的常见结尾,它将生存+恢复不平衡的堆栈状态)。如果有恢复尾声,那么调试它的人可能会在几个循环后(当他注意到陷阱时)欺骗代码,认为没有调试器,并重新加入原始代码流。

标签: assembly stack buffer-overflow


【解决方案1】:

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

如果TEST EAX, EAX 第一次测试不等于,那么每次都会测试不等于,因为你没有做任何事情来改变你正在测试的值。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多