Conocimientos necesarios y basicos para realizar ingeniería inversa


Que es la ingeniería inversa?

Según Wikipedia: La ingeniería inversa es el proceso llevado a cabo con el objetivo de obtener información o un diseño a partir de un producto, con el fin de determinar cuáles son sus componentes y de qué manera interactúan entre sí y cuál fue el proceso de fabricación.

Para qué sirve la ingeniería inversa?

Según Wikipedia:
• Generar diferentes alternativas: del punto de partida del proceso, principalmente código fuente, se generan representaciones gráficas lo que facilita su comprensión.
• Recuperar y/o actualizar la información perdida (cambios que no se documentaron en su momento): en la evolución del sistema se realizan cambios que no se suele actualizar en las representaciones de nivel de abstracción más alto, para lo cual se utiliza la recuperación de diseño.
• Detectar efectos laterales: los cambios que se puedan realizar en un sistema puede conducirnos a que surjan efectos no deseados, esta serie de anomalías puede ser detectados por la ingeniería inversa.
• Facilitar la reutilización: por medio de la ingeniería inversa se pueden detectar componentes de posible reutilización de sistemas existentes, pudiendo aumentar la productividad, reducir los costes y los riesgos de mantenimiento.
En resumen: la ingeniería inversa nos permite entender como se comunica un binario con el PC, una vez entendemos que hace el programa y como lo hace, las posibilidades son infinitas.

Una vez entendido que es la ingeniería inversa… ¿Qué se necesita para realizar ingeniería inversa a un binario?
Lo principal es entender como funciona un ordenador a bajo nivel, como maneja los registros la arquitectura sobre la que corre nuestra aplicación, la pila, etc.. Por tanto, al trabajar a bajo nivel, es necesario saber programar a bajo nivel, o al menos tener la capacidad de leer lenguaje ensamblador. En algunos casos como en aplicaciones desarrolladas en vb.net, c#, java y algunas mas es posible decompilar el binario y obtener el código en un lenguaje de alto nivel.

A continuación dejo unas cheatsheets con las instrucciones en ensamblador para arquitecturas Intel, ARM y MIPS.

ASM:

MIPS:

ARM:

Una vez tenemos claro el funcionamiento del pc y el funcionamiento de las diferentes instrucciones en bajo nivel. ¿Qué es lo siguiente?
El siguiente paso lógico es detectar en que lenguaje esta desarrollado el software, para esto podemos usar tolos como 4n4l detector, rdgmax packer detector, PEid…
Estas herramientas nos darán parte de la información que necesitamos.
En caso de que nos detecte que la aplicación esta desarrollada en lenguajes que sea posible decompilar, el proceso se facilita mucho.
Algunas herramientas útiles son de4dot, dnspy, ildasm, ilspy.


En caso contrario tenemos que tratar de recopilar toda la información que podamos, suponiendo que trabajemos sobre un binario PE (Windows) debemos saber en que lenguaje ha sido desarrollado, si se le han aplicado packers, si tiene medidas de protección frente a debuggers, que librerías y funciones importa, que secciones tiene el binario y como se organizan y por ultimo verificar que la IAT http://sandsprite.com/CodeStuff/Understanding_imports.html esta correcta, en caso contrario habrá que repararla para el correcto funcionamiento del ejecutable.
Todo lo mencionado en este punto se puede hacer con PEid, aunque personalmente prefiero usar rdgmax packer detector para identificar posibles packers y el lenguaje ya que es capaz de detectar de forma heurística firmas falsas, para el resto me gusta LordPE.

Por ultimo, queda hacer la parte mas interesante, el análisis dinamico o depurado. Esta fase consiste en ejecutar y experimentar con el binario, someterlo a estrés, modificar el flujo, en definitiva, hacer lo que desde un primer momento queríamos hacer, ya fuese cracking, exploiting, analizar malware o simplemente entender el funcionamiento para replicarlo o mejorarlo.
En esta sección destaca una aplicación por encima de todas las demás IDA de hexrays y no solo por su precio (en torno a 1500$), IDA nos permite realizar análisis estatico y dinamico para cualquier arquitectura sin necesidad de trabajar sobre la arquitectura objetivo, es el programa mas completo con diferencia.
Otras aplicaciones de debugging buenas para windows son ollydbg y windbg.
Para sistemas UNIX sin duda recomiendo radare2, no es fácil de usar pero tiene un potencial tremendo. Para empezar quizás sea mas apropiado usar gdb (gnu debugger) con el modulo peda.

0 comentarios: sobre Conocimientos necesarios y basicos para realizar ingeniería inversa

Publicar un comentario para Conocimientos necesarios y basicos para realizar ingeniería inversa

:a   :b   :c   :d   :e   :f   :g   :h   :i   :j   :k   :l   :m   :n   :o   :p   :q   :r   :s   :t

Calculando Tiempo
Alienspace Theme © Copyright 2017 By Proxor
Mi Ping en TotalPing.com FeedBurner FeedBurner FeedBurner FeedBurner FeedBurner