Почему добавление и удаление символа в исполняемом файле в /bin вызывает сегфолт?

Вопрос или проблема

Насколько я понимаю, в /bin находятся некоторые бинарные исполняемые файлы, которые просто скомпилированные программы на C. Из любопытства я решил поиграть с ними и открыл ls с правами sudo с помощью nano и добавил символ 0 в начале. Я сохранил файл и, к своему удивлению, проверил, что действительно выполнение команды ls в терминале не работает.

Что я не ожидал, так это того, что после удаления этого добавленного символа команда ls все равно не работает и вызывает ошибку сегментации.

Если файлы, содержащиеся в /bin, представляют собой просто машинный код с единицами и нулями, почему удаление символа, который мы добавили ранее, не приводит к тому, что программа работает?

Редактирование бинарного файла с помощью текстового редактора может сработать или не сработать — на практике обычно это не срабатывает. Редактор может вносить различные изменения, такие как исправление концов строк (например, если последовательность байтов в файле содержала \r\n, редактор может “исправить” это на \n, или исправить вхождения только \n на \r\n), добавляя завершающий перенос строки, если файл не заканчивается на него, и т. д. С высокой вероятностью бинарный файл ls действительно мог быть поврежден в результате такого изменения. Вы можете сравнить вывод od -c или hexdump на оригинальных и измененных файлах, чтобы увидеть, что именно изменилось. И рассмотрите возможность использования шестнадцатеричного редактора в будущем (Пожалуйста, порекомендуйте шестнадцатеричный редактор для оболочки) для редактирования не текстовых файлов.

Ответ или решение

Когда вы редактируете исполняемые файлы, такие как бинарные программы в каталоге /bin, необходимо учитывать, что эти файлы представляют собой скомпилированный машинный код, а не текст в обычном понимании. Использование текстового редактора, такого как nano, для изменения бинарного файла может привести к непредсказуемым последствиям, включая ошибку сегментации (segfault).

1. Изменение бинарного файла

Когда вы добавляете символ, например, 0, в начале файла ls, вы фактически нарушаете его структуру. Исполняемые файлы имеют строго определённый формат, такой как ELF (Executable and Linkable Format) на Linux, который включает заголовок, таблицы секций, коды и данные. Заголовок файла определяет, как операционная система должна интерпретировать и загружать программу в память. Если вы измените байты в заголовке, программа может не загрузиться должным образом, что приведёт к ошибкам при выполнении.

2. Возвращение к исходному состоянию

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

3. Проблемы с форматом

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

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

4. Диагностика проблемы

Для диагностики проблем с бинарными файлами можно использовать инструменты, такие как od -c или hexdump, чтобы сравнить оригинальный и отредактированный файлы. Это даст ясное представление о том, что именно было изменено. Также следует заметить, что в будущем использование шестнадцатеричного редактора (hex editor) вместо текстового редактора позволит избежать подобных проблем, обеспечивая безопасное редактирование бинарных данных.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...