Анализ бинарного кода является решающей деятельностью во многих областях компьютерных наук и дисциплин разработки программного обеспечения, начиная от безопасности программного обеспечения и анализа программ до обратной техники. Ручной бинарный анализ-это сложная и трудоемкая задача, и существуют программные инструменты, которые стремятся автоматизировать или помочь человеческим аналитикам. Тем не менее, большинство из этих инструментов имеют несколько технических и коммерческих ограничений, которые ограничивают доступ и использование большой частью сообществ академических и практикующих. BARF - это структура бинарного анализа с открытым исходным кодом, которая направлена на поддержку широкого спектра задач анализа бинарного кода, которые распространены в дисциплине информационной безопасности. Это сценариальная платформа, которая поддерживает поднятие инструкций из нескольких архитектур, двоичный перевод к промежуточному представлению, расширяемая структура для плагинов анализа кода и взаимодействие с внешними инструментами, такими как отладчики, решатели SMT и инструменты инструментов. Структура предназначена в основном для анализа с помощью человека, но она может быть полностью автоматизирована.
Проект BARF включает в себя BARF и связанные с ним инструменты и пакеты. До сих пор проект состоит из следующих элементов:
Для получения дополнительной информации см.:
Текущий статус:
| Последний релиз | v0.6.0 |
|---|---|
| URL | https://github.com/programa-stic/barf-project/releases/tag/v0.6.0 |
| Изменить журнал | https://github.com/programa-stic/barf-project/blob/v0.6.0/changelog.md |
Все пакеты были протестированы на Ubuntu 16.04 (x86_64).
BARF - это пакет Python для бинарного анализа и обратной инженерии. Он может:
ELF , PE и т. Д.),В настоящее время он находится в стадии разработки .
Барф зависит от следующих решателей SMT:
Следующая команда устанавливает BARF в вашу систему:
$ sudo python setup.py installВы также можете установить его локально:
$ sudo python setup.py install --usersudo pip install pyasmjitsudo apt-get install graphvizЭто очень простой пример, который показывает, как открыть двоичный файл и распечатать каждую инструкцию с его переводом на промежуточный язык ( REIL ).
from barf import BARF
# Open binary file.
barf = BARF ( "examples/misc/samples/bin/branch4.x86" )
# Print assembly instruction.
for addr , asm_instr , reil_instrs in barf . translate ():
print ( "{:#x} {}" . format ( addr , asm_instr ))
# Print REIL translation.
for reil_instr in reil_instrs :
print ( " t {}" . format ( reil_instr )) Мы также можем восстановить CFG и сохранить его в файл .dot .
# Recover CFG.
cfg = barf . recover_cfg ()
# Save CFG to a .dot file.
cfg . save ( "branch4.x86_cfg" )Мы можем проверить ограничения на код, используя SMT Solver. Например, предположим, что у вас есть следующий код:
80483ed: 55 push ebp
80483ee: 89 e5 mov ebp,esp
80483f0: 83 ec 10 sub esp,0x10
80483f3: 8b 45 f8 mov eax,DWORD PTR [ebp-0x8]
80483f6: 8b 55 f4 mov edx,DWORD PTR [ebp-0xc]
80483f9: 01 d0 add eax,edx
80483fb: 83 c0 05 add eax,0x5
80483fe: 89 45 fc mov DWORD PTR [ebp-0x4],eax
8048401: 8b 45 fc mov eax,DWORD PTR [ebp-0x4]
8048404: c9 leave
8048405: c3 ret
И вы хотите знать, какие значения вы должны присвоить местоположениям памяти ebp-0x4 , ebp-0x8 и ebp-0xc чтобы получить конкретное значение в регистрации eax после выполнения кода.
Сначала мы добавляем инструкции в компонент анализатора.
from barf import BARF
# Open ELF file
barf = BARF ( "examples/misc/samples/bin/constraint1.x86" )
# Add instructions to analyze.
for addr , asm_instr , reil_instrs in barf . translate ( 0x80483ed , 0x8048401 ):
for reil_instr in reil_instrs :
barf . code_analyzer . add_instruction ( reil_instr )Затем мы генерируем выражения для каждой интересующей переменной и добавляем на них нужные ограничения.
ebp = barf . code_analyzer . get_register_expr ( "ebp" , mode = "post" )
# Preconditions: set range for variable a and b
a = barf . code_analyzer . get_memory_expr ( ebp - 0x8 , 4 , mode = "pre" )
b = barf . code_analyzer . get_memory_expr ( ebp - 0xc , 4 , mode = "pre" )
for constr in [ a >= 2 , a <= 100 , b >= 2 , b <= 100 ]:
barf . code_analyzer . add_constraint ( constr )
# Postconditions: set desired value for the result
c = barf . code_analyzer . get_memory_expr ( ebp - 0x4 , 4 , mode = "post" )
for constr in [ c >= 26 , c <= 28 ]:
barf . code_analyzer . add_constraint ( constr )Наконец, мы проверяем, что ограничения, которые мы установили, могут быть разрешены.
if barf . code_analyzer . check () == 'sat' :
print ( "[+] Satisfiable! Possible assignments:" )
# Get concrete value for expressions
a_val = barf . code_analyzer . get_expr_value ( a )
b_val = barf . code_analyzer . get_expr_value ( b )
c_val = barf . code_analyzer . get_expr_value ( c )
# Print values
print ( "- a: {0:#010x} ({0})" . format ( a_val ))
print ( "- b: {0:#010x} ({0})" . format ( b_val ))
print ( "- c: {0:#010x} ({0})" . format ( c_val ))
assert a_val + b_val + 5 == c_val
else :
print ( "[-] Unsatisfiable!" )Вы можете увидеть эти и больше примеров в каталоге примеров.
Структура разделена на три основных компонента: ядро , арка и анализ .
Этот компонент содержит основные модули:
REIL : предоставляет определения для языка Reil. Это также реализует эмулятор и анализатор .SMT : предоставляет средства для взаимодействия с Z3 и CVC4 SMT Solver. Кроме того, он обеспечивает функциональность для перевода инструкций REIL на выражения SMT.BI : модуль двоичного интерфейса отвечает за загрузку двоичных файлов для обработки (он использует Pefile и Pyelftools.) Каждая поддерживаемая архитектура предоставляется в виде подкомпонента, который содержит следующие модули.
Architecture : описывает архитектуру, то есть регистры, размер адреса памяти.Translator : предоставляет переводчикам Reil для каждой поддерживаемой инструкции.Disassembler : обеспечивает функциональность разборки (он использует Capstone.)Parser : Преобразование инструкции из строки в форму объекта. До сих пор этот компонент состоит из модулей: график потока управления , график вызова и анализатора кода . Первые два, обеспечивает функциональность для CFG и CG восстановления, соответственно. Последнее, это интерфейс высокого уровня с функциональностью, связанной с решателем SMT.
BARFgadgets - это сценарий Python, построенный на BARF, который позволяет искать , классифицировать и проверять гаджеты ROP внутри бинарной программы. Стадия поиска находит все гаджеты, jmp ret и call -вызовов внутри двоичного файла. Стадия классификации классифицирует ранее найденные гаджеты в соответствии со следующими типами:
Это делается за счет эмуляции инструкций. Наконец, этап проверки состоит из использования решателя SMT для проверки семантики, назначенной каждому гаджету на втором этапе.
usage: BARFgadgets [-h] [--version] [--bdepth BDEPTH] [--idepth IDEPTH] [-u]
[-c] [-v] [-o OUTPUT] [-t] [--sort {addr,depth}] [--color]
[--show-binary] [--show-classification] [--show-invalid]
[--summary SUMMARY] [-r {8,16,32,64}]
filename
Tool for finding, classifying and verifying ROP gadgets.
positional arguments:
filename Binary file name.
optional arguments:
-h, --help show this help message and exit
--version Display version.
--bdepth BDEPTH Gadget depth in number of bytes.
--idepth IDEPTH Gadget depth in number of instructions.
-u, --unique Remove duplicate gadgets (in all steps).
-c, --classify Run gadgets classification.
-v, --verify Run gadgets verification (includes classification).
-o OUTPUT, --output OUTPUT
Save output to file.
-t, --time Print time of each processing step.
--sort {addr,depth} Sort gadgets by address or depth (number of
instructions) in ascending order.
--color Format gadgets with ANSI color sequences, for output
in a 256-color terminal or console.
--show-binary Show binary code for each gadget.
--show-classification
Show classification for each gadget.
--show-invalid Show invalid gadget, i.e., gadgets that were
classified but did not pass the verification process.
--summary SUMMARY Save summary to file.
-r {8,16,32,64} Filter verified gadgets by operands register size.
Для получения дополнительной информации см. Readme.
BARFcfg -это скрипт Python, созданный на BARF, который позволяет вам восстановить график потока управления бинарной программой.
usage: BARFcfg [-h] [-s SYMBOL_FILE] [-f {txt,pdf,png,dot}] [-t]
[-d OUTPUT_DIR] [-b] [--show-reil]
[--immediate-format {hex,dec}] [-a | -r RECOVER]
filename
Tool for recovering CFG of a binary.
positional arguments:
filename Binary file name.
optional arguments:
-h, --help show this help message and exit
-s SYMBOL_FILE, --symbol-file SYMBOL_FILE
Load symbols from file.
-f {txt,pdf,png,dot}, --format {txt,pdf,png,dot}
Output format.
-t, --time Print process time.
-d OUTPUT_DIR, --output-dir OUTPUT_DIR
Output directory.
-b, --brief Brief output.
--show-reil Show REIL translation.
--immediate-format {hex,dec}
Output format.
-a, --recover-all Recover all functions.
-r RECOVER, --recover RECOVER
Recover specified functions by address (comma
separated).
BARFcg - это сценарий Python, построенный на BARF, который позволяет вам восстановить график вызовов бинарной программы.
usage: BARFcg [-h] [-s SYMBOL_FILE] [-f {pdf,png,dot}] [-t] [-a | -r RECOVER]
filename
Tool for recovering CG of a binary.
positional arguments:
filename Binary file name.
optional arguments:
-h, --help show this help message and exit
-s SYMBOL_FILE, --symbol-file SYMBOL_FILE
Load symbols from file.
-f {pdf,png,dot}, --format {pdf,png,dot}
Output format.
-t, --time Print process time.
-a, --recover-all Recover all functions.
-r RECOVER, --recover RECOVER
Recover specified functions by address (comma
separated).
Pyasmjit - это пакет Python для генерации и выполнения кода и выполнения кода ARM.
Этот пакет был разработан для проверки перевода инструкции BARF с x86_64/arm в Reil. Основная идея состоит в том, чтобы иметь возможность запускать фрагменты кода изначально. Затем тот же фрагмент переводится в Reil и выполняется в VIL VM. Наконец, оба конечных контекста (тот, который получен посредством нативного исполнения, и из эмуляции) сравниваются для различий.
Для получения дополнительной информации см. Pyasmjit.
Лицензия BSD 2-CLAUSE. Для получения дополнительной информации см. Лицензию.