Идентификация шифрования в программах Python - PullRequest
0 голосов
/ 21 ноября 2018

Мне нужно определить, выполняет ли программа Python какое-либо шифрование во время своего выполнения.

Я испробовал несколько подходов (отсортирую по уровню сложности):

  1. Исходный код программы на python может содержать синонимические слова, которые могут идентифицировать возможное используемое шифрование (https://github.com/Wind-River/crypto-detector).. Проблема с этим подходом заключается в том, что небольшое запутывание в коде может поставить под угрозу идентификацию.

    В коде, определенном ниже, у нас есть переменная строка, которая содержит весь код, ответственный за некоторое шифрование, но с помощью этого анализа мы не можем идентифицировать происходящее шифрование:

    def handle (arg):
        from base64 import b64decode as printf
        string = 'ZnJvbSBDcnlwdG8uQ2lwaGVyIGltcG9ydCBBRVM7IGZyb20gQ3J5cHRvIGltcG9ydCBSYW5kb207IGtleSA9IGIn
    U2l4dGVlbiBieXRlIGtleSc7IGl2ID0gUmFuZG9tLm5ldygpLnJlYWQoQUVTLmJsb2NrX3NpemUpOyBjaXBoZXIgPSBBRVMubmV3KG
    tleSwgQUVTLk1PREVfQ0ZCLCBpdik7IG1zZyA9IGl2ICsgY2lwaGVyLmVuY3J5cHQoYidBdHRhY2sgYXQgZGF3bicpOyBwcmludCBt
    c2c = '
        eval (compile (printf (string), '<string>', 'exec'))
        return None
    

    Другой пример кода:https://gist.github.com/robertonscjr/e3f658cce0c0253e2e076e0457635d86

    Этот код не содержит слов, которые могут быть связаны с использованием шифрования, поэтому этот метод очень малоэффективен. Неэффективность этого инструмента очевидна, поскольку в коде могут возникать ложные срабатываниячто явно не делает шифрование:

    def handle (arg):
      crypto = 2
      return crypto
    
  2. На уровне сборки, любойинструкции программы могут указывать на возможное использование алгоритма шифрования, так как эти алгоритмы обычно имеют шаблон инструкций.Статья инструмента grap, которая представляет собой низкоуровневый инструмент идентификации шаблонов команд (https://eprint.iacr.org/2017/1119.pdf)), показывает низкоуровневый шаблон этапов выполнения AES.

    Для этого контекста этот подход имеетпроблема: сопоставление с образцом, выполненное grap, выполняется из дизассемблирования x86-x64 любой программы, а процесс выполнения дизассемблирования x86-x64 для python подразумевает генерацию двоичного файла одной программы python (которая интерпретируется по натуре).

    Я использовал инструмент под названием pyinstaller (https://www.pyinstaller.org) для генерации двоичного файла из слегка запутанной программы на питоне (https://gist.github.com/robertonscjr/e3f658cce0c0253e2e076e0457635d86):

    pyinstaller --onefile ~ / fake_aes.py
    

    Для выполненияя использовал существующие шаблоны AES, расположенные в каталоге grap, и результаты не были многообещающими, так как описанная ниже команда не привела ни к какому шаблону:

    grap -q ~ /grap/patterns/crypto/ ~/fake_aes.bin
    

    Одно из подозрений заключается в том, чтоИнструмент grap не был успешным, потому что двоичное преобразование изменяет поведение инструкций. Проблема: TЭта проблема должна быть связана с тем, как двоичный файл Python был сгенерирован с помощью pyinstaller, и если поведение сгенерированного кода Python поддерживается в сгенерированном двоичном файле?

    Если pyinstaller генерирует правильный двоичный файл и не работает, у нас есть вторая проблема: нам нужно найти другие шаблоны для grep?проблема с этим подходом заключается в том, что поиск другого паттерна может занять много времени и не очень эффективен против серьезного запутывания (https://youtu.be/3hSpmcoQ578?t=1999).

...