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