x86跳转到一个地址

时间:2009-04-21 23:26:42

标签: assembly x86 gdb

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

5 个答案:

答案 0 :(得分:23)

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

jmp dword [var]

或者:

push 0xbffff994
ret

答案 1 :(得分:0)

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

如果你想跳转到某个特定地址,最好使用Debugger或Disassembler修补跳转。

答案 2 :(得分:0)

在我的系统(gcc版本4.2.4,Ubuntu)上,这看起来很糟糕(洞察力):

int main()
{
asm("jmp 0xbffff994"); 
return 0;
};       

disassmbley(洞察力)的结果:

        0x8048344       :                 lea    0x4(%esp),%ecx
-       0x8048348       :               and    $0xfffffff0,%esp
-       0x804834b       :               pushl  -0x4(%ecx)
-       0x804834e       :              push   %ebp
-       0x804834f       :              mov    %esp,%ebp
-       0x8048351       :              push   %ecx
-       0x8048352       :              jmp    0xbffff994
-       0x8048357       :              mov    $0x0,%eax
-       0x804835c       :              pop    %ecx
-       0x804835d       :              pop    %ebp
-       0x804835e       :              lea    -0x4(%ecx),%esp
-       0x8048361       :              ret

答案 3 :(得分:0)

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

示例:

start:
 jmp exit

exit:
 ret

答案 4 :(得分:0)

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