作为安全类的赋值,我尝试在代码中使用__asm__("jmp 0xbffff994");
,但是当我在gdb中反汇编内容时,指令更改为jmp 0xc8047e2a
。
知道为什么以及如何跳转到特定地址?
答案 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)
我建议使用十六进制编辑器,如果它只是一次性的话,只需更改值。