Ollydbg调试 - 将异常传递给application / Step into instruction

时间:2015-12-13 11:06:39

标签: exception ollydbg

我正在尝试识别程序中的错误(32位),这可能会导致代码执行。到目前为止,我使用ollydbg调试了应用程序并运行了我的漏洞利用代码。然后ollydbg给了我一个例外。

  • 如果我按“Ctrl + F9”似乎没有执行我的shellcode
  • 相反,当异常发生时,我用“F8”逐步执行下一条指令,我终于到达了我的shellcode,它得到了执行
  • 如果我在没有ollydbg的情况下运行应用程序,我的shellcode也不会被执行

为什么我的shellcode会在执行下一条指令时执行,否则不会执行?那么在没有调试器的情况下运行应用程序时的正常情况是什么?

非常感谢!

1 个答案:

答案 0 :(得分:1)

当在线程中引发异常时,系统将首先检查是否附加了调试器。

如果附加了调试器,则会向调试器报告异常(而不是错误的进程或线程)。在ollydbg(和大多数调试器)中,您可以选择对该异常执行某些操作。

第一个是将该异常传递给ollydbg中的错误线程(CTRL+F9)。

系统将查看当前线程的EXCEPTION_REGISTRATION_RECORD并遍历EXCEPTION_REGISTRATION结构列表(每个结构都有一个异常处理程序)并检查处理程序是否可以处理异常。 / p>

  • 如果处理程序可以处理异常,则堆栈将展开(到某一点)并且该线程可能会继续其生命。

  • 如果没有处理程序可以处理异常,则调用最终处理程序并且程序崩溃(系统通常会显示一个对话框,通知用户该进程崩溃)。

在没有附加调试器的情况下,这是完全相同的行为。

因此,在您的情况下,将异常传递给调试器可能会解除堆栈,并且线程将在异常位置之后继续执行(或者如果无法处理异常则简单地崩溃整个应用程序)

第二个选项 - 连接调试器时 - 是将异常传递给故障线程(使用步骤[into | over] / run按钮之一)。在这种情况下,系统不会搜索任何处理程序,并且线程将简单地重新抛出异常(如果它无法通过它)或继续执行,就像没有发生任何事情(如果调试器知道如何处理它)。

你应该检查引发异常的类型(最可能是读/写中的访问冲突;断点异常)并纠正问题(参见ollydbg窗口的底部,它会告诉你哪种异常已被提出)如果你想毫无问题地执行shellcode。