Работа с магическими числами в Linux
Цель этой статьи - дать введение в магические числа и заголовки файлов, как извлечь файл на основе магических чисел и как повредить и восстановить файл на основе магических чисел в среде 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 byteThe 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-файла из вывода:
- Найдите начальное смещение файла, который вы хотите извлечь: в этом примере мы хотим извлечь zip-файл из PNG. Итак, сначала ищем заголовок ZIP. Как показано на предыдущем рисунке, мы выполняем команду 'xxd output.png | grep «PK» '. На этом рисунке мы видим смещение в левом столбце. Для zip-файла смещение будет 00001c90.
- Вычислите количество бит от смещения, с которого начинается заголовок вашего файла: теперь мы должны вычислить количество бит от смещения, с которого начинается zip-файл. Мы можем подсчитать это вручную и увидеть, что это 00001c95 (каждое шестнадцатеричное значение соответствует 1 биту)
- Преобразуйте это шестнадцатеричное значение в десятичное: это можно сделать, открыв python IDLE (введите python в терминале Linux. Теперь мы должны преобразовать это значение в десятичное. В python IDLE мы должны просто добавить 0x в начало значение, найденное на предыдущем шаге.
- Используйте следующую команду:
'dd if = * входной файл * bs = 1 skip = * значение вычислено на шаге 3 * of = * имя выходного файла * '
В вышеупомянутой команде 'if' обозначает входной файл, 'skip' обозначает количество битов, которые необходимо пропустить, чтобы достичь начала файла, который мы хотим извлечь, 'bs' относится к количеству байтов. которые необходимо читать за раз, а «из» относится к имени выходного файла.
На рисунке ниже показано использование шагов 3 и 4:
- Извлечение файлов: теперь мы можем открыть текущий рабочий каталог из терминала, чтобы просмотреть извлеченный zip-файл, набрав:
наутилус ./
Как испортить файл, изменив его магический номер?
Изменение магических номеров файла делает файл бесполезным. Нам будет отображаться ошибка всякий раз, когда мы пытаемся открыть файл с искаженным заголовком.
- Скачать шестнадцатеричный редактор : чтобы испортить файл, нам потребуется шестнадцатеричный редактор. hexedit - популярный инструмент, используемый для тех же целей. Вы можете установить его, используя:
sudo apt-get install hexedit
Вы можете открыть файл, набрав
hexedit image.png
Вы увидите такой вывод:
- Измените файл: чтобы изменить байт с помощью 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».
Обладая этими знаниями, все, что нам нужно было бы сделать, это попробовать эти комбинации в качестве заголовков для файла. Это требует того же процесса, что и повреждение файла.
- Открытый гекс
- Измените первые несколько байтов, наведя курсор на нужные значения.
- Сохранить (Ctrl X) и выйти
- Попробуйте открыть файл. Повторите шаги со следующим возможным магическим числом, если файл не открывается
При изменении магических байтов на FFD8 FFE0 картинка открывается правильно.
Эта статья предоставлена Дипаком Шриватсавом . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.