Бинарный файл linux это

Как запустить бинарный файл в Linux

У меня есть файл с именем commanKT и я хочу запустить его в терминале Linux. Может кто-то помочь, дав команду запустить этот файл? Я пытался ./commonRT , но я получаю сообщение об ошибке:

8 ответов

Чтобы выполнить двоичный файл или .run-файл в Linux из оболочки, используйте косую черту друга

и если произойдет сбой, скажем, из-за разрешений, вы можете попробовать это перед выполнением

Надеюсь, это поможет

🙂 Если вы не опечатка, почему вы используете ./commonRT вместо ./commonKT ??

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

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

Обратите внимание на несоответствия, такие как -msse4.2 [enabled] на хосте сборки, но отсутствует sse4_2 флаг в возможностях процессора.

Если это не помогает, предоставьте выходные данные ldd commonKT как на хосте сборки, так и на хосте выполнения.

Это ответ на @craq:

Я только что скомпилировал файл из источника C и установил его для запуска с помощью chmod. От gcc не было ни предупреждений, ни сообщений об ошибках.

Я немного удивлен, что вам пришлось «установить его на исполняемый файл» — мой gcc всегда устанавливает сам флаг исполняемого файла , Это говорит о том, что gcc не ожидал, что это будет конечный исполняемый файл, или что он не ожидал, что он будет исполняемым в этой системе.

Теперь я попытался создать объектный файл, вот так:

( hello.c — типичная программа «Hello World».) Но мое сообщение об ошибке немного отличается:

С другой стороны, таким образом, выходные данные команды file идентичны вашей:

Тогда как, если я правильно скомпилирую, его вывод будет намного длиннее.

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

Единственный способ, который подходит мне ):

Затем запустите его, написав

Если вы получили ошибку разрешения, вам может потребоваться запустить приложение с привилегиями root:

опция компиляции -c делает компиляцию только компиляцией и сборкой, но без ссылки.

Если это не опечатка, как указывалось ранее, это может быть неправильными параметрами компилятора, такими как компиляция 64-битной под 32-битной. Это не должен быть набор инструментов.

полный путь для двоичного файла. Например: /home /vitaliy2034 /имя_бинального_файла. Или же используйте директиву «./+binary_file_name». ‘./’ в системе unix возвращает полный путь к каталогу, в котором вы открываете терминал (оболочку). Я надеюсь, что это помогает. Извините за мой английский язык)

Источник

Понимание того, что делает бинарный файл Linux

Недавно у меня была задача понять бинарную программу для Linux. Однако программа была в двоичном виде.

Я использовал команды file , strings и objdump иметь некоторое представление о том , что она делает, и какие функции он звонит.

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

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

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

strings — печатать строки печатаемых символов в файлах.
Для каждого заданного файла в строках GNU печатаются последовательности печатаемых символов длиной не менее 4 символов (или число, указанное в приведенных ниже параметрах), за которыми следует непечатаемый символ.

file позволяет увидеть исполняемые свойства, а именно:

  • архитектура, на которую он нацелен;
  • ОС;
  • если динамически или статически связаны;
  • если скомпилировано с отладочной информацией или нет.
Читайте также:  Проблемы яндекс браузера с windows 10

В этом примере «not stripped» означает, что он был скомпилирован с включенной информацией отладки.

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

objdump создает список разборки исполняемого файла:

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

objdump также перечисляет внешние функции, динамически связанные во время выполнения:

$ objdump -T exe_file

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

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

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

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

Он также может быть отлажен шаг за шагом gdb .

Назначение отладчика, такого как GDB, состоит в том, чтобы вы могли видеть, что происходит «внутри» другой программы во время ее выполнения.

Чтобы отслеживать / создавать дампы большей части своей системной активности, выполняющей его, используйте sysdig как в:

sysdig это инструмент для устранения неполадок, анализа и исследования системы. Он может использоваться для захвата, фильтрации и декодирования системных вызовов и других событий ОС. sysdig может использоваться как для проверки работающих систем, так и для генерации файлов трассировки, которые можно проанализировать на более позднем этапе.

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

Мы еще раз разберемся со статическим анализом самого двоичного файла в оставшейся части этого ответа.

ldd exe_file перечисляет библиотеки, которые он использует;

ldd печатает общие объекты (общие библиотеки), необходимые для каждой программы или общего объекта, указанного в командной строке.

size -A exe_file

size Утилита GNU перечисляет размеры разделов — и общий размер — для каждого из объектных или архивных файлов objfile в своем списке аргументов. По умолчанию генерируется одна строка вывода для каждого объектного файла или каждого модуля в архиве.

readelf -x .rodata exe_file перечисляет статические строки

readelf -h exe_file получает информацию заголовка ELF

readelf -s exe_file отображает символы

readelf отображает информацию об одном или нескольких объектных файлах формата ELF. Опции управляют отображением конкретной информации.

elffile . объектные файлы, которые нужно исследовать. Поддерживаются 32-битные и 64-битные файлы ELF, а также архивы, содержащие файлы ELF.

nm exe_file перечисляет символы из таблицы объектов:

nm перечисляет символы из объектных файлов objfile . Если никакие объектные файлы не указаны в качестве аргументов, nm принимает файл a.out.

Помимо разборки двоичного файла с objdump помощью декомпилятора также можно использовать.

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

Я пытался использовать Бумеранг и Снеговик. Проект Бумеранг кажется заброшенным, и меня не впечатлили ограничения обоих из них. Несколько других альтернатив, либо open source / freeware / old, включая недавно выпущенный Avast, декомпилировали только 32-битные двоичные файлы.

В итоге я попробовал демо-версию Hopper в MacOS (она также имеет версию для Linux).

Hopper Disassembler, инструмент для обратного проектирования, который позволяет вам разбирать, декомпилировать и отлаживать ваши приложения.

Hopper разбирает и декомпилирует 32- или 64-битные двоичные файлы для OS / X, Linux и Windows. Он способен работать с большими двоичными файлами при получении лицензии.

Он также создает потоковые графики функций / структуры программы и переменных.

Он также активно поддерживается и обновляется. Однако это коммерческий.

Мне так нравилось пользоваться им и полученным результатом, который купил лицензию. Лицензия гораздо более доступная, чем шестнадцатеричное излучение.

В комментариях к этому ответу @ d33tah и @Josh также упоминают в качестве альтернативы с открытым исходным кодом radare2, и соответствующий графический интерфейс Cutter , похожий на Hopper в Linux, не может поручиться лично за него, поскольку я их не использую.

Читайте также:  Создать один образ windows

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

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

Улучшение качества выходного источника и понимание двоичного кода всегда будет означать некоторое время и детективную работу. Декомпиляторы только делают большую часть работы.

Пример вывода Hopper без отладочной информации:

Графический интерфейс Hopper также очень удобен (несколько функций, одновременно расширенных на этом рисунке):

см. также связанный с этим вопрос. Почему истина и ложь так велики?

Источник

Находим и устраняем уязвимости бинарных файлов в Linux — с утилитой checksec и компилятором gcc

Изображение: Internet Archive Book Images. Modified by Opensource.com. CC BY-SA 4.0

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

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

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

  • как использовать утилиту checksec для поиска уязвимостей;
  • как использовать компилятор gcc для устранения найденных уязвимостей.

Установка checksec

Для Fedora OS и других систем на базе RPM:

Для систем на базе Debian используйте apt.

Быстрый старт с checksec

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

Давайте запустим checksec для утилиты просмотра содержимого каталогов (ls):

Выполнив команду в терминале, вы получите отчёт о том, какими полезными свойствами обладает этот бинарник, и какими не обладает.

Первая строка — это шапка таблицы, в которой перечислены различные свойства безопасности — RELRO, STACK CANARY, NX и так далее. Вторая строка показывает значения этих свойств для бинарного файла утилиты ls.

Hello, бинарник!

Я скомпилирую бинарный файл из простейшего кода на языке С:

Обратите внимание, что пока я не передал компилятору ни одного флага, за исключением -o (он не относится к делу, а просто говорит, куда выводить результат компиляции):

Теперь запущу утилиту checksec для моего бинарника. Некоторые свойства отличаются от свойств

Checksec позволяет использовать различные форматы вывода, которые вы можете указать с помощью опции —output. Я выберу формат JSON и сделаю вывод более наглядным с помощью утилиты jq:

Анализ (checksec) и устранение (gcc) уязвимостей

Созданный выше бинарный файл имеет несколько свойств, определяющих, скажем так, степень его уязвимости. Я сравню свойства этого файла со свойствами бинарника ls (тоже указаны выше) и объясню, как это сделать с помощью утилиты checksec.

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

1. Отладочные символы

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

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

Сhecksec показывает, что отладочные символы присутствуют в моём бинарнике, но их нет в файле ls.

То же самое может показать запуск команды file. Символы не удалены (not stripped).

Как работает checksec

Запустим эту команду с опцией —debug:

Так как утилита checksec — это один длинный скрипт, то для его изучения можно использовать функции Bash. Выведем команды, которые запускает скрипт для моего файла hello:

Особое внимание обратите на echo_message — вывод сообщения о том, содержит ли бинарник отладочные символы:

Утилита checksec использует для чтения двоичного файла команду readelf со специальным флагом —symbols. Она выводит все отладочные символы, которые содержатся в бинарнике.

Из содержимого раздела .symtab можно узнать количество найденных символов:

Как удалить отладочные символы после компиляции

В этом нам поможет утилита strip.

Читайте также:  Загрузка службы при запуске linux

Как удалить отладочные символы во время компиляции

При компиляции используйте флаг -s:

Убедиться, что символы удалены, можно и с помощью утилиты checksec:

2. Canary

Canary (осведомители) — это «секретные» значения, которые хранятся в стеке между буфером и управляющими данными. Они используются для защиты от атаки переполнения буфера: если эти значения оказываются изменены, то стоит бить тревогу. Когда приложение запускается, для него создаётся свой стек. В данном случае это просто структура данных с операциями push и pop. Злоумышленник может подготовить вредоносные данные и записать их в стек. В этом случае буфер может быть переполнен, а стек повреждён. В дальнейшем это приведёт к сбою работы программы. Анализ значений canary позволяет быстро понять, что произошёл взлом и принять меры.

Включаем canary

Для этого при компиляции используем флаг -stack-protector-all:

Вот теперь сhecksec может с чистой совестью сообщить нам, что механизм canary включён:

3. PIE

Включённое свойство PIE позволяет произвольно размещать в памяти исполняемый код независимо от его абсолютного адреса:

PIE (Position Independent Executable) — исполняемый позиционно-независимый код. Возможность предсказать, где и какие области памяти находятся в адресном пространстве процесса играет на руку взломщикам. Пользовательские программы загружаются и выполняются с предопределённого адреса виртуальной памяти процесса, если они не скомпилированы с опцией PIE. Использование PIE позволяет операционной системе загружать секции исполняемого кода в произвольные участки памяти, что существенно усложняет взлом.

Часто свойство PIE включают только при компиляции библиотек. В выводе ниже hello помечен как LSB executable, а файл стандартной библиотеки libc (.so) — как LSB shared object:

Checksec получает эту информацию следующим образом:

Если вы запустите эту же команду для библиотеки, то вместо EXEC увидите DYN:

Включаем PIE

При компиляции программы нужно указать следующие флаги:

Чтобы убедиться, что свойство PIE включено, выполним такую команду:

Теперь у нашего бинарного файла (hello) тип сменится с EXEC на DYN:

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

Чтобы получить информацию о свойстве NX, checksec вновь использует команду readelf. В данном случае RW означает, что стек доступен для чтения и записи. Но так как в этой комбинации отсутствует символ E, на выполнение кода из этого стека стоит запрет:

Отключение NX

Отключать свойство NX не рекомендуется, но сделать это можно так:

После компиляции мы увидим, что права доступа к стеку изменились на RWE:

5. RELRO

В динамически слинкованных бинарниках для вызова функций из библиотек используется специальная таблица GOT (Global Offset Table). К этой таблице обращаются бинарные файлы формата ELF (Executable Linkable Format). Когда защита RELRO (Relocation Read-Only) включена, таблица GOT становится доступной только для чтения. Это позволяет защититься от некоторых видов атак, изменяющих записи таблицы:

В данном случае включено только одно из свойств RELRO, поэтому checksec выводит значение «partial». Для отображения настроек сhecksec использует команду readelf.

Включаем полную защиту (FULL RELRO)

Для этого при компиляции нужно использовать соответствующие флаги:

Всё, теперь наш бинарник получил почётное звание FULL RELRO:

Другие возможности checksec

Тему безопасности можно изучать бесконечно. Даже, рассказывая про простую утилиту checksec в этой статье, я не смогу охватить всё. Тем не менее, упомяну ещё несколько интересных возможностей.

Проверка нескольких файлов

Нет необходимости для каждого файла запускать отдельную команду. Можно запустить одну команду сразу для нескольких бинарных файлов:

Проверка процессов

Утилита checksec также позволяет анализировать безопасность процессов. Следующая команда отображает свойства всех запущенных программ в вашей системе (для этого нужно использовать опцию —proc-all):

Вы также можете выбрать для проверки один процесс, указав его имя:

Проверка ядра

Аналогично вы можете анализировать уязвимости в ядре вашей системы.

Предупреждён — значит вооружён

Подробно изучите свойства безопасности и попытайтесь понять, на что именно влияет каждое из них и какие виды атак это позволяет предотвратить. Checksec вам в помощь!

Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Источник

Оцените статью