Ir para conteúdo
  • Seu parser em um piscar de olhos com Kaitai Struct


    Leandro Fróes

    Em 2015 foi criado o projeto Kaitai Struct. Mantido até hoje o projeto engloba toda uma estrutura para trabalhar com a ideia de parsing de arquivos, tanto em disco quanto em memória.

    O segredo disto é a linguagem descritiva criada pelo projeto. O Kaitai utiliza um arquivo de texto com extensão .ksy para definir um formato. Este arquivo, após ser compilado pelo seu próprio compilador (ksc) gera um código em qualquer uma das linguagens aceitas para parsear o formato(CPP/STL, C#, Graphviz, Java, JavaScript, Perl, PHP, Python, Ruby e JSON).

    Ficou confuso? Aqui está um exemplo de um arquivo nesta linguagem descritiva:

    meta:
      id: microsoft_pe
      title: Microsoft PE (Portable Executable) file format
      application: Microsoft Windows
      endian: le
      ks-version: 0.7
    doc-ref: http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
    seq:
      - id: mz1
        type: mz_placeholder
      - id: mz2
        size: mz1.header_size - 0x40
      - id: pe_signature
        contents: ["PE", 0, 0]
      - id: coff_hdr
        type: coff_header
      - id: optional_hdr
        type: optional_header
        size: coff_hdr.size_of_optional_header
      - id: sections
        repeat: expr
        repeat-expr: coff_hdr.number_of_sections
        type: section
    enums:
      pe_format:
        0x107: rom_image
        0x10b: pe32
        0x20b: pe32_plus
    types:
      mz_placeholder:
        seq:
          - id: magic
            contents: "MZ"
    
    …

    Neste exemplo o arquivo está descrevendo os campos do formato PE (executáveis Windows). Alguns campos foram omitidos pois a especificação do formato PE é grande. Todos estes campos e suas definições podem ser encontrados na documentação oficial.

    Segue a definição de alguns campos:

    id: usado para identificação.

    doc-ref: usado para indicar a documentação do formato

    endian: usado para indicar o endianess (ordem dos bytes. Little-Endian no exemplo).

    seq: usado para indicar uma sequência de atributos e a ordem que serão lidos ou escritos.

     

    Sem mais delongas vamos ao que interessa, a prática. O exemplo abaixo usa a versão web do projeto:

    p1.thumb.png.5b12b56b3e0223364679e196e9382612.png

    Para analisar um arquivo PE (que é o nosso exemplo) primeiro devemos ir no lado esquerdo onde há vários tipos de formatos em ksy, selecionar a pasta kaitai.oi/formats/executables e clicar duas vezes em microsoft_pe.ksy:

    p2.thumb.png.419990cd46831684994341a93f5bfc74.png

    Logo de cara podemos ver o arquivo .ksy, mas ainda não fizemos o parser. Para de fato conseguir analisar o nosso binário precisamos carregá-lo e isto é feito no botão abaixo de “Local Storage” (lugar este onde ficam os arquivos que carregamos). Há três botões, o primeiro cria um arquivo .ksy, o segundo carrega um arquivo seu para análise e o terceiro baixa um arquivo do repositório do KS:

    p3.thumb.png.01cc95960954bc915f0d7e44c6fccf77.png

    Aqui carreguei o Putty.exe (um binário PE) e olha só o resultado: uma árvore ao meio com todos os campos parseados e o dump do arquivo em disco à direita. Se clicarmos duas vezes em algum campo , como, por exemplo, ImageBase, podemos ver sua localização exata no arquivo, no dump:

    p4.thumb.png.1dfd597de1163df14150ec325d964acf.png

    Legal, não é mesmo? Mais legal ainda é o fato dele gerar o código fonte usado para o parser e isso na linguagem que você escolher dentre das suportadas. No caso, escolhi C++:

    p5.thumb.png.6e96eb7bf6ed5da13577df48d30e2c2c.png

    Aqui foram apresentadas apenas algumas funcionalidades deste projeto, mas fica claro o quanto isso é útil tanto para análises quanto para estudos de diversos formatos: executáveis, logs, cabeçalhos de protocolos e até mesmo arquivos .pcap.

    O Kaitai Struct também funciona em linha de comando em: Linux, Windows e macOS. Caso queira você também pode baixar o código direto do repositório do projeto e trabalhar como quiser, seja para engenharia reversa ou para aprender como programar um parser.

    Editado por Leandro Fróes


    Feedback do Usuário

    Comentários Recomendados

    Não há comentários para mostrar.



    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.

    Visitante
    Adicionar um comentário...

    ×   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.


×
×
  • Criar Novo...