2009-04-21 72 views
6

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

+2

为什么你需要跳转到一个原始地址?我很难理解任何可能的(非恶意的)用法。 – kquinn 2009-04-21 23:33:50

+0

你使用什么系统? – 2009-04-21 23:36:58

+5

@kquinn不管,他的问题已被问到,让我们试着回答它。 – samoz 2009-04-21 23:41:08

回答

18

可能是因为它跳转到相对地址,并且链接器或装入器已移动您的代码。尝试把地址转换成一个变量,然后执行:

jmp dword [var] 

或者:

push 0xbffff994 
ret 
0

丹尼尔解释为什么你的跳跃与你编程的不一样。它与对象文件和链接有关。

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

0

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

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

结果(洞察力):

 
     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 
0

编译时很难确定确切的地址,你试过使用标签吗?在jmp中使用它们更为常见。

例如:

start: 
jmp exit 

exit: 
ret 
0

我会建议使用十六进制编辑器和简单的改变值,如果它只是一个一次性的事情。