Mostrando postagens com marcador unpacking. Mostrar todas as postagens
Mostrando postagens com marcador unpacking. Mostrar todas as postagens

sábado, 16 de outubro de 2010

Another look at bradesco3.exe part2

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.