Español | English
rss facebook linkedin Twitter

Análisis de binarios desde un lenguaje de alto nivel

Por norma general el lenguaje utilizado para el análisis de un programa ajeno compilado bajo windows ha sido el ensamblador, ya que partimos de que no disponemos del código fuente, pero hoy día tenemos herramientas muy potentes que nos permiten utilizar lenguajes de más alto nivel para realizar ciertas tareas.

Si tienes práctica en este tema, este post no te dirá nada nuevo, pero pretende motivar a aquellos que tienen curiosidad pero no se atreven por miedo al ensamblador. Que sepan que existen ayudas muy potentes a un nivel más alto.

A la hora de realizar un análisis estático, la herramienta por excelencia es IDA, que junto con su añadido Hex-rays nos puede proporcionar un desensamblado traducido a un lenguaje parecido a C, lo cual puede suponer un ahorro de tiempo bastante importante para alguien que quiera aplicar ingeniería inversa a un fichero.

Si lo que se pretende realizar en un análisis dinámico o en tiempo de ejecución, además de IDA se puede utilizar OllyDbg, un depurador gratuito y muy práctico, pero por ahora tan solo para ring3. El creador del mismo está trabajando en la versión 2.0 del mismo, que será capaz de trabajar en ring0.
También disponemos de Immunity Debugger, que viene a ser el OllyDbg con soporte para python, o podemos utilizar Windbg, un depurador que te permitirá hacer lo que quieras, siempre que sepas controlarlo.


Tenemos unas alternativas muy interesantes que nos permitirán analizar los ficheros desde python. Por un lado disponemos de pefile de mano de Ero Carrera (al que tuve el gusto de conocer en la última edición de la BlackHat: ¡¡un saludo!!) y pydbg dentro de la suite PaiMei que nos proporciona Pedram Amini. Estos aportes nos permite analizar un fichero ejecutable e incluso depurarlo desde python, de una manera muy práctica.

Al utilizar un lenguaje de programación interpretado como python, podremos utilizar scripts que automaticen la tarea o la consola para ir depurando y viendo como se encuentra nuestro pequeñín en cada momento.

Por ejemplo, si queremos saber el punto de entrada del programa (Entry Point) en memoria, con pefile podemos obtenerla de una manera muy sencilla con un script como el que sigue:

import sys
import pefile
fichero = sys.argv[1]
pe = pefile.PE(fichero)
ep = pe.OPTIONAL_HEADER.AddressOfEntryPoint
imagebase = pe.OPTIONAL_HEADER.ImageBase
ep2 = ep + imagebase
print hex(ep2)

./ep.py arana.exe
0x401000L

Vemos que el resultado coincide con el EP que nos da, por ejemplo, OllyDbg:




Por supuesto, ningún lenguaje de alto nivel va a evitar que se necesite una sólida base en ensamblador y la estructura PE, pero esto no es problema, ya que el reverser por norma general tiende a ser más masoca que vago ;)

Mikel Gastesi
S21sec labs


(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login