Resumen
El ransomware Play, también conocido como PlayCrypt, es un ransomware que apareció por primera vez en junio de 2022. El ransomware se ha dirigido a sectores como la sanidad y las telecomunicaciones, así como a un amplio abanico de regiones como Latinoamérica, Europa y Norteamérica. El ransomware Play es conocido por obtener acceso a las redes a través de cuentas válidas comprometidas o explotando vulnerabilidades específicas. Una vez dentro de la red, utiliza una gran cantidad de herramientas conocidas de post-explotación para continuar su ataque. Herramientas como Bloodhound, PsExec, Mimikatz y AdFind son algunos ejemplos de herramientas utilizadas anteriormente en ataques relacionados con este ransomware.
Otro aspecto del malware que lo hace famoso es la cantidad de técnicas antianálisis que utiliza en sus cargas útiles, como el abuso de SEH y el uso de ROP para redirigir el flujo de ejecución. Al emplear técnicas para ralentizar el proceso de ingeniería inversa, los actores de la amenaza dificultan la detección y prevención del malware.
En 2022, otros investigadores publicaron una excelente entrada en su blog en la que analizaban el malware en sí y algunas de las técnicas antianálisis que utilizaba. En esta entrada del blog, revisaremos las técnicas antianálisis empleadas por variantes recientes del ransomware Play, explicando cómo funcionan y también cómo podemos derrotar algunas de ellas utilizando scripts de automatización.
Programación orientada al retorno (ROP)
Cuando se realiza ingeniería inversa de Malware, asegurarse de que el flujo de control no está ofuscado es una de las primeras cosas que tenemos que hacer para entender correctamente el Malware.
Como intento de ofuscar su flujo de control, el ransomware Play utiliza a menudo una técnica ROP en su carga útil. Lo hace llamando a más de cien funciones que parchean el valor en la parte superior de la pila y, a continuación, redirige el flujo de ejecución a él. Antes de hablar de cómo lo hace exactamente el malware, echemos un vistazo a cómo funcionan en general las instrucciones de ensamblaje CALL y RET.
Cuando se produce una LLAMADA (una llamada cercana en este Caso para ser más específicos), el procesador empuja el valor del registro del puntero de instrucción (EIP en este Caso) en la pila y luego se bifurca a la dirección especificada por el operando objetivo de la llamada, que en este Caso es un desplazamiento relativo al puntero de instrucción. La dirección en el puntero de instrucción, más este desplazamiento, dará como resultado la dirección de la función a la que se va a llamar.
La instrucción RET, por otro lado, indica el final de una llamada de función. Esta instrucción es responsable de transferir el flujo de control del programa a la dirección en la parte superior de la pila. ¡Y sí, esta es exactamente la dirección inicialmente empujada por la instrucción de llamada!
Teniendo en cuenta lo mencionado, en un escenario ideal, la dirección resaltada en la imagen a continuación sería la siguiente instrucción que se ejecutará después de una llamada a la función objetivo (sub_42a4b9):
Lo que hace el malware para abusar del funcionamiento de las instrucciones CALL y RET puede observarse en la siguiente imagen:
Una vez que se llama a la función, la dirección 0x42a4b4 se envía a la pila, por lo que ESP apuntará a ella. A continuación, la función llamada añade el valor 0xA a la dirección apuntada por ESP y, a continuación, devuelve mediante la instrucción RET. Estas operaciones dan como resultado que el flujo de control se redirija a 0x42a4be (0x42a4b4 + 0xa) en lugar de 0x42a4b4.
Al aplicar esta técnica, el malware no sólo hace más complejo el análisis estático, ya que el flujo del programa no será trivial, sino que también puede dificultar la depuración, porque si se pasa por encima de este tipo de funciones pueden ocurrir muchas cosas antes de que se ejecute la "siguiente instrucción&