【发布时间】: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