8

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

4

5 回答 5

27

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

jmp dword [var]

或者:

push 0xbffff994
ret
于 2009-04-21T23:34:28.653 回答
1

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

例子:

start:
 jmp exit

exit:
 ret
于 2009-04-21T23:36:54.327 回答
0

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

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

于 2009-04-21T23:34:15.223 回答
0

在我的系统(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 : 回复
于 2009-04-21T23:35:43.113 回答
0

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

于 2009-04-21T23:42:04.377 回答