Recientemente tuve una tarea en el trabajo para comprender un programa binario de Linux. Sin embargo, el programa estaba en forma binaria.
Usé los comandos file
, strings
y objdump
para tener una ligera idea de lo que estaba haciendo y qué funciones estaba llamando.
Parece que el binario está compilado con información de depuración. ¿Qué más puedo aprender al respecto?
linux
reverse-engineering
Jeff Schaller
fuente
fuente
Respuestas:
Incluyendo los comandos que ya usó, haré todo lo posible para detallar lo que se puede hacer para realizar algunas operaciones forenses en un archivo ejecutable.
El
strings
comando humilde puede ser útil para visualizar mensajes de error de texto que dan pistas de las funcionalidades binarias. También es una forma simple de detectar binarios empaquetados como en el ejemplo (frecuente con binarios de malware):file
permite ver las propiedades ejecutables, a saber:En este ejemplo, "no despojado" denota que se compiló con información de depuración incluida.
objdump
produce la lista de desmontaje de un ejecutable:objdump
También permite conocer el compilador utilizado para compilar el ejecutable binario:objdump
también enumera las funciones externas dinámicas vinculadas en tiempo de ejecución:$ objdump -T exe_file
Puede ejecutar el binario en una VM solo creada y luego descartada solo con el propósito de ejecutar el binario. Uso
strace
,ltrace
,gdb
ysysdig
para aprender más sobre lo que está haciendo el binario en el nivel de las llamadas al sistema en tiempo de ejecución.También se puede depurar paso a paso con
gdb
.Para seguir / crear volcados de gran parte de la actividad de su sistema ejecutándolo, use sysdig como en:
Trataremos nuevamente con el análisis estático del archivo binario en el resto de esta respuesta.
ldd exe_file
enumera las bibliotecas que usa;size -A exe_file
readelf -x .rodata exe_file
enumera cadenas estáticasreadelf -h exe_file
obtiene información de encabezado ELFreadelf -s exe_file
muestra símbolosnm exe_file
enumera los símbolos de la tabla de objetos:Además de desmontar el binario con
objdump
, también se puede usar un descompilador.Para la descompilación, recientemente hice un desafío técnico en el que necesitaba descompilar dos pequeños binarios de Linux de 64 bits.
Traté de usar Boomerang y Snowman. El proyecto Boomerang parece abandonado, y no me impresionaron las limitaciones de ambos. Varias otras alternativas, ya sea de código abierto / freeware / old, incluida una reciente lanzada por Avast, solo descompilaron binarios de 32 bits.
Terminé probando la demo de Hopper en MacOS (también tiene una versión de Linux).
Hopper desmonta y descompila binarios de 32 o 64 bits para OS / X, Linux y Windows. Es capaz de abordar grandes binarios cuando tiene licencia.
También hace gráficos de flujo de las funciones de / estructura del programa y variables.
También se mantiene y actualiza activamente. Sin embargo es comercial.
Disfruté mucho usándolo y el resultado resultante que compró una licencia. La licencia es mucho más asequible que los rayos hexagonales por asomo.
En los comentarios de esta respuesta, @ d33tah y @Josh también mencionan como alternativas de código abierto radare2 más la interfaz gráfica correspondiente que Cutter es similar a Hopper en Linux, no puedo responder personalmente porque no los uso.
Además, como el binario de destino se compiló con información de depuración, puede recuperar el nombre original de las funciones y variables.
Más notablemente, nunca volverá a recibir los comentarios en el código fuente ya que no se compilan de ninguna manera en ejecutables binarios.
Mejorar la calidad de la fuente de salida y la comprensión del binario siempre implicará algo de tiempo y trabajo de detective. Los descompiladores solo hacen gran parte del trabajo.
Ejemplo de salida de Hopper sin información de depuración:
La interfaz gráfica de Hopper también es muy útil (varias funcionalidades expandidas al mismo tiempo en esta imagen):
vea también la pregunta relacionada ¿ Por qué son verdaderos y falsos tan grandes?
fuente
strace -f
rastrear hilos / procesos secundarios. Hay opciones para dividir la salida en archivos separados para cada PID, o puede simplemente/12345
enless
para buscar y resaltar las líneas que comienzan con el PID Múdese interesado. Si las cosas no están demasiado mezclados entre sí (por ejemplo, secuencia de comandos shell empezando otra procesos, no hilos concurrentes), esto puede ser utilizable. Pero sí, es extremadamente útil solo para ver qué archivos de configuración u otros está intentando leer una pieza confusa de software, al tratar de descubrir por qué no está contento con la forma en que lo instaló.radare2
a la lista.