Jump to content
Leandro Fróes

AnalyseMe - Nível 04

Recommended Posts

Boooa noite pessoal,

aqui está mais um dos nossos desafios, espero que curtam e aproveitem o fim de semana debuggando bastante 😆.

Queria agradecer de novo por todas as análises que vocês estão fazendo e lembrar que não importa se alguém já fez, mostre pra gente seu ponto de vista também!! 😉

 

AnalyseMe-04.exe

Share this post


Link to post
Share on other sites

Bom dia Leandro, blz?

Segue minha análise abaixo.

Spoiler

Tipo de arquivo: PE EXE
Compilador/linguagem: Visual Studio C/C++
Protector/packer: Nenhum
SHA-256: 2f5c42fcc1707f599ef43d6c0787db2cb51527a1180f8e1d7a850d6cbd21fa6d
Strings interessantes: "C:\\windows\\System32\\Drivers\\Vmmouse.sys" ofuscada em 0x402098, "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0" ofuscada em 0x4020C0, "\\payload.exe" ofuscada em 0x4020F8, "http://2016.eicar.org/download/eicar.com" ofuscada em 0x402108 e "C:\\Program Files\\Oracle\\VirtualBox Guest Additions\\DIFxAPI.dll" ofuscada em 0x402058;
Funções locais maliciosas: 401190;
Chamadas à API do Windows e outras bibliotecas: IsDebuggerPresent, CreateFileA, InternetOpenA, InternetOpenUrlA, InternetReadFile, CreateFileA,  WriteFile, GetTempPathA, lstrcatA;
Atividades de rede: Baixa o arquivo em "http://2016.eicar.org/download/eicar.com" usando o user-agent do Firefox;
O que o binário faz em linhas gerais: Primeiro verifica o retorno da função IsDebuggerPresent para determinar se continua rodando ou encerra (notei que do jeito que está, o programa roda apenas quando estiver em um debugger e não o contrário). Em seguida utiliza a função CreateFileA com dwDesiredAccess = GENERIC_READ (0x80000000) para verificar se um dos caminhos ("C:\\windows\\System32\\Drivers\\Vmmouse.sys" ou "C:\\Program Files\\Oracle\\VirtualBox Guest Additions\\DIFxAPI.dll") existem e encerra o programa caso encontre algum (verifica se está rodando em uma VM). Por fim, o programa baixa o arquivo http://2016.eicar.org/download/eicar.com" utilizando o user-agent do Firefox e salva na pasta temporária do usuário com o nome "payload.exe";
O que foi modificado no sistema: O arquivo payload.exe pode ser criado dentro da pasta temporária do usuário (caso o sistema satisfaça as verificações do exe);

Vale lembrar que todas as strings utilizadas acima estão ofuscadas no código, para decifrá-las é necessário fazer um XOR dos bytes com a chave [0x01 0x02, 0x03, 0x04, 0x00]. Código python: https://www.mentebinaria.com.br/forums/topic/469-analyseme-n%C3%ADvel-03/?do=findComment&comment=1845

 

Se tiver algo faltando é só falar! Parabe´ns pelos desafios e boas festas, abs!

Share this post


Link to post
Share on other sites

Olá pessoal, tudo bem?

Primeira postagem no fórum. Espero não passar muita vergonha. Tenho acompanhado os vídeos só mais recentemente e fiz os AnalyseMe até então...ontem eu cheguei no 4. Abaixo seguem minhas observações.

Spoiler

Bom...minha análise foi bem parecida com a do @rcimatti. Vou me concentrar nas diferenças que notei:

A parte do ofuscamento das strings ocorre na maior parte do tempo diretamente no código, mas no 401110 tem uma função que decodifica string que é usada apenas algumas vezes(Chamadas nos pontos 40127D , 401391 e 4013F1). Notaram isso?

Não tinha entendio o uso da CreateFileA para verificar os arquivos. Entendi que era mais ou menos isso que estava acontecendo mas só entendi mesmo vendo a explicação do rci e voltando no código.

No mais minha análise foi bem parecida.

Estou com um problema para o qual queria a ajuda de vocês. Tentei montar um script em php para decodificar as strings. Fiz nesse link: https://phreyzer.000webhostapp.com/temp/

Ele está funcional, mas para ficar funcional eu tive que modificar o padrão de repetição da chave para dar certo. Ela começa om 0x01, 0x02, 0x3, 0x4 e depois repete o padrão 0x00, 0x02, 0x03, 0x04. (pula o 0x01)

Mesmo eu vendo que o registrador no disassemble varia de 0 a 4, tenho que pular o 0x01 para dar certo da decoficação no php e não sei  porque isso dá certo. Alguém sabe dizer? Testem a string B8_Trmdvao#Binfw\MqecnfXVkqpucoFoz#Cugpp Cg`ivjknq_@ID{EPK-`ln por exemplo.

Ele faz parte a parte.....vou printar o comecinho:

------------------- 
Letra:B
Valor binário da letra:1000010 -- Hexa: 42
Valor do xor com 1 (1):1000011
Letra decodificada:C
-Resumo--
1000010 -> Caracter em binario. Caractere:B 
1 -> Chave em binário. 
1000011 -> Resultado depois do XOR. Caractere decodificado: C 

------------------- 
Letra:8
Valor binário da letra:111000 -- Hexa: 38
Valor do xor com 2 (10):111010
Letra decodificada::
-Resumo--
111000 -> Caracter em binario. Caractere:8 
10 -> Chave em binário. 
111010 -> Resultado depois do XOR. Caractere decodificado: : 

------------------- 
Letra:_
Valor binário da letra:1011111 -- Hexa: 5f
Valor do xor com 3 (11):1011100
Letra decodificada:\
-Resumo--
1011111 -> Caracter em binario. Caractere:_ 
11 -> Chave em binário. 
1011100 -> Resultado depois do XOR. Caractere decodificado: \ 

------------------- 
Letra:T
Valor binário da letra:1010100 -- Hexa: 54
Valor do xor com 4 (100):1010000
Letra decodificada:P
-Resumo--
1010100 -> Caracter em binario. Caractere:T 
100 -> Chave em binário. 
1010000 -> Resultado depois do XOR. Caractere decodificado: P 

------------------- 
Letra:r
Valor binário da letra:1110010 -- Hexa: 72
Valor do xor com 0 (0):1110010
Letra decodificada:r
-Resumo--
1110010 -> Caracter em binario. Caractere:r 
0 -> Chave em binário. 
1110010 -> Resultado depois do XOR. Caractere decodificado: r 

------------------- 
Letra:m
Valor binário da letra:1101101 -- Hexa: 6d
Valor do xor com 2 (10):1101111
Letra decodificada:o
-Resumo--
1101101 -> Caracter em binario. Caractere:m 
10 -> Chave em binário. 
1101111 -> Resultado depois do XOR. Caractere decodificado: o 

------------------- 

(.....)

No final da página ele printa a string decodificada: C:\Program Files\Oracle\VirtualBox Guest Additions\DIFxAPI.dll

Porque dá certo dese jeito? Alguém sabe?

 

 

No mais...parabéns pelo site, pelos vídeos, pelo material...bem legal. Vou tentar acompanhar e colaborar no que puder.

  • Curtir 1

Share this post


Link to post
Share on other sites
Spoiler

Tipo de arquivo: PE EXE
Compilador/linguagem: Microsoft Visual C/C++
Protector/packer: Nenhum
SHA-256: 2f5c42fcc1707f599ef43d6c0787db2cb51527a1180f8e1d7a850d6cbd21fa6d
Strings interessantes: C:\Users\IEUser\Desktop\App4\Release\App4.pdb,
            Strings cifradas via XOR:
                B8_Trmdvao#Binfw\MqecnfXVkqpucoFoz#Cugpp Cg`ivjknq_@ID{EPK-`ln == C:\Program Files\Oracle\VirtualBox Guest Additions\DIFxAPI.dll
                B8_silgkwq_Wyqwam11XDpjreppXVonkuqf*s{p                == C:\windows\System32\Drivers\Vmmouse.sys
                Lmymlnb+4,3$(alipcwmbnf? OPME"5*09#Silgkwq#JT"6*19#WV3*        == Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
                ]rb}lmb`.g{a                                == \payload.exe
                ivwt:-,6035*ek`er,lvg-gkwlokaf,aiabv.ali               == http://2016.eicar.org/download/eicar.com

Funções locais maliciosas: 401190 (Checa se esta sendo debugado, usando a call IsDebuggerPresent, se nao estiver carrega strings codificadas para checagem de ambiente virtualizado, Apos checagem, faz request para download do sample eicar)

Chamadas à API do Windows e outras bibliotecas: wininet.dll_InternetReadFile, wininet.dll_InternetOpenUrlA, wininet.dll_InternetOpenUrlA, wininet.dll_InternetOpenA,
                        KERNEL32.dll_ExitProcess, KERNEL32.dll_GetProcessHeap,KERNEL32.dll_HeapAlloc, KERNEL32.dll_GetCommandLineA, KERNEL32.dll_WriteFile,
                        KERNEL32.dll_GetTempPathA, KERNEL32.dll_CloseHandle, KERNEL32.dll_GetModuleHandleA, KERNEL32.dll_lstrcatA, KERNEL32.dll_GetStartupInfoA, KERNEL32.dll_IsDebuggerPresent

Atividades de rede: Monta uma request usando o user-agent do firefox (Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)), entao faz o download do sample malicioso eicar, em  http://2016.eicar.org/download/eicar.com

O que o binário faz em linhas gerais: Detecta se esta em um ambiente virtualizado buscando arquivos que indicam o uso da Virtualbox ou VMware, caso nao esteja em uma maquina virtual, o sample faz uma request para realizar o download do
                      sample eicar e age como um dropper, salvando o arquivo com o nome payload.exe nos arquivos temporarios. Todas as strings estao codificadas usando XOR, mas de uma maneira nao tao clara.
                      Ele mantem uma lista de chaves na qual eh calculada baseada no indice do contador da string. algoritmo em python para decifrar:

 


import sys


def decrypt(s):
    out = ""
    keys = [0x02, 0x03, 0x04, 0x00]
    # Depois do calculo do primeiro valor, o 0x01 sempre aparece apenas uma vez
    # Dado o indice 0 no inicio do loop, ficou mais simples contar as chaves mais repetidas na lista
    out += chr(ord(s[0]) ^ 0x01)
    s = s[1:]

    for i,c in enumerate(s):    
        k = keys[i % len(keys)]
        out += chr(ord(c) ^ k)

    return out




print(decrypt(sys.argv[1]))



           

O que foi modificado no sistema: Sample eicar salvo nos arquivos temporarios como payload.exe

 

  • Curtir 2

Share this post


Link to post
Share on other sites

@Wilson Junior pra ser sincero o algoritmo do XOR foi com um errinho... a chave não era pra mudar não, mas realmente muda. De qualquer forma, tá lá no binário e foi bom que foi uma simulação do que seria um erro real de um criador de malware hahaha 🤪

Uma implementação simples seria fazer o XOR do primeiro caractere com 1 mesmo e depois usar a chave {0, 2, 3, 4} começando da segunda posição:

Spoiler

#include <stdio.h>

int main(void) {
	char *s = "B8_Trmdvao#Binfw\\MqecnfXVkqpucoFoz#Cugpp Cg`ivjknq_@ID{EPK-`ln";

	putchar(*s ^ 1); // primeiro caractere leva XOR com 1
	s++; // passa pro segundo caractere

	char chave[4] = { 0x00, 0x02, 0x03, 0x04 }; // chave
  	int i = 1; // vai ser usado como posição da chave então já começa na segunda

	while (*s) {
		putchar(*s ^ chave[i]);
		s++; i++;

		if (i > 3)
			i=0;
	}

	putchar('\n');
	return 0;
}

 

$ ./analyseme-xor
C:\Program Files\Oracle\VirtualBox Guest Additions\DIFxAPI.dll

Lembrando que XOR com 0 dá o próprio valor, o que é o mesmo que não fazer nada. hehehe

Era aí tua dúvida?

Abraço!

Share this post


Link to post
Share on other sites

Um pouco atrasado mas antes tarde do que nunca. 😄

Spoiler

Como a análise ficou parecida com as já mencionadas, vou só ressaltar algumas observações.

A função IsDebuggerPresent retorna o valor 1 em EAX e o programa só dá seguimento se for este o valor.

A função CreateFile é chamada passando como um dos argumentos Mode=OPEN_EXISTING, ou seja, apesar do nome a função na verdade tenta abrir o arquivo e possui um valor de retorno indicando se este arquivo existe ou não. No caso, os arquivos são 'DIFxAPI.dll' e 'Vmmouse.sys'.

Só foi possível prosseguir com o programa dando um 'Fill with NOPs' no momento da verificação da existência de 'DIFxAPI.dll'.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...