Ir para conteúdo
  • Detectando overlays em executáveis PE

       (2 análises)

    Fernando Mercês

    Antes de começar, é necessário explicar o que é um overlay, já que este é um termo genérico empregado em diferentes contextos. Pois bem, na análise de malware o termo diz respeito a quaisquer dados adicionados ao final de um arquivo PE. Aqui, entenda o final do arquivo como o último byte dele. Por exemplo, tomemos o executável write.exe, do Wordpad no Windows 10. No caso aqui, criei uma cópia dele para a área de trabalho, para facilitar. Perceba que ele tem 11264 bytes:

    C:\Users\admin\Desktop>copy c:\Windows\System32\write.exe .
            1 file(s) copied.
    
    C:\Users\admin\Desktop>dir write.exe
    06/12/2019  18:29            11,264 write.exe
                   1 File(s)         11,264 bytes

    Agora vamos adicionar algo ao final do arquivo, ou seja, acrescentar algo, aumentando seu tamanho. Isso pode ser qualquer coisa. No contexto de malware, normalmente se acrescenta outros executáveis ou shellcodes, mas qualquer coisa para o nosso exemplo serve. Usarei uma imagem de 4347 bytes:

    C:\Users\admin\Desktop>dir dale.jpg
    26/08/2022  15:40             4,347 dale.jpg
                   1 File(s)          4,347 bytes
                   0 Dir(s)  39,704,485,888 bytes free

    Apesar de existirem programas criados especificamente para isto chamados de binders, o próprio comando copy consegue adicionar um overlay com a opção /b e o separador +. No exemplo abaixo, crio um arquivo chamado novo.exe, que será formado pelo conteúdo do arquivo write.exe seguido do conteúdo do arquivo dale.jpg:

    C:\Users\admin\Desktop>copy /b write.exe + dale.jpg novo.exe
    write.exe
    dale.jpg
            1 file(s) copied.

    O exectuável novo.exe funciona normalmente, pois possui uma cópia exata do original write.exe logo em seu início e somente depois do último byte é que começa o primeiro byte do arquivo dale.jpg. Se o write.exe possui 11264 bytes de tamanho, significa que seu conteúdo vai do byte 0 ao byte 11263. Depois disso, iniciando no byte 11264, há o conteúdo do dale.jpg, que é considerado um overlay pelas razões já explicadas.

    Perceba também que o tamanho do novo.exe é exatamente a soma dos tamanhos de write.exe e dale.jpg:

    C:\Users\admin\Desktop>dir write.exe dale.jpg
    06/12/2019  18:29            11,264 write.exe
    26/08/2022  15:40             4,347 dale.jpg
                   2 File(s)         15,611 bytes
    
    C:\Users\admin\Desktop>dir novo.exe
    26/08/2022  15:44            15,611 novo.exe
                   1 File(s)         15,611 bytes

    Detectando overlays

    Vários softwares detectam a presença de overlays. Por exemplo, ao abrir o novo.exe no DIE, ele detecta o overlay, tornando o botão abaixo clicável:

    image.thumb.png.7afbaa1b6c0413c044a05ba0f509fd00.png

    DIE habilita o botão Overlay quando há dados acrescentados num aquivo PE

    Existe mais de uma forma de detectar a presença de overlays. A mais famosa funciona assim:

    1. Busca-se a "última" seção do executável, ou seja, a que vem depois de todas as outras, que naturalmente estará mais perto do fim do arquivo que todas as outras.
    2. Uma vez que a última seção seja identificada, anota-se o offset dela no arquivo, ou seja, onde ela começa no arquivo (não é em memória, mas sim no arquivo em disco).
    3. O valor anterior é somado com o tamanho dessa seção (também em disco). O resultado é o tamanho original do arquivo. Qualquer coisa a mais no arquivo é considerado overlay.

    Por exemplo, para o executável novo.exe, vejamos as seções (dá no mesmo aqui olhar no write.exe) com o DIE:

    image.thumb.png.3fc85760709428193746ca0bec8036e7.png

    Informações das seções do arquivo novo.exe no DIE

    A seção que tiver o maior valor no campo PointerToRawData de seu cabeçalho é a última. Note que não necessiamente ela será a última seção na lista, mas normalmente é o que acontece. No caso deste binário PE, é a seção .reloc. Sendo assim, para obter o tamanho original do arquivo PE, basta somar o byte no arquivo onde a seção começa (valor de PointerToRawData) com seu tamanho no arquivo (valor de SizeOfRawData). Fazendo a conta:

    0x2a00 + 0x200 = 0x2c00 (11264 em decimal)

    Portanto, qualquer coisa além do byte 0x2bff (que é 0x2c00 - 1) no arquivo é overlay. Exatamente por isso o DIE começa a exibir do byte 0x2c00 se você clicar no botão Overlay:

    image.thumb.png.7cffdc6a2224142e9bd7ff5bc26c1373.png

    DIE exibindo o overlay

    Executáveis contendo dados além de seu tamanho original podem levantar suspeitas, mas há usos legítimos para este recurso, como na assinatura digital. No entanto, fica a cargo da pessoa que analisa verificar o que tem no overlay e se o código do arquivo lê algo a partir de lá ou não. Quem usa YARA pode se beneficiar da sua capacidade de detectar overlays que adicionei na versão 3.6.0.

    Para deixar o assunto ainda mais fácil, gravei um vídeo resumindo e mostrando o que está neste artigo em ação:

    Bons estudos! ?


    • Agradecer 2
    • Curtir 2

    Feedback do Usuário

    Participe da conversa

    Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.
    Nota: Sua postagem exigirá aprovação do moderador antes de ficar visível.

    Visitante

    • Isso não será mostrado para outros usuários.
    • Adicionar um análise...

      ×   Você colou conteúdo com formatação.   Remover formatação

        Apenas 75 emojis são permitidos.

      ×   Seu link foi automaticamente incorporado.   Mostrar como link

      ×   Seu conteúdo anterior foi restaurado.   Limpar o editor

      ×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.


    fredericopissarra

       2 de 2 membros acharam esta análise útil 2 / 2 membros

    Não sabia que overlays ainda eram usados na época dos PEs. Eram muito comuns na época do MS-DOS.

    • Curtir 1
    Link para a análise
    Compartilhar em outros sites

    darkcrow

       1 de 1 membros acharam esta análise útil 1 / 1 membro

    Excelente conteúdo, como sempre!

    Uma curiosidade: no caso de binários .NET compilados (ou publicados, como a atual opção no Visual Studio Community 2022) com a opção "Self Contained", que gera um executável com o runtime .NET embutido, o overlay conterá também o código do binário .NET.

    A partir daí, é possível usar um debugger/decompiler como o dnSpy para analisar o código .NET.overlay-net.thumb.png.258ed10988867e493bde72cbfb1b72cb.png

    • Curtir 1
    Link para a análise
    Compartilhar em outros sites


  • Conteúdo Similar

×
×
  • Criar Novo...