2009-04-21 15 views
6

Como una asignación para una clase de seguridad, estoy tratando de usar __asm__("jmp 0xbffff994"); en mi código, pero cuando desensamblo cosas en gdb, la instrucción cambia a jmp 0xc8047e2a. ¿Alguna idea de por qué y cómo puedo saltar a una dirección en particular?x86 saltar a una dirección

+2

¿Por qué diablos necesitas saltar a una dirección sin formato? Estoy teniendo dificultades para entender cualquier uso posible (no nefasto) para eso. – kquinn

+0

¿Qué sistema usas? –

+5

@kquinn independientemente, su pregunta ha sido hecha, intentemos responderla. – samoz

Respuesta

18

Probablemente porque es un salto a una dirección relativa, y el enlazador o cargador ha movido su código. Trate de poner la dirección en una variable, y luego hacer:

jmp dword [var] 

o alternativamente:

push 0xbffff994 
ret 
+5

* que * es la respuesta correcta, también tenga en cuenta que: "mov eax, 0x11223344; jmp eax"; también funcionará y es probablemente el más directo. –

+1

muy cierto, pero podría estar utilizando la llamada rápida (no estoy seguro de la importancia de 0xbffff994). – Mark

+0

¡La combinación PUSH RET funciona! ¡Gracias! – Martin

0

Daniel Explica por qué su salto no es el mismo que programó. Tiene que ver con archivos de objetos y enlaces.

si desea ir a una dirección en particular, es mejor parchar el salto con un depurador o desensamblador.

0

En mi sistema (versión de gcc 4.2.4, Ubuntu) esto se ve muy bien en la disassmbley (insight) :

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

resultados de la disassmbley (Insight):

 
     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

Supongo que ese desensamblador muestra el desplazamiento del jmp y no su objetivo real. (la instrucción jmp toma una compensación relativa a eip cuando le das un operando inmediato de 32 bits). –

+0

¿Por qué lo adivinarías? ¿Hay alguna manera de probarlo? se ejecuta como una interfaz gráfica con GDB a continuación. –

+0

O podría ser que no hay reubicación. Sin embargo, si vuelca los códigos de operación con el conjunto, podrá ver el desplazamiento. – Mark

0

Es difícil determinar la dirección exacta en el momento de la compilación, ¿ha intentado utilizar las etiquetas? Es mucho más común usarlos con jmp.

ejemplo:

start: 
jmp exit 

exit: 
ret 
0

yo recomendaría usar un editor hexadecimal y simplemente cambiando el valor si es sólo una cosa de tiempo.

Cuestiones relacionadas