Телефон: 8-800-350-22-65
WhatsApp: 8-800-350-22-65
Telegram: sibac
Прием заявок круглосуточно
График работы офиса: с 9.00 до 18.00 Нск (5.00 - 14.00 Мск)

Статья опубликована в рамках: CXIV Международной научно-практической конференции «Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ» (Россия, г. Новосибирск, 13 июня 2022 г.)

Наука: Технические науки

Секция: Технологии

Скачать книгу(-и): Сборник статей конференции

Библиографическое описание:
Морозов А.С. БАЗОВЫЕ МЕТОДЫ МОДИФИКАЦИИ ДВОИЧНЫХ ИСПОЛНЯЕМЫХ ФАЙЛОВ ОПЕРАЦИОННОЙ СИСТЕМЫ GNU/LINUX // Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ: сб. ст. по мат. CXIV междунар. студ. науч.-практ. конф. № 6(113). URL: https://sibac.info/archive/technic/6(113).pdf (дата обращения: 28.11.2024)
Проголосовать за статью
Конференция завершена
Эта статья набрала 0 голосов
Дипломы участников
У данной статьи нет
дипломов

БАЗОВЫЕ МЕТОДЫ МОДИФИКАЦИИ ДВОИЧНЫХ ИСПОЛНЯЕМЫХ ФАЙЛОВ ОПЕРАЦИОННОЙ СИСТЕМЫ GNU/LINUX

Морозов Алексей Сергеевич

слушатель, Академия Федеральной службы охраны Российской Федерации,

РФ, г. Орёл

Лисичкин Владимир Георгиевич

научный руководитель,

д-р техн. наук, доц., Академия Федеральной службы охраны Российской Федерации,

РФ, г. Орёл

BASIC METHODS FOR MODIFYING BINARY EXECUTABLE FILES OF THE GNU/LINUX OPERATING SYSTEM

 

Alexey Morozov

listener, Academy of the Federal Security Service of the Russian Federation,

Russia, Oryol

Vladimir Lisichkin

scientific adviser, Doctor of Technical Sciences, Associate Professor, Academy of the Federal Security Service of the Russian Federation,

Russia, Oryol

 

АННОТАЦИЯ

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

ABSTRACT

The article is devoted to some approaches to the analysis and modification of executable files. Today, malware is increasingly obfuscated and seeks to deceive analysts. Many methods of analysis are used to understand how the file works and to establish the true properties of binary programs. One such method is to modify binary programs. Also, such changes can help not only to understand how the "black box" works, but also create a vulnerability for further exploitation. So it's up to you which way to go.

 

Ключевые слова: реверс-инжиниринг, бинарная эксплуатация, двоичный файл, GNU/LINUX, информация, безопасность.

Keywords: reverse engineering, binary exploitation, binary file, GNU/LINUX, information, security.

 

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

Подавляющее большинство современных программ написаны на языках программирования C/C++ . Написанный код компьютер, разумеется, выполнять не может, поэтому его необходимо компилировать. В результате чего появляется двоичный исполняемый файл, содержащий машинный код. Проблема заключается в том, что нельзя с уверенностью сказать, что полученный исполняемый файл имеет такую же семантику как исходный. Тут и понадобится навыки, методы, подходы к анализу программ.

Анализ двоичных файлов или двоичный анализ – наука и искусство анализа свойств двоичных компьютерных программ, а также машинного кода и данных, которые они содержат. Основная цель анализа – определить (и, возможно, модифицировать) истинные свойства двоичных программ.

Существует два основных метода анализа [1]:

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

Динамический анализ – это обратная сторона статического анализа. Запускают программу и анализируют её во время выполнения. Этот подход, по моему мнению, будет несколько проще, потому что можно просматривать состояния программы, включая значения переменных и выбор ветвей при условном выполнении. Основные сложности двоичного анализа заключаются в следующем:

  1. Отсутствует символическая информация.
  2. Отсутствует информация о типах данных.
  3. Отсутствуют выскоуровневые абстракции.
  4. Код и данные перемешаны.
  5. Код и данные зависят от положения.

Данная статья посвящена исполняемым файлам под операционную систему семейства GNU/LINUX, поэтому необходимо рассмотреть устройство двоичного файла с названием ELF или Execute Linkable File.

Как все исполняемые файлы, у ELF есть сегменты: .text, .bss, .data и .rodata (таблица 1).

Таблица 1

Сегменты

.text

Содержит основной код программы, именно она часто является главным объектом внимания в процессе обратной разработки.

.bss

Предназначена для неинициализированных переменных и подразумевает резервирование блоков памяти для переменных

.data

Здесь хранятся начальные значения инициализированных переменных, которая допускает запись, потому что значения в таких переменных, могут изменяться во время выполнения программы

.rodata

Данная секция хранит значения константных значений и не допускает записи.

 

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

В каждом исполняемом откомпилированном файле для различных операционных систем имеется заголовок программы, в котором содержится первоначальная и необходимая информация для компьютера о файле. Например, имеется файл с названием fileless. Для того, чтобы понять какой это исполняемый файл, достаточно открыть его в шестнадцатеричном редакторе.

На рисунке 1 можно увидеть последовательность байт и слово ELF. Первые 32 символа или 16 байт называются магическими, потому что по ним компьютер определяет программу.

 

Рисунок 1. Магические числа ELF

 

В таблице 2 представлены эти значащие байты и что они обозначают. Стоит отметить, что не все байты используются.

Настало время приступить к модификации двоичного файла, используя шестнадцатеричный редактор. Это изменение является самым примитивным и простым способом модифицировать двоичный файл. Этот редактор показывает байты программы, которые являются инструкциями процессора. Например, инструкция компьютера NOP (NO OPERATION), которая ничего не делает, занимает один байт и в шестнадцатеричном виде будет представлена как 0x90.  Например, откроем файл с названием fileless и попробуем изменить заголовок программы на инструкцию NOP. Начальная строка записана последовательностью байт 47 4E 55, теперь посмотрим, как выглядит инструкция, которая ничего не делает (рисунок 2).

Таблица 2

Магические числа ELF

7F

Это значение является доказательством того, что файл действительно является исполняемым для семейства операционных систем GNU/LINUX

45 4C 46

Данные числа – это значения букв в таблице ASCII-256 и обозначают соответственно E L F

02

Это байт обозначающий «класс» двоичного файла. В данном случае «класс» подразумевает архитектуру двоичного файла:

0x01 – 32-разрядный и 0x02 – 64-разрядный

01

На 5 позиции располагается байт обозначающий порядок следования байт прямой или обратный. Прямой порядок 0x01, а обратный порядок 0x02

01

Версия спецификации ELF, который отвечает двоичный файл

00

На 7 позиции стоит байт описывающий двоичный интерфейс приложения (ABI)

00

Последний значимый байт заголовка программы, который содержит номер версии ABI, обычно равен 0

Числа на позициях от 9 до 15

 На данный момент заполнены нулями, потому что являются байтами заполнения и нужны для будущего использования

 

Рисунок 2. Начальная строчка «GNU»

 

Как можно заметить, байты изменены и в отображении ничего нет. Можно сказать, что программа теперь изменена и может работать не так, как ожидается (рисунок 3).

 

Рисунок 3. Измененная строчка «GNU»

 

Часто такое модифицирование программы нужно для исправлений всего лишь нескольких инструкций. Одна из классических ошибок – ошибка на единицу. Такая ошибка встречается чаще всего в циклах, когда программист ставит неправильное условие. Допустим, программисту надо было зашифровать строчку, используя симметричное шифрование XOR. Строка имеет длину 16 символов, а программист шифрует не 16 символов, а 15 из-за чего последний символ остается без изменений.

Следующий метод модификации двоичного файла является замена стандартных библиотек.  Основной целью является модификация поведения функции из разделяемой библиотеки. Вместо того, чтобы работать в шестнадцатеричном редакторе достаточно воспользоваться механизмом LD_PRELOAD [2, 3].

LD_PRELOAD – имя переменной окружения, которая позволяет влиять на поведение компоновщика. Она позволяет загружать одну или несколько библиотек, которые компоновщик должен загрузить раньше всех остальных, в том числе и стандартных системных библиотек. Этот механизм позволяет замещать библиотечные функции собственными версиями.

На практике удобно использовать для обхода шифрования, где, например, ключ является какое-нибудь случайное число. Редактировать по байтам такую функцию, которая включена в стандартную библиотеку можно, но только это займет очень много времени. Поэтому следует поступить иначе. Просто необходимо создать файл с самописной функцией rand (), чтобы она, допустим, всегда выдавала 0. Скомпилировать файл как библиотеку и через терминал прописать команду «LD_PRELOAD=$PWD ./mylib.so ./a.out». После этого функция rand () будет изменена.

Техники модификации двоичных ELF-файлов являются не осень гибкими, и годятся только для внесения небольших изменений. Более серьезные методы изменения является инъекция кода, перезапись глобальной таблицы смещения и заглушек. Описанное выше является базой для дальнейшего развития в этой области и на данный момент создаются более мощные и современные методы изменений исполняемых файлов и следует уметь распознавать такие изменения. Простейшим методом выявления модификации двоичного файла – это сравнение хэш. Хэш есть у каждой программы и появляется на момент завершения компиляции, а также является уникальным. Если по какой-то причине программа была изменена, то генерируется новый хэш. Этот шаг можно взять за основу к дальнейшему анализу исполняемого файла.

 

Список литературы:

  1. Эндриресс Д. Практический анализ двоичных файлов / пер. с англ. А.А. Слинкина. – М.: ДМК Пресс, 2021. – 460 с.
  2. Сикорски М., Хониг Э. Вскрытие покажет! Практический анализ вредоносного ПО. – СПб.: Питер, 2018. – 768 с.
  3. Рудаков П.И., Финогенов К.Г. Язык ассемблера: уроки программирования. – М.: ДИАЛОГ-МИФИ, 2001. –  640 с.
Проголосовать за статью
Конференция завершена
Эта статья набрала 0 голосов
Дипломы участников
У данной статьи нет
дипломов

Оставить комментарий

Форма обратной связи о взаимодействии с сайтом
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.