Introdução
In my last post I analyzed bradesco3.exe focused on screen captures and the trojan functionality, on this post I will describe how to unpack this sample, actually how to manually unpack PECompact.
By decision of malwares-br group (4.5 vs 1.5), this post is in Portuguese (pt_BR). I don't see any issue since unpack PECompact tutorials are available in English. In any way, if you have any doubts, do not hesitate to contact me.
Como já brincamos com o trojan no último post e o Rodrigo também já submeteu o trojan para análise comportamental ao anubis, resta agora fazer a análise do código. Embora após executar o trojan várias vezes, tivemos o mesmo resultado (mesma URL e parâmetros), é interessante análisar o código para confirmar que a URL não é modificada, ou qualquer outra informação como descobrir o autor ou até mesmo para se divertir.
Este post está dividido em cinco partes:
1) Identificando Packer
2) Encontrando OEP
3) Dump do processo e recuperando IAT
4) Resultados do VirusTotal
5) Conclusões
Identificando Packer
Antes de iniciar a análise de código eu costumo verificar o md5hash do arquivo, verificar se existe alguma string disponível interessante e analisar o mesmo com o o PEiD.
Para analisar as strings, utilizei o BinText e a mensagem inicial já indica que o arquivo pode estar compactado.
No início das strings é possível identificar as strings "PEC2" e "PECompact2", provavelmente este arquivo foi compacto com o packer PECompact versão 2. Além destas, nenhuma outra string interessante, somente as DLLs e funções utilizadas pelo trojan.
O melhor "identificador" de arquivos PE que conheço é o PEiD, ele consegue detectar vários packers e linguagens de programação. Portanto, para melhorar a tese de que este arquivo foi compactado com o PECompact, utilizei o PEiD. Note que pode acontecer do autor inserir algumas strings que aparentemente sejam de algum packer e na verdade não são. Por exemplo, neste caso caso o PEiD identifique o arquivo como sendo compactado pelo PECompact a partir das strings "PEC2" e "PECompact2", o autor poderia inserir essas strings somente para dificultar a análise, fazendo com o que o analista acredite que o arquivo foi compactado com o PECompact onde na verdade não foi. Isso pode dificultar ferramentas automatizadas de unpacking.
Já sabemos que o arquivo está provavelmente compactado com o PECompact, então agora é hora de análisar o código e possivelmente descompactar o mesmo. Para isso, irei utilizar o OllyDBG.
Encontrando o OEP
Basicamente, descompactar ou "desempacotar" o arquivo consiste em encontrar o OEP (Original Entry Point) do programa, ou seja, o início do programa. Note que a primeira instrução salva o endereço 0x00525c48 no EAX.
Verificando este endereço foi possível notar um "JMP EAX" um pouco abaixo, no endereço 0x00525D0A.
Por quê o interesse pelo "JMP EAX"? Em alguns packers, e é o caso do PECompact, eles salvam o OEP no EAX e quando terminam de descompactar o arquivo, retornam para o OEP para que o programa seja executado normalmente. Portanto, conseguindo acessar o "JMP EAX", provavelmente consigamos acessar o OEP e descompactar (ou fazer um "dump") do arquivo. Portanto, o objetivo é colocar um breakpoint no endereço 0x00525D0A para que possamos
acessar o OEP.
Entretando, como este endereço está fora da seção de códigos (> 0x00521000) então é necessário um hardware breakpoint. Embora o hardware breakpoint possa funcionar para o que queremos que é acessar o OEP, quando fazemos o JMP para o EAX o código ainda não fica legível, mesmo após o Ctrl+A (Analyse code).
Então, uma maneira mais "elegante" é provocar um loop infinito no programa, adicionar o processo em execução ao debugger e alterar a instrução do loop infinito para "JMP EAX" e aí sim acessar o OEP. Para isso, basta alterar 0x00525D0A de "JMP EAX" para "EB FE" ou "JMP 0x00525D0A, "EB FE" é o opcode para JMP $EIP, executar um JMP no atual endereço do EIP, ou seja, do atual endereço de memória, causando um loop infinito.
Após salvar a alteração em um outro arquivo "bradesco3_novo.exe" e executá-lo, é necessário anexar o processo ao Olly
Após anexar o processo, executar (F9) e pausar (F12), irá para no endereço 0x00525D0A.
Alterar para "JMP EAX", basta pressionar a tecla de espaço para fazer a alteração.
E então executar a instrução via F7.
Finalmente chegamos ao OEP, note que as primeiras instruções "PUSH EBP; MOV EBP, ESP" são comumente utilizadas no início do programa ou de qualquer função para salvar o endereço de retorno, portanto este é provavelmente o início "real" do programa.
Dump do processo e recuperando IAT
Agora é necessário fazer o dump do processo, para isso vou utilizar o OllyDump, plugin para o OllyDBG. Das opções padrões, retire a opção "Rebuild Import", por alguma razão essa opção nem sempre funciona e é necessário importar as DLLs manualmente.
Salvei o novo arquivo como "bradesco3_novo_dumped.exe", observe que ele não é executável pois está faltando as DLLs.
Para importar as DLLs, ou recuperar a IAT (Import Address Table) vamos utilizar o ImpREC, porém é necessário descobrir algumas informações que faltam via Olly:
RVA (Relative Virtual Address) - primeiro endereço de memória da IAT
Size - tamanho da IAT, ou seja, (último endereço+0x04) - (primeiro endereço) = size
OEP - já descobrimos 0x00472864
Ainda no Olly, com o "bradesco3_novo.exe", procurar por "FF 25" (Ctrl+B) ou "JMP DWORD PTR DS:" comumente utilizado quando é necessário acessar uma função de uma DLL, a partir daí é possível procurar na memória os endereços da IAT. Basta selecionar a instrução e seguir a instrução do dump de memória (Follow in Dump -> Memory Address).
Na verdade o útimo endereço de memória da tabela é o 0x47AE3C mas como temos que calcular o tamanho, teriamos que adicionar +0x04, ou seja, 0x47AE3C + 0x04 = 0x47AE40. Então, o tamanho da tabela é 0x0047AE3C - 0x0047A140 = CFC. Agora basta utilizar o ImpREC para salvar a IAT no arquivo "bradesco3_novo_dumped.exe".
Clicar em "Fix Dump" e selecionar o arquivo bradesco3_novo_dumped.exe, o novo arquivo com o IAT e pronto para ser executado será salvo com o nome do arquivo "+ _", neste caso "bradesco3_novo_dumped_.exe".
Resultados do VirusTotal
O arquivo descompactado é consideravelmente bem maior que o compactado.
O arquivo descompactado tem menor detecção do que o compactado 8/43, enquanto o compactado atualmente possui 24/42.
Conclusão
Embora o malware esteja compactado, o mesmo foi compactado com um packer conhecido o que não dificultou descompactar o mesmo. É interessante verificar que o arquivo descompactado tenha menor detecção por parte dos softwares de antí-virus, mesmo que alguns deles provavelmente possuem programas automáticos para descompactar arquivos, o hash ou característica dos mesmos não foram adicionado a base de assinaturas.
No próximo e último post sobre o "bradesco3.exe" irei finalmente analisá-lo.
Obrigado pela sua atenção.
Pedro Drimel Neto.
Nenhum comentário:
Postar um comentário