Jump to content
Sign in to follow this  
unc4nny

Dicas para analise de shellcode obfuscado

 Read less than a minute

Recommended Posts

 Read less than a minute

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!

Share this post


Link to post
Share on other sites
 Read less than a minute

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!

Share this post


Link to post
Share on other sites
Posted (edited)
 Read less than a minute

Putz vdd eu tinha esquecido completamente do  tracing!!! Vlw mano vou usar isso aqui! :P

Outra coisa, vc sabe se tem como colocar break points em todas as calls no x64dbg? Acho q eu vou fazer isso tamem

Edited by unc4nny

Share this post


Link to post
Share on other sites
 Read less than a minute

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!

 

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.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...