Работа с магическими числами в Linux

Опубликовано: 14 Июля, 2021

Цель этой статьи - дать введение в магические числа и заголовки файлов, как извлечь файл на основе магических чисел и как повредить и восстановить файл на основе магических чисел в среде Linux.

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

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

Эти байты могут использоваться системой для « различения и распознавания разных файлов » без расширения файла.

Поиск магических чисел в подписях файлов

Большинство файлов имеют подписи в байтах в начале файла, но некоторые файловые системы могут даже иметь подпись файла со смещениями, отличными от начала. Например, в файловой системе ext2 / ext3 байты 0x53 и 0xEF занимают 1080 и 1081 позицию.

  • Однако некоторые файлы не имеют магических номеров, например, текстовые файлы, но могут быть идентифицированы путем проверки набора символов (ASCII в случае текстовых файлов).
    Это можно сделать с помощью команды:
     файл -i * имя_файла *
    
  • Магические числа / подписи файлов обычно не видны пользователю, но их можно увидеть с помощью шестнадцатеричного редактора или с помощью команды «xxd», как указано ниже. Эти байты необходимы для открытия файла.
  • Изменение / повреждение этих байтов сделает файл бесполезным, поскольку большинство инструментов не будут обращаться к этим файлам из-за потенциального повреждения.
  • Команда file в читателе Linux считывает магические числа файла и отображает тип файла на основе магического числа.
  • Например, возьмем пример файла PNG. Мы можем просмотреть шестнадцатеричный файл файла, набрав следующую команду в терминале Linux (в этой статье используется kali Linux). Эта команда создает шестнадцатеричный дамп файла, который мы ей передаем.
     xxd image.png | глава
    

Это дает следующий результат: -

На этом изображении мы видим, что первый набор байтов файла

 89 50 4e 47 0d 0a 1a 0a 
// магический номер файла PNG

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

Пример Zip-файла. Аналогичным образом используйте вышеупомянутую команду для zip-файла.

 xxd test.zip | глава

На изображении выше мы видим, что файл начинается с:

 50 4b 03 04
// магический номер zip файла

Добавление одного файла к другому и определение деления с помощью магических чисел

Мы можем использовать python для выполнения этой операции. По сути, мы будем читать байты двух файлов и записывать их один за другим в другой пустой файл. В этой статье мы объединим PNG с файлом Zip.




"""
The first two lines open the two files to be read byte by byte
The third line opens an output file to be written to byte by byte
"""
input_file_1 = open ( "image.png" , 'rb' ).read()
input_file_2 = open ( "test.zip" , 'rb' ).read()
output_file = open ( "output.png" , 'wb' )
output_file.write(input_file_1)
output_file.write(input_file_2)

Используя этот код Python, мы получаем файл output.png. При запуске команды:

 xxd output.png | глава

в этом файле мы замечаем, что он начинается с того же шестнадцатеричного числа 8950 4e47 0d0a 1a0a. Однако, если мы запустим команду

 xxd output.png | grep "PK"

который будет искать магические числа (PK - это ASCII эквивалент 50 4b) zip-файла среди шестнадцатеричного,
мы получим следующий результат:

На этом изображении мы видим, что магические числа zip-файла присутствуют в шестнадцатеричном формате png, что означает, что мы успешно добавили шестнадцатеричное значение zip-файла к шестнадцатеричному файлу png. Следующим шагом будет отделение этого zip-файла от png.
Существует простая утилита binwalk, которая помогает нам легко выполнить эту задачу, набрав:

 binwalk -e output.png
-e означает извлечение

Как использовать магические числа и смещения для извлечения zip-файла из вывода:

  1. Найдите начальное смещение файла, который вы хотите извлечь: в этом примере мы хотим извлечь zip-файл из PNG. Итак, сначала ищем заголовок ZIP. Как показано на предыдущем рисунке, мы выполняем команду 'xxd output.png | grep «PK» '. На этом рисунке мы видим смещение в левом столбце. Для zip-файла смещение будет 00001c90.
  2. Вычислите количество бит от смещения, с которого начинается заголовок вашего файла: теперь мы должны вычислить количество бит от смещения, с которого начинается zip-файл. Мы можем подсчитать это вручную и увидеть, что это 00001c95 (каждое шестнадцатеричное значение соответствует 1 биту)
  3. Преобразуйте это шестнадцатеричное значение в десятичное: это можно сделать, открыв python IDLE (введите python в терминале Linux. Теперь мы должны преобразовать это значение в десятичное. В python IDLE мы должны просто добавить 0x в начало значение, найденное на предыдущем шаге.
  4. Используйте следующую команду:
     'dd if = * входной файл * bs = 1 skip = * значение
    вычислено на шаге 3 * of = * имя выходного файла * '

    В вышеупомянутой команде 'if' обозначает входной файл, 'skip' обозначает количество битов, которые необходимо пропустить, чтобы достичь начала файла, который мы хотим извлечь, 'bs' относится к количеству байтов. которые необходимо читать за раз, а «из» относится к имени выходного файла.
    На рисунке ниже показано использование шагов 3 и 4:

  5. Извлечение файлов: теперь мы можем открыть текущий рабочий каталог из терминала, чтобы просмотреть извлеченный zip-файл, набрав:
     наутилус ./
    

Как испортить файл, изменив его магический номер?

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

  1. Скачать шестнадцатеричный редактор : чтобы испортить файл, нам потребуется шестнадцатеричный редактор. hexedit - популярный инструмент, используемый для тех же целей. Вы можете установить его, используя:
     sudo apt-get install hexedit
    

    Вы можете открыть файл, набрав

     hexedit image.png
    

    Вы увидите такой вывод:

  2. Измените файл: чтобы изменить байт с помощью hexedit, вам просто нужно переместить курсор на байт и ввести то, что вы хотите. Для этой статьи я изменю магические числа с 89 50 на 00 00.
    Чтобы сохранить и выйти, нажмите ctrl X, а затем Y.

На изображении выше мы видим, что первые 2 байта были изменены на 00 00, а справа мы видим, что текст изменился с .PNG на ..NG

Как восстановить файл с поврежденным магическим номером?

Давайте использовать пример, показанный на картинке выше, где я испортил первые два байта PNG. Если вы попытаетесь открыть PNG сейчас, вы получите сообщение об ошибке «Не удалось загрузить файл», а не «PNG». Это доказательство того, что система проверяет магическое число перед открытием файла. Зная, что магические числа PNG начинаются с 89 50, мы можем вернуть байтам их исходное значение.
Давайте посмотрим на другой пример, используя изображение jpeg.
Давайте сначала посмотрим, как выглядит рабочий шестнадцатеричный формат jpeg:

исходные байты магического числа

 FF D8 FF E0

JPEG с поврежденными магическими байтами будет выглядеть так:

Мы замечаем, что магические байты в этом

 EE A8 CC 00

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

Файл JPG обычно имеет магический номер «FFD8 DDE0», «FFD8 FFDB» или «FFD8 FFE1».
Обладая этими знаниями, все, что нам нужно было бы сделать, это попробовать эти комбинации в качестве заголовков для файла. Это требует того же процесса, что и повреждение файла.

    1. Открытый гекс
    2. Измените первые несколько байтов, наведя курсор на нужные значения.
    3. Сохранить (Ctrl X) и выйти
    4. Попробуйте открыть файл. Повторите шаги со следующим возможным магическим числом, если файл не открывается

При изменении магических байтов на FFD8 FFE0 картинка открывается правильно.

Эта статья предоставлена Дипаком Шриватсавом . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.