Как посмотреть бинарный файл в линукс

Linux: анализируем бинарные файлы. Часть 1. Программы.

Список программ для работы с двоичными файлами в операционной системе Linux .

GDB

GNU Debugger ( GDB ) — отладчик GDB хорош не только для отладки приложений с ошибками . Он также может использоваться для того, чтобы узнать о самом нижнем уровне управления программой, изменить этот нижний уровень управления программой, изменить код, регистры и структуры данных. Эти функции являются крайне полезными в процессе поиска уязвимостей программного обеспечения, изучения структуры и принципов работы вредоносного кода. Отладчик GDB работает с двоичными файлами ELF и процессами Linux .

Objdump

Objdump из GNU binutils . Дамп объекта ( objdump ) — простое и понятное решение для быстрого дизассемблирования программного кода. Objdump отлично подходит для дизассемблирования простых и неповреждённых двоичных файлов, но все его ограничения сразу выплывут на поверхность при попытке использовать objdump для любого, действительно сложного реверса, особенно в ситуациях, использования данной программы против вредоносного ПО. Основная слабость objdump заключается в том, что он, в своей работе, полностью полагается на заголовки раздела ELF и не выполняет необходимый анализ нижнего уровня управления . Оба эти ограничения значительно снижают надёжность программы , что приводит к невозможности правильно дизассемблировать код внутри двоичного файла, а возможно, что даже к возникновению ошибок при простой попытке открыть двоичный файл, не имеющий в своей структуре заголовков разделов. Однако, для многих простых и обычных задач, он идеально подходит . Например, при дизассемблировании обычных двоичных файлов , которые не расширяются , не удаляются , не используют обфускацию . Он может читать все распространенные типы двоичных ELF файлов. Вот несколько примеров использования программы objdump :

• Просмотрите все данные / код в каждом разделе файла ELF:

• Просмотр только программного кода в файле ELF:

Objcopy

Objcopy из GNU binutils. Копирование объекта ( Objcopy ) — невероятно мощный и миниатюрный инструмент, но при этом весь его функционал крайне тяжело уместить всего в нескольких предложениях. Я настоятельно рекомендую вам прочитать страницы руководства для изучения полного описания данной программы. Objcopy можно использовать для анализа и изменения объектов ELF любого типа , хотя некоторые из его функций специфичны для определенных типов объектов ELF. Objcopy часто используется для изменения или копирования раздела ELF в двоичный файл ELF или обратно, раздела ELF из файла.

Пример использования objcopy :

Для копирования секции .data из объекта ELF в файл , используйте следующую команду:

Читайте также:  Kali linux are you root

objcopy –only-section=.data

Strace

Трассировка системного вызова ( strace ) — это инструмент, основанный на системном вызове ptrace (2) , он

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

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

Команда strace , используемая для трассировки базовой программы :

strace / bin / ls -o ls.out

Команда strace , используемая для подключения к существующему процессу , выглядит следующим образом:

Первоначальный вывод команды ( по умолчанию ) покажет вам номер дескриптора файла каждого системного вызова , который принимает в качестве своего аргумента дескриптор файла, например:

SYS_read (2, buf, sizeof (buf));

Если вы хотите увидеть все данные, которые считывались в дескриптор файла 2 , вы можете выполнить следующую команду:

strace -e read = 2 / bin / ls

Вы также можете использовать параметр -e write = fd для просмотра записанных данных . Программа strace — отличный инструмент, и у вас, несомненно, будет целый ряд причин, чтобы его использовать.

ltrace

Библиотека трассировки ( ltrace ) — еще один мощный инструмент, который очень похож на strace . ltrace работает аналогично , но фактически анализирует информацию о связывании разделяемых библиотек программы и печатает используемые библиотечные функции .

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

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

Пример использования ltrace :

ftrace

Функция трассировки ( ftrace ) — это инструмент, очень похожий на ltrace , он

показывает вызовы функций внутри самого двоичного файла .

Программу ftrace можно скачать по следующему адресу: https://github.com/elfmaster/ftrace .

Readelf

Программа readelf — это пожалуй, один из самых полезных инструментов для анализа двоичных файлов формата ELF. Readelf анализирует каждый бит данных, используемый в формате ELF и позволяет получить большое количество информации об объекте ещё до его реверс инжиниринга . Readelf используется для сбора информации о символах , сегментах , разделах , записях релокации , динамическом связывании данных и ещё много другой полезной информации. Команда readelf — это

Швейцарский армейский нож для файлов формата ELF .

Примеры некоторых из наиболее часто используемых функций readelf:

Послесловие

А какие программы для анализа бинарных файлов в операционной системе Linux знаете и используете Вы? Поделитесь своим личным опытом и расскажите об этом в комментариях !

Другие материалы по теме анализа бинарных файлов в Linux

Источник

How to use bash script to read binary file content?

I want to read a character and then a fixed length of string (the string is not null terminated in the file, and its length is given by the preceding character). How can I do this in a bash script? How to define the string variable so that I can do some post-processing on it?

Читайте также:  Linux система управления компанией

5 Answers 5

If you want to stick with shell utilities, you can use head to extract a number of bytes, and od to convert a byte into a number.

export LC_ALL=C # make sure we aren't in a multibyte locale n=$(head -c 1 | od -An -t u1) string=$(head -c $n) 

However, this does not work for binary data. There are two problems:

    Command substitution $(…) strips final newlines in the command output. There’s a fairly easy workaround: make sure the output ends in a character other than a newline, then strip that one character.

string=$(head -c $n; echo .); string=$

If you have binary data, you’ll want to switch to a language like Perl or Python.

If you want to be able to deal with binary file in shell, the best option (only?) is to work with hexdump tool.

hexdump -v -e '/1 "%u\n"' binary.file | while read c; do echo $c done 
head -cX binary.file | hexdump -v -e '/1 "%u\n"' | while read c; do echo $c done 

Read length (and work with 0 as length) and then «string» as byte decimal value:

len=$(head -c1 binary.file | hexdump -v -e '/1 "%u\n"') if [ $len -gt 0 ]; then tail -c+2 binary.file | head -c$len | hexdump -v -e '/1 "%u\n"' | while read c; do echo $c done fi 

Rather than just present a bunch of commands, can you explain what they do and how they work? What do the options mean? What output can the user expect from your commands? Please do not respond in comments; edit your answer to make it clearer and more complete.

Well, I can copy manpages here, but I don’t see the point. There is only basic commands used here, the only trick is the usage of hexdump.

read -N stops at null bytes, so this is not a suitable way to work with binary data. In general, shells other than zsh can’t cope with nulls.

UPDATE (with hindsight). This question/answer (my answer) makes me think of the dog which keeps chasing the car.. One day, finally, he catches up to the car.. Okay, he caught it, but he really can’t do much with it. This anser ‘catches’ the strings, but then you can’t do much with them, if they have embedded null-bytes. (so a big +1 to Gilles answer.. another language may be in order here.)

Читайте также:  Активные процессы linux команда

dd reads any and all data. It certainly won’t baulk at zero as a «length». but if you have \x00 anywhere in your data, you will need to be creative how you handle it; dd has no propblems with it, but your shell script will have problems (but it depends on what you want to do with the data). The following basically outputs each «data string», to a file with a line divider between each strin.

btw: You say «character», and I assume you mean «byte».
but the word «character» has become ambiguous in these days of UNICODE, where only the 7-bit ASCII character-set uses a single byte per character. And even within the Unicode system, byte counts vary depending on the method of encoding characters, eg. UTF-8, UTF-16, etc.

Here is a simple script to highlight the difference between a Text «character» and bytes.

STRING="௵" echo "CHAR count is: $" echo "BYTE count is: $(echo -n $STRING|wc -c)" # CHAR count is: 1 # BYTE count is: 3 # UTF-8 ecnoded (on my system) 

If your length character is 1-byte long and indicates a byte-length, then this script should do the trick, even if the data contains Unicode characters. dd only sees bytes regardless of any locale setting.

This script uses dd to read the binary file and outputs the strings seperated by a «=== =================================»; echo $div ((skip=0)) # read bytes at this offset while ( true ) ; do # Get the «length» byte ((count=1)) # count of bytes to read dd if=binfile bs=1 skip=$skip count=$count of=datalen 2>/dev/null (( $( strlen=$((0x$(/dev/null ddgetct=$( echo -e «\n$div» >>dataline # add a newline for TEST PURPOSES ONLY. cat dataline # ((skip=skip+count)) # read bytes from and including this offset done # echo

This script builds test data which includes a 3-byte prefix per line.
The prefix is a single UTF-8 encoded Unicode character.

# build test data # =============== prefix="௵" # prefix all non-zero length strings will this obvious 3-byte marker. prelen=$(echo -n $prefix|wc -c) printf \\0 > binfile # force 1st string to be zero-length (to check zero-length logic) ( lmax=3 # line max . the last on is set to 255-length (to check max-length logic) for ((i=1;i<=$lmax;i++)) ; do # add prefixed random length lines suflen=$(numrandom /0..$((255-prelen))/) # random length string (min of 3 bytes) ((i==lmax)) && ((suflen=255-prelen)) # make last line full length (255) strlen=$((prelen+suflen)) printf \\$((($strlen/64)*100+$strlen%64/8*10+$strlen%8))"$prefix" for ((j=0;j>binfile # 

Источник

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