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
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
- 1. Controlar el rastreador cuando se utiliza Twinx
- 2. error cuando se utiliza mutex
- 3. ClassCastException cuando se utiliza LinearLayout.LayoutParams
- 4. de error cuando se utiliza [openActiveSessionWithPublishPermissions FBSession: ..]
- 5. escape coma cuando se utiliza String.split
- 6. Android: transacciones SQLite cuando se utiliza ContentResolver
- 7. Hibernate genera valores de id negativos cuando se utiliza una secuencia
- 8. ¿Para qué se utiliza .data.rel.ro?
- 9. consulta lenta cuando se utiliza ORDER BY
- 10. HTTPS para funcionar cuando se utiliza basicHttpBinding
- 11. Perder alcance cuando se utiliza ng-incluir
- 12. HttpContext.Current es nulo cuando se utiliza async
- 13. ActivationException cuando se utiliza en ToFactory Ninject
- 14. referencia indefinida cuando se utiliza extern
- 15. ReplacableToken_ cuando se utiliza la transformación web.config?
- 16. .htaccess se ignora cuando se utiliza un URI con alias
- 17. Claves/valores de registro ocultos
- 18. SQL - Múltiples valores separados por comas cuando se utiliza GROUP BY
- 19. Mathematica: Extraer valor numérico cuando se utiliza Resolver
- 20. Evitar la repetición de código cuando se utiliza LINQ
- 21. líneas múltiples cuando se utiliza el método de jQuery .html
- 22. Python: conseguir fallo de segmentación cuando se utiliza compilar/eval
- 23. UnicodeEncodeError cuando se utiliza la función de compilación
- 24. especificar el nombre de un hilo cuando se utiliza Task.StartNew
- 25. NumPy: array problema de asignación cuando se utiliza dtype encargo
- 26. Interpolación de cadenas cuando no se utiliza una cadena literal
- 27. cómo pasar parámetros de una función cuando se utiliza timeit.Timer()
- 28. vim congelado cuando se utiliza la función de autocompletar
- 29. Detectando cuando se utiliza la imagen de error en PictureBox
- 30. error de conexión PDO cuando se utiliza Symfony y MAMP
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
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
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. –