Leandro Fróes Postado Dezembro 22, 2018 em 02:57 Compartilhar Postado Dezembro 22, 2018 em 02:57 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 Link para o comentário Compartilhar em outros sites More sharing options...
rcimatti Postado Dezembro 26, 2018 em 13:43 Compartilhar Postado Dezembro 26, 2018 em 13:43 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! Link para o comentário Compartilhar em outros sites More sharing options...
Apoiador Nibble Wilson Junior Postado Dezembro 27, 2018 em 16:41 Apoiador Nibble Compartilhar Postado Dezembro 27, 2018 em 16:41 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. Link para o comentário Compartilhar em outros sites More sharing options...
Apoiador Nibble anderson_leite Postado Janeiro 5, 2019 em 14:17 Apoiador Nibble Compartilhar Postado Janeiro 5, 2019 em 14:17 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 Link para o comentário Compartilhar em outros sites More sharing options...
Fernando Mercês Postado Janeiro 10, 2019 em 21:49 Compartilhar Postado Janeiro 10, 2019 em 21:49 @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! Link para o comentário Compartilhar em outros sites More sharing options...
Aof Postado Janeiro 11, 2019 em 03:04 Compartilhar Postado Janeiro 11, 2019 em 03:04 @Fernando Mercês estava tentando fazer o algoritmo do XOR em C e ainda não tinha conseguido cara. vlw heheheh Link para o comentário Compartilhar em outros sites More sharing options...
Apoiador Nibble Wilson Junior Postado Janeiro 11, 2019 em 14:44 Apoiador Nibble Compartilhar Postado Janeiro 11, 2019 em 14:44 @Fernando Mercês, obrigado! Link para o comentário Compartilhar em outros sites More sharing options...
Apoiador Nibble Euler Neto Postado Fevereiro 21, 2019 em 02:33 Apoiador Nibble Compartilhar Postado Fevereiro 21, 2019 em 02:33 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'. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Arquivado
Este tópico foi arquivado e está fechado para novas respostas.