【问题标题】:x86 jump to an addressx86 跳转到一个地址
【发布时间】:2010-10-20 23:30:59
【问题描述】:

作为安全类的分配,我试图在我的代码中使用__asm__("jmp 0xbffff994");,但是当我在 gdb 中反汇编时,指令更改为jmp 0xc8047e2a。 知道为什么以及如何跳转到特定地址吗?

【问题讨论】:

  • 为什么需要跳转到原始地址?我很难理解任何可能的(非恶意)用途。
  • @kquinn 不管了,他的问题已经被问到了,我们试着回答一下吧。

标签: assembly x86 gdb


【解决方案1】:

在我的系统(gcc 版本 4.2.4,Ubuntu)上,这在 disassmbley 上看起来不错(洞察力):

主函数() { asm("jmp 0xbffff994"); 返回0; };

分解结果(洞察力):

0x8048344 : lea 0x4(%esp),%ecx - 0x8048348 : 和 $0xfffffff0,%esp - 0x804834b : pushl -0x4(%ecx) - 0x804834e : 推送 %ebp - 0x804834f : 移动 %esp,%ebp - 0x8048351:推送 %ecx - 0x8048352:jmp 0xbffff994 - 0x8048357 : 移动 $0x0,%eax - 0x804835c:弹出 %ecx - 0x804835d:弹出 %ebp - 0x804835e : lea -0x4(%ecx),%esp - 0x8048361 : 回复

【讨论】:

  • 我猜这个反汇编程序显示的是 jmp 的偏移量,而不是它的实际目标。 (当你给它一个 32 位立即操作数时, jmp 指令相对于 eip 有一个偏移量)。
  • 你为什么会这样猜?有没有办法测试它?它作为图形界面运行,下面是 GDB。
  • 也可能是没有搬迁。但是,如果您将操作码与程序集一起转储,您将能够看到偏移量。
  • 我看到这个 8048352: e9 3d 76 fb b7 jmp bffff994 <_end> 找不到 _end 标签,但它看起来非常接近程序的结尾。
【解决方案2】:

我建议使用十六进制编辑器,如果只是一次性的,只需更改值即可。

【讨论】:

    【解决方案3】:

    编译时很难确定确切的地址,您是否尝试过使用标签?将它们与 jmp 一起使用更为常见。

    示例:

    start:
     jmp exit
    
    exit:
     ret
    

    【讨论】:

      【解决方案4】:

      可能是因为它是跳转到相对地址,并且链接器或加载器已经移动了您的代码。尝试将地址放入变量中,然后执行:

      jmp dword [var]
      

      或者:

      push 0xbffff994
      ret
      

      【讨论】:

      【解决方案5】:

      Daniel 解释了为什么您的跳跃与您编程的不同。它与目标文件和链接有关。

      如果您想跳转到特定地址,最好使用调试器或反汇编器修补跳转。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-11
        • 1970-01-01
        • 2021-06-21
        相关资源
        最近更新 更多