Please enable / Bitte aktiviere JavaScript!
Veuillez activer / Por favor activa el Javascript![ ? ]
quarta-feira , outubro 17 2018
Últimas Notícias

Unpacking ASPack 2.xx manual

Olá pessoas, estou escrevendo este post para mostrar como é possível descompactar o packer ASPack manualmente, em sua versão 2.x. Não sei exatamente em que versões ele funciona, testei com a 2.35 (trial) e funcionou. Os scanners detectaram como ASPack 2.12, então creio que funcione nessa versão também.

Achei uma certa similaridade na rotina gerada pelo packer. Ele cria uma seção (.aspack), move o EP pra la e coloca a stub lá dentro. A stub faz a descompressão do arquivo na memória e executa-o. Dessa forma, só precisamos encontrar o OEP (Original Entry Point) e dumparmos o processo em cima dele.

Estarei usando como exemplo o programa whois.exe, da Sys Internals. Eu mesmo compactei ele com o ASPack 2.35.

Abrindo o arquivo compactado no Olly, ele nos dá um aviso, dizendo que o EP (Entry Point) foi especificado em uma parte diferente do código. Isso acontece porque o ASPack gerou uma nova seção, e colocou o EP lá. O OEP está localizado na seção .text, que armazena o código do executável (descompactado).

Se nós verificarmos o campo AddressOfEntryPoint no PE Header, vamos ver que ele aponta para a seção .aspack, e não .text, como deveria ser.

Damos OK, e ele nos mostra o código inicial. Assim como o UPX, o ASPack também começa o código com PUSHAD. O comando PUSHAD coloca todos os registradores (EAX, ECX, etc) na stack, para fazer um backup antes de rodar a stub. Ou seja, ele poderá usar qualquer registrador durante à descompressão, sem ter o problema de mudar algum valor que possa ser necessário depois

.


 

Tail Jump

O tail jump é um código, geralmente localizado no fim do código da stub, que é responsável por te mandar para o código original do programa (OEP). Geralmente o tail jump usa instruções como JUMP, CALL, ou RET, para valores bem longe no código. As vezes, pode não ser tão fácil de ser reconhecido.

Para encontrarmos o tail jump do ASPack, precisaremos procurar pelo seguinte bloco de instrução:

push 0

retn

Apertando CTRL + S (ou clicando com o botão direito sobre o código, search for, sequence of commands), nós procuraremos por essa sequência.

E então cairemos no Tail Jump. Nesse caso, ele está bem escondido no código, e não está no final, como geralmente acontece. Porém, se percebermos bem, ele tem um POPAD antes (que faz o inverso do PUSHAD, ou seja, remove os registradores da stack) da chamada do OEP.

Para sabermos o endereço do OEP, podemos setar um breakpoint em qualquer um dos dois comandos que procuramos. Vamos setar no PUSH 0. Para fazer isso, selecione a linha do PUSH 0 e aperte F2. Aparecerá uma mensagem, ignore-a e clique em sim. Depois disso, podemos executar o programa e ele parará exatamente onde setamos o breakpoint. Para executá-lo, aperte F9.

Veja que a instrução muda, e o PUSH coloca um valor na pilha. Esse valor é 00403E20. Nós estamos na offset 426420, ou seja, é uma diferença de 22.600 (140.800 em decimal) bytes! Isso é bastante coisa, então ele vai nos levar para o código original do programa. Vamos apertar F7 para que ele vá para a instrução de baixo, e F7 de novo para que ele retorne para o OEP.

Pronto, já estamos no código descompactado. Agora é só usar o plugin OllyDump para criarmos um novo executável, em que o EP será o EIP (próxima instrução). Como o EIP é a primeira linha do código descompactado, nosso novo executável estará descompactado!

Repare também que a seção .aspack continua no programa, porém, ela não será utilizada para nada. Por esse motivo, o código do programa dumpado será um pouco maior do que o original. Mas, o programa está sem compactação! Vamos ver novamente o campo AddressOfEntryPoint no PE Header e ver para onde ele aponta.

Veja que ele aponta para o endereço 3E20, que é o nosso OEP, na seção .text. 🙂

Pronto, o programa foi descompactado!

Fiz um vídeo mostrando melhor: http://www.youtube.com/watch?v=aDXpJghG_kw

Espero que todos tenham entendido, até a próxima, valeu!

Sobre Nicholas Ferreira

Sou amante de informática desde criança, tive meu primeiro contato com hacking aos 12 anos, e desde essa data eu venho estudando cada vez mais as diversas áreas da segurança da informação. Tenho certificados de cursos de PHP, Visual Basic, e atualmente estou estudando Análise de Malwares.
Free WordPress Themes - Download High-quality Templates