Questão:
Descompactando o binário estaticamente
EfForEffort
2013-03-21 09:24:09 UTC
view on stackexchange narkive permalink

Digamos que eu tenha um binário que não consigo executar (por exemplo, ele roda em algum dispositivo que não possuo), mas posso desmontá-lo. Posso obter os documentos sobre a arquitetura. (É MIPS little endian no meu caso.) Mas o binário tem muito poucas importações, muito poucas strings, etc., então realmente parece que está compactado.

Como posso fazer estaticamente descompactando-o? (Editar: quero dizer, descompactá-lo sem qualquer acesso ao dispositivo original.)

Você pode tentar executá-lo com um dos emuladores de modo de usuário fornecidos com o QEMU ... ajudaria se você soubesse mais sobre isso, provavelmente um desmontador ajudaria como o IDA talvez seja um dos tipos com os quais a versão gratuita pode trabalhar. Além disso, não tenho certeza do que você quer dizer com "desempacotamento estático"
Ida Pro e o emulador Bochs parecem uma boa opção, veja [aqui] (https://www.hex-rays.com/products/ida/support/tutorials/debugging_bochs.pdf) para um tutorial.
@Remko:, infelizmente, Bochs apenas emula x86, então é improvável que ajude aqui
@cb88, Tenho uma cópia do IDA Pro. E o que quero dizer é que desejo descompactar o binário, mas não tenho o dispositivo para o qual foi originalmente planejado. Parece que QEMU + mipsel é o caminho a percorrer; Estou baixando debian-mipsel agora.
Você provavelmente poderia fazer isso em um chroot também, com gentoo mips e um emulador de modo de usuário qemu estático, se a emulação do sistema qemu for muito problemática ou difícil de obter dados de volta. http://www.gentoo.org/proj/en/base/embedded/handbook/?part=1&chap=5
Quatro respostas:
ixje
2013-03-21 13:47:32 UTC
view on stackexchange narkive permalink

Nos mais de 30 firmwares de dispositivos embarcados que vi no passado, raramente os vi usando algo proprietário. Freqüentemente, é apenas gzip / LZMA ou uma compressão similar que eles estão usando (embora às vezes com cabeçalhos modificados ou removidos).

Assim, como primeiro passo, eu tentaria algo como binwalk para pesquisar algoritmos de compressão conhecidos. Se isso não ajudar, tente ferramentas para encontrar constantes de criptografia, como Find Crypt ou Sign search. Isso só funciona se a criptografia for uma implementação de software. Se for um dispositivo mais sofisticado, digamos um set-top-box, com um mecanismo de descriptografia acelerado por hardware e memória OTP para armazenar a chave, então você está sem sorte sem acesso em tempo de execução (a menos que estrague muito a passagem da chave de OTP para o mecanismo de descriptografia).

Finalmente, você pode tentar descobrir se eles usam algum algoritmo proprietário e emular esse algoritmo usando QEMU ou gxemul ou escreva seu próprio descompressor em linguagem de nível superior.

Essa é uma boa ideia. Eu executei o binwalk e não encontrou nada, exceto que é um ELF (ou seja, ele relatou apenas o que o arquivo (1) relatou). A pesquisa de sinais também não encontrou nada. Acho que a próxima etapa é QEMU.
user1354557
2013-03-22 22:34:35 UTC
view on stackexchange narkive permalink

No The Ida Pro Book, Chris Eagle demonstra o uso de um plugin chamado ida-x86emu, que pode ser usado para descompactar binários estaticamente simulando a execução dentro do banco de dados IDA . Confira; é de código aberto e é muito fácil de usar.

Infelizmente não ajuda, pois este é um binário MIPS = [
Ange
2013-03-26 21:17:16 UTC
view on stackexchange narkive permalink

várias maneiras possíveis:

  1. identificar o empacotador

    • obter empacotadores padrão de sua plataforma ( UPX por exemplo ), verifique se não é o usado.
    • Se for um empacotador padrão, talvez você já tenha ganhado, como pode estar documentado, ou melhor ainda, como o UPX, ele pode se descompactar e é código-fonte aberto.
  2. identificar o algoritmo

    • não há tantos algoritmos de empacotador bons + difundidos (NRV, LZMA, JCAlg, ApLib, BriefLZ). geralmente são facilmente identificáveis ​​pelo tamanho do corpo ou pelas constantes. (Eu implementei vários deles em Python puro em Kabopan)
    • se você pode identificar facilmente o algoritmo de empacotamento / criptografia, então provavelmente você pode encontrar uma implementação limpa para desempacotamento estático
  3. Suje as mãos

    • se você ainda não conhece o algoritmo e aparentemente é realmente personalizado, leia outro empacotador para a mesma plataforma (ou seja, mais uma vez, leia o binário UPX Mips e sua fonte), para que possa familiarizá-lo com truques semelhantes (empacotador) usados ​​em sua plataforma.
    • em seguida, procure o algoritmo de compressão provável (provavelmente um pedaço de código de aparência diferente, as pessoas muito raramente mexem com eles, reimplementam o algoritmo em sua linguagem favorita e desempacotam externamente (localize parâmetros, aplique algoritmos, modifique / reconstrua binários)
  4. Método lento por força bruta: alguns algoritmos como ApLib não têm cabeçalho nem parâmetro (nem mesmo um tamanho): o algoritmo requer apenas um ponteiro para um compr buffer instalado, então às vezes é suficiente apenas testá-lo cegamente em qualquer deslocamento de seu binário e verificar se temos um buffer descompactado decente (não muito pequeno, não muito grande + cheio de 00s).

Rolf Rolles
2013-03-21 12:43:01 UTC
view on stackexchange narkive permalink

Minha resposta geral seria "simulando operações de automodificação em relação ao binário compactado". Então, por exemplo, isso envolveria a remoção da compressão sob a qual a maioria dos packers está velada. Isso exigirá "rastrear estaticamente" o fluxo de execução através do empacotador, cujo código pode estar sujeito a auto-modificação.

Essa explicação funciona para um estilo tradicional de empacotamento, em que as seções do binário são meramente compactado / criptografado. Pode ser que estratégias de desempacotamento mais sofisticadas sejam necessárias, por exemplo, conforme descrito em meu artigo "Unpacking Virtualization Obfuscators" 1.



Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 3.0 sob a qual é distribuído.
Loading...