Разбор бинарных форматов. Часть 2

6a7e722d4ed6df438457128cc28a97c0.png

891c096729f8fa7f4d66bb152cbaf92f.jpgАвтор статьи: Александр Колесников

Вирусный аналитик

Вторая часть статьи по анализу бинарных форматов файлов, в первой части мы познакомились с достаточно простыми инструментами для анализа файлов. В этой статье мы закрепим результат и попробуем сделать что-то интересное. Будем искать информацию, которая может скрываться в недрах структуры файлов. В качестве тестовых примеров файлов, можно взять файлы из раздела Forensics вот этого ресурса. Ниже будут разобраны файлы и приведены примеры использования методов изучения бинарных файлов. Чтобы не блуждать просто по бинарным дебрям, сразу определимся, что изучение файлов производится в рамках заданий, которые были взяты для этой статьи, тоесть итогом исследования должен быть флаг (последовательность символов, которые заложены организаторами), который находится в изучаемом файле.

Пример анализа №1

В качестве подопытного файла возьмем вот этот файлик. Скачаем и попробуем его изучить, как мы помним изучение вести проще всего с помощью шестнадцатеричного редакторв. Откроем файл в нем и попробуем понять что это за файл. При открытии файла наблюдаем вот такую картину:

979b983ac7b1dafbbbe0dbc32eb1b85b.png

А где же специальные магические отметки в начале файла, чтобы приложение, которое будет его открывать сразу поняло какой алгоритм использовать? Все очень просто, некоторые форматы файлов начинаются не сразу, а по определенной границе или с определенного смещения. Делается это по ряду причин, в первую очередь это могут быть особенности работы железа, на котором потом будет использоваться файл. Как поступить? для изучения таких файлов можно использовать вспомогательные приложения:

  • binwalk

  • file

Инструменты специально заточены на то, чтобы искать специальные отметки на разных смещениях и сообщать что это за файл. Попробуем использовать утилиту file:

6f0e9da568c12dbfc5102cbb41ecd649.png

Утилита смогла определить, что это раздел файловой системы. А точнее это её дамп, который был сохранен отдельным файлом. В общем, можно попробовать вручную разобраться где что лежит в этой файловой системе. Так же можно просто попытаться примонтировать эту файловую систему локально и операционная система все сделает самостоятельно. Однако, это не наш вариант решения, мы будем пользоваться или специальным софтом, либо писать приложение, которое нам поможет изучить файл.

Для решения задания нам все таки надо заглянуть внутрь этого бинарного файла, поэтому воспользуемся следующим инструментом — xxd и grep. Работать это будет, если данные хранятся в текстовом виде, в противном случае нужно монтировать файл:

54fda902adab1ad5f23b524cc5ae2c99.png

В этот раз повезло, grep показывает необходимый флаг, который был внутри дампа.

Пример анализа №2

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

f4440630415d18bdad6fbdeea11c3863.png

Как и было обещано это pcap файл, попрбуем найти флаг в этом файле. Кстати, именно pcap формат является наиболее удобным для сырой обработки, тоесть не обязательно искать просмотрщики, основные данные будут и та видны через шестнадцатеричное представление. Попробуем просто грепнуть файл на паттерн флага. В итоге получем вот такой результат:

12c49c30b73e6099b54d6c222ec832bf.png

Не повезло, попробуем использовать более адаптированный софт. Удобнее всего использовать WireShark. Самый интересный вариант поиска флага — просмотреть все активные соединения из дампа и экспортировать переданные файлы в рамках этих соединений. Попробуем экспортировать и снова поискать в файлах флаг. На очередном шаге мы обнаруживаем его:

69afa70fea7f8be36b6810afc6faff43.png

Если интеренсо как парсить данные из таких файлов самостоятельно при помощи, допустим языка программирвания Python, то можно обратиться в помощи бибилиотеки Scapy.

Пример анализа №3

В этом примере будем работать с графическим файлом, нужно найти флаг в бинарных данных. Файл для анализа лежит тут.

Откроем файл в шестнадцатеричном виде с шаблоном и без.

ada2c7370f36113fee96694b73c01565.png5274fbbbc74ebdaae5d1a81c3ceeea35.png

Если прослежить за данными, то мы видим, что файл состоит из:

Любое добавление данных в бинарные файлы требует какого-то паттерна, тоесть жестко прописанной позиции, куда попадают данные. Поэтому для поиска сокрытых данных применяют подходы, которые имеют общее название pattern tracing. Чтобы их использовать нужно найти паттерн, и начать его искать во всем массиве сырых данных.

В начшем случае, если обратить внимание именно на старт чанков, то будет сразу видно, где находится наш паттерн:

6588bcccfaeb85b2a58f19ec4712e3ae.png

Теперь нужно все собрать воедино, в статье будем использовать несколько строк на Python, читатель может попробовать другим способом получить флаг. Исходный код скрипта:

data=[]

with open('hey.png','rb') as f:
	data = f.read()

res = ""

for i in range(0,len(data)):
	if data[i] == 73 and data[i+1] == 68 and data[i+2] == 65 and data[i+3] == 84:		 
		res += chr(data[i-1])

print(res)

И флаг найден:

1a563195d65c320ac5f8d4b7c46098f5.png

Таким образом анализ формата файла может приобретать разные формы, все зависит от поставленной цели. Самая сложная это конечно имплементация приложения, которое будет работать с неизвестным файлом и показывать не только сырые данные, но и позволять полностью обрабатывать содержимое в зависимости от типа представления значений. В случае же поиска какой-то последовательности, вид которой заранее известен, изучение бинарного формата файла становится не более чем мини-головоломкой.

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

© Habrahabr.ru