我正在尝试识别程序中的错误(32位),这可能会导致代码执行。到目前为止,我使用ollydbg调试了应用程序并运行了我的漏洞利用代码。然后ollydbg给了我一个例外。
为什么我的shellcode会在执行下一条指令时执行,否则不会执行?那么在没有调试器的情况下运行应用程序时的正常情况是什么?
非常感谢!
答案 0 :(得分:1)
当在线程中引发异常时,系统将首先检查是否附加了调试器。
如果附加了调试器,则会向调试器报告异常(而不是错误的进程或线程)。在ollydbg(和大多数调试器)中,您可以选择对该异常执行某些操作。
第一个是将该异常传递给ollydbg中的错误线程(CTRL+F9
)。
系统将查看当前线程的EXCEPTION_REGISTRATION_RECORD
并遍历EXCEPTION_REGISTRATION
结构列表(每个结构都有一个异常处理程序)并检查处理程序是否可以处理异常。 / p>
如果处理程序可以处理异常,则堆栈将展开(到某一点)并且该线程可能会继续其生命。
如果没有处理程序可以处理异常,则调用最终处理程序并且程序崩溃(系统通常会显示一个对话框,通知用户该进程崩溃)。
在没有附加调试器的情况下,这是完全相同的行为。
因此,在您的情况下,将异常传递给调试器可能会解除堆栈,并且线程将在异常位置之后继续执行(或者如果无法处理异常则简单地崩溃整个应用程序)
第二个选项 - 连接调试器时 - 是不将异常传递给故障线程(使用步骤[into | over] / run按钮之一)。在这种情况下,系统不会搜索任何处理程序,并且线程将简单地重新抛出异常(如果它无法通过它)或继续执行,就像没有发生任何事情(如果调试器知道如何处理它)。
你应该检查引发异常的类型(最可能是读/写中的访问冲突;断点异常)并纠正问题(参见ollydbg窗口的底部,它会告诉你哪种异常已被提出)如果你想毫无问题地执行shellcode。