2010-11-30 5 views
6

Por lo tanto, estoy tratando de utilizar la utilidad objdump para crear un gráfico de flujo de control desde el ensamblado, y me está dando un problema. Básicamente, cada vez que ocurre una bifurcación y la dirección de destino es relativa, no estoy seguro de cómo saber dónde comienza el próximo bloque básico. No estoy seguro de ser claro, así que añadiré un ejemplo. Digamos que mi programa está pasando por la salida objdump y ha registrado la dirección inicial para el primer bloque básico. A continuación, acierta un comando de salto que usa el direccionamiento relativo para señalar la dirección adecuada a la que saltar. Sé que el final de mi primer bloqueo básico ocurre allí mismo, pero ¿cómo hago para obtener la dirección correcta para el comienzo del siguiente bloque básico? Cualquier orientación que alguien pueda proporcionar sería muy apreciada, soy un novato x86 en el mejor de los casos y he estado golpeando mi cabeza contra esto durante la última semana.Determinación de valores de registro cuando se utiliza objdump

Respuesta

4

Suponiendo que entiendo la pregunta, tal vez esto le ayudará a comenzar. Los saltos relativos están basados ​​en PC.

 
d: eb 04 jmp 13 

0xEB es el código de operación para un salto relativo basado en un 8 bits inmediato. La dirección de la instrucción está en la salida objdump, en este caso d o 0xD. es una instrucción de dos bytes (x86 es de longitud variable). le dice en la salida cuál es la dirección de destino, en este caso jmp 13. Por lo tanto, buscar la línea en la salida objdump que comienza con 13 y dos puntos es el comienzo de ese siguiente fragmento de código.

Para comprender cómo se calcula esa dirección. La pc está en 0xD cuando comienza a captar la instrucción, toma dos bytes, por lo que la pc está en 0xD + 2 = 0xF cuando está lista para ejecutar esta instrucción. El desplazamiento es 0x4, por lo que 0xF + ​​0x4 = 0x13 la dirección de destino.

 
20: 75 ed jne f 

Lo mismo ocurre con los retrocesos. pc más número de bytes = 0x20 + 2 = 0x22. 0xED es un número firmado y es negativo, por lo que el signo extiende 0xED a 0xFFFFFFF ... FFFFED, sin importar cuán grande sea tu dirección de registro. Agregue 0x22 + 0xFFFFFF ... FFFED y obtenga 0x0F la dirección de destino. También puede tomar 0xED, invertir y agregar 1 para anularlo. ~ 0xED = 0x12, 0x12 + 1 = 0x13. Entonces 0xED significa restar 0x13. 0x22-0x13 = 0x0F.

Aquí hay algunos más, en cada caso te da la dirección de destino que puedes buscar en la salida de objdump.

Para comprender cómo calcula ese valor. La misma historia, comience con el código de operación en 0x400A81, toma 6 bytes en este caso para la instrucción de longitud variable. Entonces, cuando está listo para ejecutar la PC, está a 0x400A81 + 6 = 0x400A87. El desplazamiento es 0x107 por lo que si se cumple la condición, la dirección de destino es 0x400A87 + 0x107 = 0x400B8E.

Tenga en cuenta que se copian de un programa más grande, no de un código secuencial, sino de una colección de ejemplos aislados.

 
    400a81: 0f 8f 07 01 00 00  jg  400b8e 
    400a8f: 0f 8f e6 00 00 00  jg  400b7b 
    400a9d: 0f 8f c5 00 00 00  jg  400b68 
    400aab: 0f 8f a4 00 00 00  jg  400b55 
    400ab9: 0f 8f 83 00 00 00  jg  400b42 
    401d76: 0f 8f 31 01 00 00  jg  401ead 
+0

Muchas gracias, esto aclara mucho mi problema. Básicamente, parece que simplemente no entiendo completamente el resultado objdump con el que estoy trabajando. ¿Alguien sabe de un buen recurso para aprender más sobre objdump output? – Sam

+0

Estoy leyendo a través de algunos resultados, y esto definitivamente aclara mucho. Sin embargo, aún no estoy seguro sobre una línea como esta: 4020a6: \t ff 25 4c 8f 21 00 jmpq * 0x218f4c (% rip) # 61aff8 <_fini + 0x207840> Básicamente parece que no entiendo completamente la salida objdump I estoy trabajando con. ¿Alguien sabe de un buen recurso para aprender más sobre objdump output? – Sam

+0

Yo diría que lo que está buscando es entender ensamblador x86 no necesariamente objdump. El código de operación para esa instrucción específica no me está saltando (sin juego de palabras), pero la sintaxis implica para mí que se trata de un registro basado en lo que significa que la dirección de destino tiene que ver con el contenido de% rip en tiempo de ejecución, un salto tabla básicamente.Y dado que no está ejecutando este código, sino que lo está inspeccionando, puede que no sea obvio cuál es el contenido de% rip, y como resultado, puede que no sepa cuál es la dirección de destino. –

Cuestiones relacionadas