Ir para conteúdo

Dicas para analise de shellcode obfuscado


unc4nny

Posts Recomendados

Oi.
Estou analisando um malware e consegui realizar o unpack do que eu imagino que seja  o payload. Nao sei em quantas etapas o malware eh dividido pois esse foi o primeiro payload que eu conesgui extrair do malware ate agora. 

O payload eh um shellcode que foi copiado para um endereco de memoria que foi alocado utilizando o VirtualAlloc, depois eh somado 0x42b7 ao endereco base, e antes de retornar, esse endereco eh colocado na stack.

Para fins de ilustracao:

eax = VirtualAlloc()

eax = copy(eax, shellcode)
eax=eax+0x42b7

push eax

ret

Entao o endereco de retorno da funcao atual eh sobreescrito para esse novo offset.

Mas oq realmente importa aqui eh o fato que esse shellcode esta extremamente obfuscado:

image.png.85155df952acde429f0ad346cc767104.png

O autor do malware colocou varios codigos inuteis no programa, por exemplo o js, e eu nao sei se tem mais. O que eu gostaria de saber eh se existe algum metodo para otimizar meu tempo e evitar de fazer o stepi de todo o codigo? Pq o shell code ficou bem grande (talvez seja coisa da quantidade de obfuscacao utilizada).

Obrigado desde ja!

Link para o comentário
Compartilhar em outros sites

A partir daí, eu acho que eu deixaria o payload rodar e monitoraria as chamadas (API Monitor, drltrace, etc) pra ver que funções do Windows o payload chama. Depois você pode voltar ao x64dbg e por breakpoint nelas para analisá-las. Acho mais importante/fácil que debugar todo o código. Outra opção é usar o trace do x64dbg pra você ver o caminho de códigos (saltos) que o payload executa e não perder tempo analisando junk code. O @Thiago de Queiroz mostrou como usa o trace na palestra dele na primeira MBConf. ?

Abraço!

Link para o comentário
Compartilhar em outros sites

Show!

14 horas atrás, unc4nny disse:

tem como colocar break points em todas as calls no x64dbg?

Tudo é possível. rs

Mas pelo que entendi você quer parar em todas as chamadas à funções externas, certo? Bem, nunca tentei para em todas. Daria pra fazeer pela aba "Symbols", mas como é payload, pode ser que esteja vazia. Parece um pouco de exagero, mas uma ideia é no Trace -> Trace into você colocar uma condição (Break Condition) onde o registrador EIP esteja fora da faixa das seções do binário. Por exemplo, num binário assim (Memory Map):

mmap.thumb.png.4b46fbd0c2311c84453fded0336e6bcd.png

Como as seções dele estão na casa dos 0x400000, a condição eip > 0x500000 vai fazer o x64dbg parar quando uma função externa for chamada.

Você tem a faixa de endereços do teu payload, então é só adaptar. Mas eu ainda acho que monitorando as chamadas, seja com trace, logando ou com API Monitor ou outro e depois breakando em cada uma delas é mais negócio. Sabendo em qual chamada você quer parar, é só ir na Command Bar do x64dbg (lá embaixo) e digitar "BP CreateFileA" por exemplo. ?

Abraço!

 

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...