【问题标题】:Ollydbg Debugging - Pass exception to application / Step into instructionOllydbg 调试 - 将异常传递给应用程序/进入指令
【发布时间】:2015-12-13 11:06:38
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

    标签: exception ollydbg


    【解决方案1】:

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

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

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

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

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

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

    这与没有附加调试器的情况完全相同。

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

    第二个选项 - 附加调试器时 - 将异常传递给故障线程(使用步骤 [进入 | 结束] / 运行按钮之一)。在这种情况下,系统不会搜索任何处理程序,线程要么简单地重新抛出异常(如果它无法通过它),要么像什么都没发生一样继续执行(如果调试器知道如何处理它)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2015-05-11
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      相关资源
      最近更新 更多