Fuente de la imagen: pixabay.com

Python es un lenguaje de alto nivel. Aunque muchos de ustedes piensen que es un lenguaje de programación, no lo es. Es un lenguaje de secuencias de comandos. No se acerca al código de máquina o al lenguaje de máquina. Entonces, ¿qué es lo que hace que Python sea tan interesante? Si tiene alguna experiencia en pentesting o ha tenido una conversación con muchos expertos en seguridad web o analizadores de malware, siempre sugerirían python como su idioma principal para desarrollar malwares o exploits.

Si bien algunas personas pueden preferir C, C ++ o perl, personalmente votaría por Python. La razón es que no solo es útil como herramienta para escribir un programa, también es útil para romperlo.

¿Qué es la ingeniería inversa?

La ingeniería inversa es un concepto muy amplio. En realidad, no se puede definir con sintaxis simples. El concepto adecuado de ingeniería inversa es dividir un código en partes más simples, comprenderlo, modificarlo y mejorarlo según nuestro propio propósito y luego volver a ensamblarlo para adaptarlo a nuestras necesidades. Para hacerlo un poco más simple, déjame darte algunos ejemplos comunes extremos.

Tomemos un ejemplo de un teléfono celular Android. Los fabricantes crean un Rom de acciones y lo venden a sus consumidores. Pero la mayoría de las veces, contiene gran cantidad de bloatware y se vuelve lento. Por lo tanto, hay personas en sitios web como XDA y Androidcentral que realizan ingeniería inversa en la ROM, la mejoran y la hacen a prueba de retraso. Un ejemplo práctico sería CyanogenMod Rom.

Pero esto fue solo un ejemplo para hacerte entender lo que es. La ingeniería inversa tiene el mismo concepto, pero es demasiado complicado que solo modificar una ROM.

Compilación y python

Si tiene experiencia en Python, entonces sabe que al escribir un script de Python, ya sea un virus, una carga útil, un troyano o lo que sea que sea el archivo, solo funcionará en las computadoras en las que está instalado Python. Entonces, digamos, he escrito un excelente troyano de computadora que puede omitir cualquier antivirus, y empiezo a implementarlo en un sistema de Windows, pero si el sistema de Windows no tiene instalado el intérprete de Python, entonces no funcionará. Por lo tanto, uno necesita compilar cada archivo del script de Python escrito en un ejecutable y luego implementarlo en el sistema de Windows.

Ingeniería inversa de ejecutables de Windows

Ahora ya sabes, que necesitamos compilar scripts de Python para que se ejecuten en Windows, también debes saber que debe haber un compilador, que convierta los scripts de Python en un ejecutable. Sí hay. Se llama Py2exe. Py2exe es un instalador simple que convierte los scripts de Python en programas de Windows independientes. Ahora, también hay otra herramienta que convierte los ejecutables de Windows escritos en python de nuevo a scripts de python. Su nombre es Pyinstaller Exe Rebuilder.

Pyinstaller exe rebuilder es una herramienta para recompilar / aplicar ingeniería inversa a los ejecutables generados por pyinstaller sin tener acceso al código fuente. Cuando ejecutas el EXE, no está empaquetado en la memoria. Esto incluye los archivos .pyc (código de Python que se convierte en bytecode). Básicamente, lo que hacen las herramientas como pyinstaller y py2exe es empaquetar las bibliotecas y las dependencias juntas para que pueda ejecutar el EXE 'independiente' sin tener que descargarlas o preparar la máquina con un intérprete de Python.

También hay otro kit de herramientas que lo lleva muy cerca del código fuente. El nombre es PyRetic, que significa bytecode de Python ofuscado por ingeniería inversa. Este kit de herramientas le permite llevar un objeto en memoria al código fuente, sin necesidad de acceder al código de bytes directamente en el disco. Esto puede ser útil si las aplicaciones pyc en el disco se ofuscan de una de las muchas maneras.

Cursos recomendados

  • Entrenamiento en Java Hibernate
  • Capacitación de certificación en línea en Java Spring
  • Programa de WordPress
  • Certificación de Formación en Ruby

Ingeniería inversa El camino difícil

Ahora, la parte anterior es fácil de entender y prácticamente lo hace cuando conoce al menos los conocimientos básicos de Python. Pero ese no es siempre el caso. A veces, no tienes ninguna documentación o comentario en el script de Python, y también hay muchos archivos para que puedas entenderlos por ti mismo. Ahora hay un libro increíble sobre esta parte, pero no me concentraré mucho en eso.

El nombre del libro es "Trabajando eficazmente con código heredado". El libro es independiente de python o de cualquier otro idioma, y ​​le dará una idea para la ingeniería inversa en casi cualquier idioma. El enfoque clave, cuando se trata de comprender un fragmento de código, es la razón por la que desea comprenderlo.

Ya sea que desee realizar ingeniería inversa del código para modificarlo o portarlo, el enfoque para ambos sería bastante diferente. Por lo tanto, instrumentar el código heredado, con baterías y andamiaje de pruebas y rastreo / registro es el camino crucial en el largo y difícil trabajo para comprender y modificar de manera segura y responsable.

Herramientas de ingeniería inversa

Ahora hay otro método para hacerlo un poco más fácil que puede seguir y seguir los pasos anteriores. Hay un sitio llamado como Epydoc. En este sitio, verificará el código y creará documentación para ello. El resultado no será tan bueno como la documentación original, pero al menos le dará una idea de cómo funciona exactamente. Y al hacer esto, puede comenzar a escribir su propia documentación, y después de escribir parcialmente el documento, puede generar nuevamente el documento parcial restante del sitio para la parte restante.

Incluso puede usar la herramienta IDE para analizar el código. Por lo general, esto le proporciona la finalización del código, pero lo más importante en este caso, es que puede hacer clic y hacer clic en una variable para ver de dónde proviene. Esto realmente acelera las cosas cuando quieres entender el código de otras personas.

Además, debe aprender un depurador. Tendrá que, en partes complicadas del código, pasar por ellos en un depurador para ver qué hace realmente el código. Python pdb funciona, pero muchos IDE tienen depuradores integrados, lo que facilita la depuración. PyReverse de Logilab y PyNSource de Andy Bulka también son útiles para la generación de diagramas UML.

Hay un proceso para producir el modelo de clase UML a partir de una entrada dada de código fuente. Con esto, puede revertir una instantánea de su base de código a clases UML y formar un diagrama de clase más adelante. Al llevar el contenido del código al modelo visual UML, esto ayuda a los programadores o ingenieros de software a revisar una implementación, identificar posibles errores o deficiencias y buscar posibles mejoras.

Además de esto, los desarrolladores pueden revertir una biblioteca de códigos como clases UML y construir modelos con ellos, como revertir un marco de colección genérico y desarrollar su propio marco extendiendo el genérico. En este capítulo, veremos el reverso instantáneo de Python.

Objetos y cebadores

Para comprender completamente el funcionamiento interno de Python, primero debe familiarizarse con cómo Python compila y ejecuta el código. Cuando el código se compila en Python, el resultado es un objeto de código. Un objeto de código es inmutable y contiene toda la información que necesita el intérprete para ejecutar el código. Una instrucción de código de byte se representa como un valor de código de operación de un byte seguido de argumentos cuando es necesario. Se hace referencia a los datos utilizando un índice en una de las otras propiedades del objeto de código.

Una cadena de código de bytes se ve así:

\ x64 \ x02 \ x64 \ x08 \ x66 \ x02

El código de byte de Python opera en una pila de elementos. Una extensión más emprendedora sería intentar descompilar el código de byte en código fuente legible de Python, completo con los nombres de objetos y funciones. El código Python se puede distribuir en forma binaria utilizando el módulo marshal. Este módulo proporciona la capacidad de serializar y deserializar objetos de código utilizando las funciones de almacenar y cargar.

El formato binario más comúnmente encontrado es un archivo compilado de Python (.pyc) que contiene un número mágico, una marca de tiempo y un objeto serializado. El intérprete de Python suele producir este tipo de archivo como caché del objeto compilado para evitar tener que analizar el origen varias veces. Estas técnicas se basan en la facilidad de acceso al código de bytes y a la información de tipo.

Con el código de bytes de un objeto de código, la lógica del código puede modificarse o incluso reemplazarse por completo. La extracción de información de tipo puede ayudar en la comprensión del diseño del programa y la identificación de funciones y propósitos de objeto.

La ofuscación y el endurecimiento del código de bytes de la aplicación siempre será una carrera entre los implementadores y aquellos que buscan romperlo. Para intentar defenderse de la recuperación del código de bytes, el primer paso lógico es hacia una solución de traducción en tiempo de ejecución.

Las propiedades de un objeto de código pueden almacenarse en cualquier formato firmado, cifrado u ofuscado que se ofusque o traduzca durante el tiempo de ejecución y se use para crear una instancia de un nuevo objeto. Incluso se podría cambiar la forma en que las búsquedas de nombres de variables funcionan dentro del intérprete para ofuscar la información de nombres. Al agregar una capa de traducción entre la búsqueda de los nombres reales y los nombres dentro del código fuente, un desarrollador podría mitigar aún más los intentos de reversión.

Conclusión

Ahora, después de leer todo esto, puede sentir la necesidad de experimentar algunos de los peajes que existen. Entonces, aquí hay algunas herramientas que pueden ayudarlo a realizar ingeniería inversa en su código python:

  1. Paimei
  1. Sulley
  1. La colección Carrera
  1. PyEmu
  1. IDAPython
  1. ImmDbg

Todos estos son excelentes piezas de código, pero lo que realmente los hace sobresalientes es cuando se usan juntos. Tenga en cuenta que esta no es una lista completa, solo las que más uso y creo que muestran cómo la flexibilidad de Python puede hacer que una tarea tan compleja como la ingeniería inversa sea manejable.

Artículos recomendados

Aquí hay algunos artículos que lo ayudarán a obtener más detalles sobre la Ingeniería inversa con Python, así que simplemente vaya al enlace.

  1. Las 25 preguntas y respuestas más sorprendentes de la entrevista de Python
  2. Comience con Python y Django para el desarrollo web
  3. ¿Cuáles son los beneficios y las limitaciones de usar Python?
  4. Carrera profesional en Python
  5. Herramientas de ingeniería inversa