【问题标题】:pusha assembly language instructionpusha 汇编语言指令
【发布时间】:2011-01-17 19:15:19
【问题描述】:

我有一个核心转储,其中堆栈已损坏。 我尝试拆卸它,发现以下请帮助我分析它..

(gdb) bt
#0  0x55a63c98 in ?? ()
#1  0x00000000 in ?? ()

(gdb) disassemble 0x55a63c90 0x55a63ca8

Dump of assembler code from 0x55a63c90 to 0x55a63ca8:

0x55a63c90:     add    %cl,%dh

0x55a63c92:     cmpsb  %es:(%edi),%ds:(%esi)

0x55a63c93:     push   %ebp

0x55a63c94:     add    %al,(%eax)

0x55a63c96:     add    %al,(%eax)

**0x55a63c98:     pusha**

0x55a63c99:     lret   $0x9

0x55a63c9c:     subb   $0x56,0xd005598(%ebp)

0x55a63ca3:     push   %ebp

0x55a63ca4:     jo     0x55a63cc5

0x55a63ca6:     sahf

0x55a63ca7:     push   %ebp

End of assembler dump.
(gdb) q

这个 pusha 指令会导致核心转储吗?

【问题讨论】:

    标签: c compiler-construction assembly gdb core


    【解决方案1】:

    没有*,pusha 所做的只是将所有通用寄存器压入堆栈,包括堆栈指针!导致核心转储的原因是 pusha 之后的指令 lret,这是一个带有堆栈弹出的长返回。返回地址是最近推送到堆栈的值,在这种情况下,它将是 esi:edi 中的任何值(因为它们是 pusha 指令推送的最后一个值),并且可能指向某个随机位置。

    * 除非你的堆栈空间用完了。

    【讨论】:

    • 有什么方法可以验证堆栈溢出吗?
    • @Arpit:这取决于,在保护模式下你会得到一个#SS(0) CPU 异常。除此之外,您可能会收到#PF(x) 异常。但是这些将被操作系统捕获。 nobugz 提出了最可能的原因:代码跳转到了随机的内存位。您可以通过取消引用无效指针来做到这一点,通常是通过在尚未初始化的对象上调用虚拟方法。
    【解决方案2】:

    当然。 PUSHA 后跟 RET 永远不会正确,返回地址将是垃圾。在你的反汇编中看到 ADD AL,[EAX] 是另一个死的放弃,那就是 0 的反汇编。

    换句话说:您是在反汇编数据,而不是代码。你的程序被炸毁了,因为它正在执行数据。发生的经典方式是使用缓冲区溢出破坏堆栈帧。当函数返回时,它会从损坏的堆栈中弹出一个无效的返回地址并跳转到永不着陆。没有遇到段错误是很不走运的。

    很难调试,堆栈跟踪是垃圾。您需要在最后一个已知的良好代码地址处设置一个断点并开始单步执行。你在它爆炸之前进入的最后一个好功能通常是麻烦制造者。

    【讨论】:

    • 如果它永远不正确,那么为什么会生成这个指令集?
    • 你没有抓住重点。您找到的汇编代码不是代码。它是数据。反汇编数据会生成奇怪的指令。像 POPA 和 SAHF。我解释了您的程序如何最终执行数据而不是代码。
    【解决方案3】:

    pusha 只能在此时发生堆栈溢出时导致核心转储。该指令将所有寄存器值压入堆栈,这可能导致溢出。然而,问题的根源可能在其他地方 - 很可能此时调用堆栈太深,而 pusha 恰好会导致这样的后果,因为它是在这样的条件下执行的。

    【讨论】:

      【解决方案4】:

      检查是否看到对齐的反汇编代码:

      x/i $eip
      

      同时显示寄存器值:

      i r
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 2022-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多