Sumário
O ransomware Play, também conhecido como PlayCrypt, é um ransomware que surgiu pela primeira vez em junho de 2022. O ransomware tem como alvo setores como saúde e telecomunicações, bem como uma ampla variedade de regiões, como América Latina, Europa e América do Norte. O ransomware Play é conhecido por obter acesso às redes por meio de contas válidas comprometidas ou pela exploração de vulnerabilidades específicas. Uma vez dentro da rede, ele usa um grande conjunto de ferramentas conhecidas de pós-exploração para continuar seu ataque. Ferramentas como Bloodhound, PsExec, Mimikatz e AdFind são alguns exemplos de ferramentas usadas anteriormente em ataques envolvendo esse ransomware.
Outro aspecto do malware que o torna famoso é a quantidade de técnicas anti-análise que ele usa em suas cargas, como abusar do SEH e usar o ROP para redirecionar o fluxo de execução. Ao empregar técnicas para retardar o processo de engenharia reversa, os agentes de ameaças dificultam a detecção e a prevenção do malware.
Em 2022, outros pesquisadores publicaram uma excelente postagem no blog analisando o malware em si e algumas das técnicas anti-análise que ele usava. Nesta postagem do blog, revisaremos as técnicas de anti-análise empregadas pelas variantes recentes do ransomware Play, explicando como elas funcionam e também como podemos derrotar algumas delas usando scripts de automação.
Programação orientada ao retorno (ROP)
Ao fazer engenharia reversa de malware, garantir que o fluxo de controle não seja ofuscado é uma das primeiras coisas que precisamos fazer para entender adequadamente o malware.
Como uma tentativa de ofuscar seu fluxo de controle, o ransomware Play geralmente usa uma técnica de ROP em sua carga útil. Ele faz isso chamando mais de uma centena de funções que corrigem o valor no topo da pilha e, em seguida, redirecionam o fluxo de execução para ele. Antes de falarmos sobre como o malware faz exatamente isso, vamos dar uma olhada em como as instruções de montagem CALL e RET funcionam em geral.
Quando ocorre uma CHAMADA (neste caso, uma chamada próxima, para ser mais específica), o processador envia o valor do registrador do ponteiro de instrução (EIP neste caso) na pilha e, em seguida, ramifica para o endereço especificado pelo operando de destino da chamada, que nesse caso é um deslocamento em relação ao ponteiro de instrução. O endereço no ponteiro de instrução, mais esse deslocamento, resultará no endereço da função a ser chamada.
A instrução RET, por outro lado, indica o fim de uma chamada de função. Essa instrução é responsável por transferir o fluxo de controle do programa para o endereço no topo da pilha. E sim, esse é exatamente o endereço enviado inicialmente pela instrução de chamada!
Considerando o que foi mencionado, em um cenário ideal, o endereço destacado na imagem abaixo seria a próxima instrução a ser executada após uma chamada para a função de destino (sub_42a4b9):
O que o malware faz para abusar do funcionamento das instruções CALL e RET pode ser observado na imagem a seguir:
Depois que a função é chamada, o endereço 0x42a4b4 é colocado na pilha, então o ESP apontará para ele. A função chamada então adiciona o valor 0xA ao endereço apontado pelo ESP e retorna usando a instrução RET. Essas operações resultam no redirecionamento do fluxo de controle para 0x42a4be (0x42a4b4 + 0xa) em vez de 0x42a4b4.
Ao aplicar essa técnica, o malware torna não apenas a análise estática mais complexa, já que o fluxo do programa não será trivial, mas também pode dificultar a depuração, pois se você passar por cima desse tipo de função, muitas coisas podem acontecer antes que a “próxima instrução” regular seja executada.
Outra maneira pela qual o malware implementa essa técnica de ROP é usando a abordagem mostrada no código abaixo, que é muito comum em códigos de shell. O deslocamento especificado pelo operando de destino da instrução de chamada é zero, resultando no endereço da função a ser chamada exatamente como o endereço da próxima instrução. Esse endereço é então colocado no topo da pilha e o resto das operações são exatamente iguais às do exemplo anterior:
Para ajudar na análise do ransomware Play, o Netskope Threat Labs desenvolveu um script, com base no trabalho anterior de outros pesquisadores, para corrigir a ofuscação ROP empregada.
O script procura possíveis candidatos ao ROP, coleta o deslocamento a ser adicionado ao topo da pilha e corrige os endereços que executam as chamadas de ROP com um salto absoluto, em que o alvo é o endereço de transferência modificado calculado em tempo de execução.
Veja a seguir um exemplo de como seria a carga útil do malware antes e depois da execução do script:
Antes:
Depois de: