【问题标题】:would there be such case of jumping, if yes how?会有这种跳跃的情况吗,如果有怎么办?
【发布时间】:2011-01-17 16:38:00
【问题描述】:

我有一个问题,因为跳转指令通过添加有符号偏移量来更改 EIP 寄存器(如果我在这里没有犯错的话),在 IA-32 架构上,如何从位置 0x7FFFFFFF(有符号逻辑中的最大正数)到 0x80000000(有符号逻辑中的最小负数)可能吗?或者由于签名逻辑的性质,不应该有这样的跳跃?

【问题讨论】:

    标签: assembly offset signed


    【解决方案1】:

    有符号和无符号只是解释相同位模式的两种方式。这种解释不会改变加法的执行方式。 7FFFFFFF + 1 始终为 80000000,但这可以解释为有符号(负数)或无符号(正数)。

    指令指针总是被解释为无符号的(显然负地址没有意义),这样就回答了你的问题。

    【讨论】:

    • 重申一下关于 0x7FFFFFFF + 1 始终为 0x80000000 的观点,即使您将 0x7FFFFFFF 视为有符号 (+2147483647),执行此添加仍会导致它溢出并回绕到 -2147483648 (这是0x80000000)
    【解决方案2】:

    相对跳转实际上没有符号。跳转指令的编号被简单地添加到 EIP。所以你可以在 32 位地址空间中任意跳转。

    示例:如果 EIP 为 20,而您想跳转到 4,则使用 jmp 0FFFFFFF0h。将这个大数加到 EIP 中,实际上与减去 16 相同。

    要从 7FFFFFFFh 跳转到 80000000h,您将使用跳转 1。:-) 但是您的地址确实重叠,因此在实践中没有用。

    另请注意,所有加法和减法逻辑都适用于任何符号。操作总是相同的,包括相对跳转。

    【讨论】:

      【解决方案3】:

      由于“平面”寻址模式,地址在 x86 下是无符号的。 intels 开发人员手册的寻址模式部分应该涵盖这一点,所有无条件/条件相对跳转的部分也可能会提到一些内容,但无论由于整数溢出,它们都可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 2016-05-05
        • 1970-01-01
        • 2018-02-25
        相关资源
        最近更新 更多