Команда Linux strings с практическими примерами

LinuxLinuxBeginner
Практиковаться сейчас

Введение

В этом практическом занятии (лабораторной работе) вы узнаете, как использовать команду Linux strings для извлечения печатаемых строк символов из бинарных файлов, включая исполняемые файлы, библиотеки и другие бинарные данные. Вы изучите назначение и способы использования команды strings, научитесь извлекать строки из сжатых и зашифрованных файлов и рассмотрите практические примеры применения этой команды в повседневной работе. В рамках этого практического занятия вы получите всестороннее понимание команды strings и ее применений, что позволит вам эффективно анализировать и устранять неполадки в бинарных файлах на системах Linux.

Сводка по командам Linux

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня средний с процентом завершения 55%. Он получил 100% положительных отзывов от учащихся.

Понимание назначения и базового использования команды strings

Команда strings в Linux представляет собой утилиту, которая извлекает текстовые строки, читаемые человеком, из бинарных файлов. Бинарные файлы, такие как исполняемые программы и библиотеки, содержат как машинный код, так и текстовые данные. В то время как машинный код нечитаем для человека, текстовые данные часто включают ценную информацию, такую как сообщения об ошибках, настройки конфигурации и встроенная документация.

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

cd ~/project/strings_lab

Теперь давайте рассмотрим базовое использование команды strings, изучив содержимое обычного бинарного файла - команды ls:

strings /bin/ls | head -20

Эта команда извлекает первые 20 читаемых строк из бинарного файла ls. Вы должны увидеть вывод, похожий на следующий:

/lib64/ld-linux-x86-64.so.2
libc.so.6
__stack_chk_fail
__cxa_finalize
setlocale
bindtextdomain
textdomain
__gmon_start__
abort
__errno_location
textdomain
dcgettext
dcngettext
strcmp
error
opendir
fdopendir
dirfd
closedir
readdir

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

  1. Поиска встроенного текста в исполняемых файлах
  2. Обнаружения жестко закодированных путей и настроек
  3. Базового судебно-экспертного анализа
  4. Устранения неполадок в бинарных файлах

Давайте попробуем более конкретный пример. Вы можете использовать команду grep вместе с strings для поиска определенного типа информации. Например, чтобы найти любые ссылки на "error" в команде ls:

strings /bin/ls | grep error

Ваш вывод может содержать:

error
strerror
strerror_r
__file_fprintf::write_error
error in %s
error %d

Команда strings также предоставляет несколько полезных опций для настройки ее поведения. Например, вы можете указать минимальную длину строк, которые будут отображаться:

strings -n 10 /bin/ls | head -10

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

/lib64/ld-linux-x86-64.so.2
__stack_chk_fail
__cxa_finalize
bindtextdomain
__gmon_start__
__errno_location
_ITM_registerTMCloneTable
_ITM_deregisterTMCloneTable
__cxa_atexit
__cxa_finalize

Еще одна полезная опция - -t, которая показывает смещение каждой строки в файле:

strings -t x /bin/ls | head -10

Вывод включает шестнадцатеричные смещения:

    238 /lib64/ld-linux-x86-64.so.2
    4ca __stack_chk_fail
    4dd __cxa_finalize
    4ec setlocale
    4f7 bindtextdomain
    507 textdomain
    512 __gmon_start__
    522 abort
    528 __errno_location
    539 textdomain

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

Анализ различных типов бинарных файлов с помощью команды strings

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

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

cd ~/project/strings_lab

Исследование системных библиотек

Системные библиотеки содержат код, который используется несколькими программами. Давайте рассмотрим общую системную библиотеку libc.so.6, которая представляет собой стандартную библиотеку C, используемую большинством программ на Linux:

strings /lib/x86_64-linux-gnu/libc.so.6 | head -20

Ваш вывод может выглядеть примерно так:

GNU C Library (Ubuntu GLIBC 2.35-0ubuntu3.4) stable release version 2.35.
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 11.4.0.
libc ABIs: UNIQUE IFUNC ABSOLUTE
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.
/build/glibc-bBNzrH/glibc-2.35/elf/../sysdeps/x86_64/startup.c
7e
m3
.n
zN
?$
?G
G0
5')
5$)

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

Поиск определенной информации в бинарных файлах

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

strings /bin/bash | grep '^\$' | head -10

Эта команда может вывести:

$HOME
$PATH
$SHELL
$TERM
$USER
$HOSTNAME
$PWD
$MAIL
$LANG
$LC_ALL

Это показывает все переменные окружения, на которые может ссылаться оболочка bash.

Анализ информации о версии

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

strings /bin/bash | grep -i version

Вывод может содержать:

GNU bash, version %s (%s)
version
VERSION
version_string
dist_version
show_shell_version
BASH_VERSION
GNU bash, version %s-(%s)
@(#)version.c
version.c

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

Создание простого бинарного файла для анализа

Давайте создадим простой бинарный файл, который содержит как бинарные данные, так и текстовые строки:

## Create a file with some text and binary data
echo "This is a visible string in our test file." > testfile.bin
echo "Another string that should be extractable." >> testfile.bin
## Add some binary data
dd if=/dev/urandom bs=100 count=1 >> testfile.bin 2> /dev/null
## Add one more text string
echo "Final string after some binary data." >> testfile.bin

Теперь используйте команду strings для извлечения текста из этого бинарного файла:

strings testfile.bin

Ваш вывод должен содержать все три текстовые строки:

This is a visible string in our test file.
Another string that should be extractable.
Final string after some binary data.

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

Работа с сжатыми и зашифрованными файлами

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

Убедитесь, что вы находитесь в директории практического занятия:

cd ~/project/strings_lab

Анализ сжатых файлов

Давайте создадим текстовый файл и сожмем его разными методами, чтобы увидеть, как команда strings обрабатывает сжатое содержимое:

Использование сжатия с помощью gzip

Сначала создадим простой текстовый файл с несколькими строками:

cat > sample_text.txt << EOF
This is a sample text file.
It contains multiple lines of text.
We will compress it in different ways.
Then we'll use the strings command to see what we can extract.
The strings command is useful for examining binary files.
EOF

Теперь сожмем этот файл с помощью gzip:

gzip -c sample_text.txt > sample_text.gz

Опция -c сообщает gzip записывать в стандартный вывод вместо замены исходного файла. Теперь используем strings, чтобы увидеть, что можно извлечь:

strings sample_text.gz

Вы можете увидеть вывод, похожий на следующий:

sample_text.txt
This is a sample text file.
It contains multiple lines of text.
We will compress it in different ways.
Then we'll use the strings command to see what we can extract.
The strings command is useful for examining binary files.

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

Использование разных форматов сжатия

Попробуем другой метод сжатия - bzip2:

bzip2 -c sample_text.txt > sample_text.bz2

Теперь проанализируем этот файл с помощью strings:

strings sample_text.bz2

Вывод может быть менее читаемым, чем при использовании gzip:

BZh91AY&SY
s1r
U*T)

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

Работа с зашифрованными файлами

Шифрование предназначено для того, чтобы сделать содержимое нечитаемым без правильного ключа. Давайте создадим зашифрованный файл и посмотрим, что можно извлечь с помощью strings:

## Create a file with a secret message
echo "This is a top secret message that should be encrypted." > secret.txt

## Encrypt the file using OpenSSL
openssl enc -aes-256-cbc -salt -in secret.txt -out secret.enc -k "password123" -pbkdf2

Теперь используем strings для анализа зашифрованного файла:

strings secret.enc

Вы можете увидеть вывод, похожий на следующий:

Salted__

Как и ожидалось, вы не можете увидеть исходное сообщение, так как оно было правильно зашифровано. Единственный читаемый текст - это заголовок "Salted__", который OpenSSL добавляет в начало зашифрованных файлов, чтобы указать, что при шифровании был использован соль.

Практическое применение: анализ сжатых журналов

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

## Create a simulated log file
cat > system.log << EOF
[2023-10-25 08:00:01] INFO: System startup completed
[2023-10-25 08:05:22] WARNING: High memory usage detected
[2023-10-25 08:10:15] ERROR: Failed to connect to database
[2023-10-25 08:15:30] INFO: Database connection restored
[2023-10-25 08:20:45] WARNING: CPU temperature above threshold
EOF

## Compress the log file
gzip -c system.log > system.log.gz

Теперь используем strings с дополнительными опциями для анализа сжатого журнала:

strings -n 20 system.log.gz

Опция -n 20 сообщает strings показывать только последовательности из 20 или более печатаемых символов. Ваш вывод может содержать:

[2023-10-25 08:00:01] INFO: System startup completed
[2023-10-25 08:05:22] WARNING: High memory usage detected
[2023-10-25 08:10:15] ERROR: Failed to connect to database
[2023-10-25 08:15:30] INFO: Database connection restored
[2023-10-25 08:20:45] WARNING: CPU temperature above threshold

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

Продвинутые способы использования и практические применения команды strings

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

Убедитесь, что вы по-прежнему находитесь в директории практического занятия:

cd ~/project/strings_lab

Комбинирование strings с другими командами

Настоящая мощь команды strings становится очевидной, когда вы комбинируете ее с другими командами Linux. Давайте рассмотрим несколько полезных комбинаций:

Поиск потенциально жестко закодированных учетных данных

Аудиторы безопасности часто используют strings для поиска жестко закодированных учетных данных в бинарных файлах:

## Create a sample program with "credentials"
cat > credentials_example.c << EOF
#include <stdio.h>

int main() {
    char* username = "admin";
    char* password = "supersecret123";
    
    printf("Connecting with credentials...\n");
    return 0;
}
EOF

## Compile the program
gcc credentials_example.c -o credentials_example

Теперь поищем потенциальные пароли:

strings credentials_example | grep -i 'password\|secret\|admin\|user\|login'

Возможно, будет выведено следующее:

admin
supersecret123
password

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

Анализ типов файлов

Команда strings может помочь определить тип файла, когда расширение отсутствует или вводит в заблуждение:

## Create a PNG file without the correct extension
cp /usr/share/icons/Adwaita/16x16/places/folder.png mystery_file

Теперь используем strings для поиска подсказок о типе файла:

strings mystery_file | grep -i 'png\|jpeg\|gif\|image'

Возможно, вы увидите вывод, похожий на следующий:

PNG
IHDR
pHYs
iDOT

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

Использование strings с смещениями в файле

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

## Create a sample binary file
cat > offset_example.bin << EOF
This is at the beginning of the file.
EOF

## Add some binary data
dd if=/dev/urandom bs=100 count=1 >> offset_example.bin 2> /dev/null

## Add another string
echo "This is in the middle of the file." >> offset_example.bin

## Add more binary data
dd if=/dev/urandom bs=100 count=1 >> offset_example.bin 2> /dev/null

## Add a final string
echo "This is at the end of the file." >> offset_example.bin

Теперь используем strings с опцией -t, чтобы увидеть смещения:

strings -t d offset_example.bin

Опция -t d показывает смещения в десятичном формате. Ваш вывод может выглядеть так:

         0 This is at the beginning of the file.
       137 This is in the middle of the file.
       273 This is at the end of the file.

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

Пример исследования: анализ сетевого трафика

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

## Create a simulated network packet with HTTP data
cat > http_packet.bin << EOF
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
EOF

## Add some binary header and footer to simulate packet framing
dd if=/dev/urandom bs=20 count=1 > packet_header.bin 2> /dev/null
dd if=/dev/urandom bs=20 count=1 > packet_footer.bin 2> /dev/null

## Combine them into a complete "packet"
cat packet_header.bin http_packet.bin packet_footer.bin > captured_packet.bin

Теперь проанализируем этот "захваченный пакет" с помощью strings:

strings captured_packet.bin

Ваш вывод должен включать HTTP-запрос:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml

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

Резюме продвинутого использования

Техники, которые вы узнали на этом этапе, демонстрируют универсальность команды strings для продвинутых приложений:

  1. Комбинирование strings с grep для поиска определенных шаблонов.
  2. Использование strings для определения типов файлов.
  3. Работа со смещениями в файле для точного бинарного анализа.
  4. Извлечение читаемых данных из смешанного бинарного содержимого, такого как сетевые пакеты.

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

Резюме

В этом практическом занятии вы изучили команду Linux strings и узнали, как использовать ее для извлечения читаемого текста из бинарных файлов. Основные аспекты, рассмотренные в этом занятии, включают:

  1. Цель команды strings - извлекать последовательности символов, читаемые человеком, из бинарных файлов. Это полезно для анализа исполняемых файлов, библиотек и других не-текстовых файлов.

  2. Базовое использование команды strings, включая опции, такие как -n для указания минимальной длины строки и -t для отображения смещений в файле.

  3. Применение команды strings для анализа различных типов бинарных файлов, включая системные библиотеки и исполняемые файлы приложений.

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

  5. Продвинутые способы использования, включая комбинирование strings с другими командами, такими как grep, для целевого анализа, определение типов файлов и анализ сетевого трафика.

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

Сводка по командам Linux